为什么Paypal需要DoExpressCheckoutPayment?

13
我正在尝试构建一个非常简单的基于PayPal的购物车,以便用户可以购买多个物品。 我希望PayPal处理所有付款细节。 我甚至不想要订单确认。 我将手动检查PayPal的订单确认。
起初,我想使用“网站支付标准”,因为它似乎很容易创建一个表单,让表单提交到PayPal,然后让PayPal处理。 但是,这行不通,因为“网站支付标准”按钮/表单不支持提交多个项目。 我在表单中尝试了各种键/值,但从未成功过。
然后,我按照此处找到的说明尝试使用Express Checkout。 它基本上可以工作,但据我所知,在发送SetExpressCheckout之后,您必须等待来自PayPal的请求并执行DoExpressCheckoutPayment以完成交易。 SO参考
我觉得这有点麻烦,因为如果我的服务器无法接收来自PayPal的请求并且我从未发送DoExpressCheckoutPayment会怎么样? 因此,客户认为他们已经完成了提交订单,但是订单从未被接收。
有人知道如何跳过这个“确认”步骤吗? 我觉得这是不必要的,也不确定为什么PayPal需要它。

从技术上讲,“DoExpressCheckoutPayment”仅适用于快速结帐和网站付款专业版API,其他API并不需要或甚至无法使用该功能。 - Kenny Evitt
2个回答

44
那是因为Express Checkout和Website Payments Standard是根本不同的产品。
要使用Express Checkout,您需要调用SetExpressCheckout API。在API调用中,您需要指定产品、金额和RETURNURL的详细信息。
一旦您将此数据发布到PayPal的API端点,您将获得一个令牌作为返回值。 然后,您会将买家重定向,并将令牌附加到以下URL:https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-XXXXXXX 一旦买家同意购买,他会被重定向回RETURNURL指定的URL。
现在,您应该显示订单确认,并调用GetExpressCheckoutDetails API**。
在调用GetExpressCheckoutDetails时,提供令牌。在GetExpressCheckoutDetails API响应中,您将找到一个PayerID。
现在,您已经准备好调用DoExpressCheckoutPayment并向买家收费。在调用DoExpressCheckoutPayment时,请记得同时包括令牌和payerID。
注意:如果您想通过立即调用GetExpressCheckoutDetails和DoExpressCheckoutPayment来立即向买方收费,请将买方重定向到https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-XXXXXXX&useraction=commituseraction = commit 将会把PayPal的“审核您的付款”页面上的“继续”按钮更改为“立即支付”按钮。

--

Express Checkout和Website Payments Standard之间存在如此显著的差异,是因为Website Payments Standard旨在成为一种即插即用的工作解决方案,其中PayPal处理整个交易流程。Express Checkout是一种更灵活的解决方案,允许您将其与网站/购物车的现有结帐流程深度集成。
对于您的用例,请考虑使用PayPal“购物车上传”按钮。请参见以下示例https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_cart_upload
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="business" value="seller@designerfotos.com">
<input type="hidden" name="item_name_1" value="Item Name 1">
<input type="hidden" name="amount_1" value="1.00">
<input type="hidden" name="item_name_2" value="Item Name 2">
<input type="hidden" name="amount_2" value="2.00">
<input type="submit" value="PayPal">
</form> 

请注意,默认情况下这是不安全的,因为您要收取的金额将在HTML中明显可见。
此外,PayerID也会附加在RETURNURL的GET参数中。因此,如果您愿意,可以跳过调用GetExpressCheckoutDetails。

感谢您详细的回复。然而,我从未将网站支付标准等同于快速结帐。如果我这样做了,那就是一个错误。我的主要问题是为什么PayPal需要DoExpressCheckoutPayment,因为这似乎是不必要和误导性的,因为用户已经完成了付款。然而,您提供的多个项目的网站支付标准表单示例有效,这正是我想要的(但它仍然没有回答我的问题)。再次感谢! - vinhboy
3
我知道你没有问,但这解答了你为什么需要使用DoExpressCheckoutPayment的问题 :-)。这是本质所在。快速结帐旨在提供一种介于购物车和订单确认页面之间的支付解决方案。因此需要使用DoExpressCheckoutPayment来完成支付;这使得商家在何时、如何和何地向买家收费方面拥有更大的灵活性,而不是买家立即在PayPal网站上付款。实际付款并不是在买家“同意付款”后就完成了。只有在调用DoEC后才会最终完成付款。 - Robert
1
useraction=commit 有官方文档吗? - panzi
@panzi 你能帮忙吗?我已经找了几个小时了...谢谢! - user492238
显示剩余2条评论

3
为了本网站的目的,PayPal Express Checkout API要求使用DoExpressCheckoutPayment操作。
您说得对,PayPal处理付款并不需要此操作,但在某些情况下,可能需要进行第二次操作。例如,在用户(您网站的客户)在PayPal付款确认时选择送货地址的情况下,您可能需要在用户在PayPal确认页面上选择送货地址后计算实际运费。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接