PayPal自适应支付:一个发件人在两个浏览器选项卡中进行两次支付

PayPal自适应支付:一个发件人在两个浏览器选项卡中进行两次支付,paypal,payment-gateway,payment,paypal-adaptive-payments,Paypal,Payment Gateway,Payment,Paypal Adaptive Payments,我在我的网站上使用PayPal自适应支付(并行),我遇到了一个奇怪的问题,同一个发件人在两个不同的浏览器选项卡中进行了两次支付。类似的问题是,但没有人回答 重现问题的场景 用户打开网站的第一个浏览器选项卡,并开始向第一个卖家付款 PayPal的带有登录按钮的灯箱出现 用户打开网站的第二个浏览器选项卡,并开始向第二个卖家付款 再次出现PyaPal的带有登录按钮的lightbox 用户返回到第一个浏览器选项卡并登录到PayPal 在第一个浏览器选项卡中登录PayPal后,用户将看到第二个卖家的付款详

我在我的网站上使用PayPal自适应支付(并行),我遇到了一个奇怪的问题,同一个发件人在两个不同的浏览器选项卡中进行了两次支付。类似的问题是,但没有人回答

重现问题的场景

  • 用户打开网站的第一个浏览器选项卡,并开始向第一个卖家付款
  • PayPal的带有登录按钮的灯箱出现
  • 用户打开网站的第二个浏览器选项卡,并开始向第二个卖家付款
  • 再次出现PyaPal的带有登录按钮的lightbox
  • 用户返回到第一个浏览器选项卡并登录到PayPal
  • 在第一个浏览器选项卡中登录PayPal后,用户将看到第二个卖家的付款详细信息
  • 在第二个浏览器选项卡中登录PayPal后,用户将看到第二个卖家的付款详细信息
  • PayPal自适应支付似乎只支持来自一个发件人的一笔交易

    它的工作原理

    该网站使用Ruby on Rails,我使用PayPal进行支付。支付流程非常简单:

  • 用户点击网站上的购买按钮。客户端发出AJAX请求,由rubyonrails中的支付控制器处理
  • 在控制器中,应用程序使用PayPal_adaptive gem创建PayPal API并接收PayKey(参见下面的代码)
  • 服务器用PayKey响应客户端,客户端以PayPal的形式使用它,通过PayPal的lightbox启动支付过程(请参见下面的代码)
  • 就这样。之后,我不控制任何事情(付款过程通过贝宝的外部网页进行)

    附加注释

  • 我确信在上面列出的测试场景中,支付请求的数据在服务器端是不同的
  • 除了PayPal的lightbox外,我还尝试了不同的PayPal对话框选项:迷你浏览器和弹出窗口。这些选项对这个bug没有影响,它仍然可以复制
  • 客户端代码

    
    var dgFlow=new PAYPAL.apps.dgFlow({trigger:“PAYPAL submit”,expType:“light”});
    函数MyEmbeddedFlow(嵌入式流){
    this.embeddedpobj=嵌入式流量;
    this.paymentSuccess=函数(paymentStatus){
    this.embeddedpobj.closeFlow();
    //更多用户界面代码在这里。。。
    };
    this.paymentcancelled=函数(){
    this.embeddedpobj.closeFlow();
    //更多用户界面代码在这里。。。
    };
    }
    var myEmbeddedPaymentFlow=新的MyEmbeddedFlow(dgFlow);
    
    服务器代码

    #向PayPal API发出付款请求。
    paypal\u payment\u thread=thread.new do
    #这里有一些准备代码。。。
    pay_request=PaypalAdaptive::request.new
    进程\u guid=SecureRandom.uuid
    #构造支付API请求数据。
    数据={
    :returnUrl=>“#{PAYPAL_RETURN_URL}?进程_guid=#{process_guid}”,
    :cancelUrl=>“#{PAYPAL_CANCEL_URL}?进程_guid=#{process_guid}”,
    :requestEnvelope=>{
    :errorLanguage=>“en_US”
    },
    :currencyCode=>“USD”,
    :receiverList=>{
    :receiver=>[{
    #两次付款的卖家\贝宝价值不同。
    #但事实上,两次付款都是我们最后一次付款。
    :email=>seller\u paypal,
    :金额=>订单\卖方\金额,
    :paymentType=>“数字商品”
    }, {
    :email=>PAYPAL\u MARKETPLACE\u email,
    :金额=>订单\市场\金额,
    :paymentType=>“数字商品”
    }]
    },
    :actionType=>“支付”,
    :ipnNotificationUrl=>PAYPAL\u NOTIFY\u URL,
    :reverseAllParallelPaymentsOnError=>“true”,
    :trackingId=>进程\u guid
    }
    #发出付费API请求。
    支付响应=支付请求。支付(数据)
    如果你成功了?
    #一切都好。在此更新数据库。。。
    其他的
    引发异常::PaypalPaymentError
    结束
    结束
    
    我删除了一些不重要的代码,只是为了弄清楚它到底是如何工作的


    提前感谢您的帮助

    看起来是故意的。我在PayPal的一名员工身上做过同样的测试,在那里可以复制

    PayPal的支持人员回答我,使用Lightbox的问题。然而,正如我在文章中描述的那样,我尝试了迷你浏览器和弹出选项,但没有效果

    另外,PayPal的技术支持部门回答我这是设计的,并建议我联系技术支持部门。也许它会对其他人有用

    嗨,迈克尔,谢谢,是的,我也能复制它。然而 重要的是要了解贝宝不是为处理2 付款同时流动。如果你想更进一步, 您可以联系我们的技术支持: 他们还有其他工具要调试,也许可以给你更好的解决方案 对技术问题的理解

    最后,我在HTML5本地存储和
    dgFlow.isOpen()。在窗口关闭时,我使用
    onunload
    onbeforeuload
    窗口的
    事件重置此标志

    我结束这个问题。谢谢