PayPal自适应付款:来自两个浏览器标签中的一个发件人的两笔付款

时间:2013-10-29 13:26:32

标签: paypal payment-gateway payment paypal-adaptive-payments

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

重现问题的方案

  1. 用户打开网站的第一个浏览器标签并开始向第一个卖家的付款流程。
  2. 出现带有登录按钮的PayPal灯箱。
  3. 用户打开网站的第二个浏览器标签,然后开始向第二个卖家付款。
  4. 再次出现PyaPal带登录按钮的灯箱。
  5. 用户返回第一个浏览器标签并登录PayPal。
  6. 第一个浏览器标签中登录PayPal后,用户会看到第二个卖家的付款明细。
  7. 第二个浏览器标签中登录PayPal后,用户会看到第二个卖家的付款明细。
  8. PayPal自适应付款似乎只支持一位发件人的一笔交易。

    工作原理

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

    1. 用户点击网站上的“购买”按钮。客户端发出AJAX请求,由Ruby on Rails中的支付控制器处理。
    2. 在控制器中,应用使用paypal_adaptive gem向PayPal API发送Pay request并收到PayKey(请参阅下面的代码)。
    3. 服务器使用PayKey响应客户端,客户端使用PayPal表单通过PayPal的灯箱开始付款流程(请参阅下面的代码)。
    4. 就是这样。之后,我不控制任何事情(付款流程通过PayPal的外部网页)。

      附加说明

      1. 我确信上面列出的测试方案中服务器端的Pay请求数据不同。
      2. 除了PayPal的灯箱之外,我尝试了不同的PayPal对话框选项:迷你浏览器和弹出窗口。这些选项不会影响此错误,并且仍然可以重现。
      3. 客户端代码

        <script src="https://www.paypalobjects.com/js/external/dg.js" type="text/javascript"></script>
        
        <form action="https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay" class="paypal-hidden-form" target="PPDGFrame">
          <button id="paypal-submit"></button>
          <input id="type" type="hidden" name="expType" value="light">
          <!-- Insert PayKey here and click on the form's submit button using jQuery after server's response. -->
          <input id="paypal-key" type="hidden" name="paykey" value="">
        </form>
        
        <!-- Paypal -->
        <script type="text/javascript" charset="utf-8">
            var dgFlow = new PAYPAL.apps.DGFlow({ trigger: "paypal-submit", expType: "light" });
            function MyEmbeddedFlow(embeddedFlow) {
                this.embeddedPPObj = embeddedFlow;
                this.paymentSuccess = function(paymentStatus) {
                    this.embeddedPPObj.closeFlow();
                    // More UI code here...
                };
                this.paymentCanceled = function() {
                    this.embeddedPPObj.closeFlow();
                    // More UI code here...
                };
            }
            var myEmbeddedPaymentFlow = new MyEmbeddedFlow(dgFlow);
        </script>
        

        服务器代码

        # Make a Pay request to PayPal API.
        paypal_payment_thread = Thread.new do
          # Some preparation code goes here...
        
          pay_request = PaypalAdaptive::Request.new
          process_guid = SecureRandom.uuid
        
          # Construct Pay API request data.
          data = {
            :returnUrl => "#{PAYPAL_RETURN_URL}?process_guid=#{process_guid}",
            :cancelUrl => "#{PAYPAL_CANCEL_URL}?process_guid=#{process_guid}",
            :requestEnvelope => {
              :errorLanguage => "en_US"
            },
            :currencyCode => "USD",
            :receiverList => {
              :receiver => [{
                # seller_paypal value is different for two payments.
                # But in fact we do the last payment for both payments.
                :email => seller_paypal,
                :amount => ORDER_SELLER_AMOUNT,
                :paymentType => "DIGITALGOODS"
              }, {
                :email => PAYPAL_MARKETPLACE_EMAIL,
                :amount => ORDER_MARKETPLACE_AMOUNT,
                :paymentType => "DIGITALGOODS"
              }]
            },
            :actionType => "PAY",
            :ipnNotificationUrl => PAYPAL_NOTIFY_URL,
            :reverseAllParallelPaymentsOnError => "true",
            :trackingId => process_guid
          }
        
          # Make a Pay API request.
          pay_response = pay_request.pay(data)
        
          if pay_response.success?
            # Everything is ok. Update database here...
          else
            raise Exceptions::PaypalPaymentError
          end
        end
        

        我删除了一些不重要的代码,只是为了清楚,它是如何工作的。

        提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

看起来像是设计的。我在PayPal的一名员工the website上尝试了同样的测试,并且可以在那里重现。

PayPal的支持回答了我使用Lightbox的问题。但是我已经尝试过迷你浏览器和弹出选项,正如我在帖子中描述的那样,没有任何影响。

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

  

嗨迈克尔,谢谢,是的,我也能够重现它。然而   重要的是要了解PayPal不是为处理2而制作的   付款同时流动。如果你想进一步了解,   您可以联系我们的技术支持:https://ppmts.custhelp.com/   他们有其他调试工具,可能会给你一个更好的   了解技术问题。

最后,我使用HTML5本地存储中的特殊标记和dgFlow.isOpen() PAYPAL.apps.DGFlow对象方法阻止了同时付款,以检测PayPal窗口。在窗口关闭时,我使用onunload的{​​{1}}和onbeforeunload事件重置此标记。

我关闭了这个问题。感谢。