PayPal 自适应付款:在两个浏览器选项卡中来自一个发件人的两次付款

Posted

技术标签:

【中文标题】PayPal 自适应付款:在两个浏览器选项卡中来自一个发件人的两次付款【英文标题】:PayPal Adaptive Payments: two payments from one sender in two browser tabs 【发布时间】:2013-11-08 16:26:20 【问题描述】:

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

重现问题的场景

    用户打开网站的第一个浏览器标签并开始向第一个卖家付款。 出现带有登录按钮的 PayPal 灯箱。 用户打开网站的第二个浏览器标签并开始向第二个卖家付款。 PyaPal 的带有登录按钮的灯箱再次出现。 用户返回到第一个浏览器标签并登录到 PayPal。 在第一个浏览器标签中登录 PayPal 后,用户会看到第二个卖家的付款详情。第二个浏览器标签中登录 PayPal 后,用户会看到第二个卖家的付款详情。

PayPal Adaptive Payments 似乎只支持来自一位发件人的一笔交易。

工作原理

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

    用户点击网站上的购买按钮。客户端发出 AJAX 请求,由 Ruby on Rails 中的支付控制器处理。 在控制器中,应用使用 paypal_adaptive gem 将 Pay request 发送到 PayPal API 并接收 PayKey(请参见下面的代码)。 服务器使用 PayKey 响应客户端,客户端以 PayPal 形式使用它通过 PayPal 的灯箱开始付款流程(请参见下面的代码)。

就是这样。之后我什么都控制不了(支付过程通过 PayPal 的外部网页)。

补充说明

    我确定在上面列出的测试场景中,支付请求的数据在服务器端是不同的。 除了 PayPal 的灯箱外,我还尝试了不同的 PayPal 对话框选项:迷你浏览器和弹出窗口。这些选项不会影响此错误,并且仍然可以重现。

客户端代码

<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】:

看起来这是设计使然。我在the website 的一位 PayPal 员工上尝试了相同的测试,并且可以在那里重现。

PayPal 的支持回答了我使用 Lightbox 的问题。但是,我已经尝试了 Mini-Browser 和 Popup 选项,正如我在帖子中描述的那样,但没有任何效果。

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

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

最后,我使用 html5 本地存储中的特殊标志和 PAYPAL.apps.DGFlow 对象的 dgFlow.isOpen() 方法来检测 PayPal 窗口来阻止同时付款。在窗口关闭时,我使用 windowonunloadonbeforeunload 事件重置此标志。

我关闭这个问题。谢谢。

【讨论】:

以上是关于PayPal 自适应付款:在两个浏览器选项卡中来自一个发件人的两次付款的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PayPal 向商家请求和发送付款(自适应付款?)

预先批准的付款(自适应付款)和非账户

PayPal 自适应付款登录失败

Paypal 自适应付款 - 完成付款

为啥我不能再使用 Paypal 自适应付款?

模式窗口中的PayPal自适应付款?