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 窗口来阻止同时付款。在窗口关闭时,我使用 window
的 onunload
和 onbeforeunload
事件重置此标志。
我关闭这个问题。谢谢。
【讨论】:
以上是关于PayPal 自适应付款:在两个浏览器选项卡中来自一个发件人的两次付款的主要内容,如果未能解决你的问题,请参考以下文章