我在我的网站上使用PayPal自适应付款(并行),我在同一个发件人的两个不同浏览器标签中遇到了两个付款的奇怪问题。类似的问题是asked before,但没有人回答。
重现问题的方案
PayPal自适应付款似乎只支持一位发件人的一笔交易。
工作原理
该网站使用Ruby on Rails,我使用paypal_adaptive gem进行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
我删除了一些不重要的代码,只是为了清楚,它是如何工作的。
提前感谢您的帮助!
答案 0 :(得分:1)
看起来像是设计的。我在PayPal的一名员工the website上尝试了同样的测试,并且可以在那里重现。
PayPal的支持回答了我使用Lightbox的问题。但是我已经尝试过迷你浏览器和弹出选项,正如我在帖子中描述的那样,没有任何影响。
此外,PayPal的支持回答我这是设计原因并建议我与技术支持联系。也许它会对其他人有用。
嗨迈克尔,谢谢,是的,我也能够重现它。然而 重要的是要了解PayPal不是为处理2而制作的 付款同时流动。如果你想进一步了解, 您可以联系我们的技术支持:https://ppmts.custhelp.com/ 他们有其他调试工具,可能会给你一个更好的 了解技术问题。
最后,我使用HTML5本地存储中的特殊标记和dgFlow.isOpen()
PAYPAL.apps.DGFlow
对象方法阻止了同时付款,以检测PayPal窗口。在窗口关闭时,我使用onunload
的{{1}}和onbeforeunload
事件重置此标记。
我关闭了这个问题。感谢。