我不明白。
据我目前所知,要完成一笔完整的交易,有三种必备方法。
-
SetExpressCheckout有道理的是,我创建了一个包含所有项目的支付,然后将用户重定向到我在响应中收到的重定向URI。
-
GetExpressCheckout详细信息此方法应位于SetExpressCheckout的returnurl上指定的url上。通过获取来自贝宝的TOKEN并使用它来调用此方法,我们可以获得Payer ID,我们将使用它来呼叫最终方法DoExpressCheckoutPayment
-
DoExpressCheckoutPayment这种方法需要一个TOKEN和PAYER ID,我们现在都有了。它还需要付款和付款项目,才能真正完成交易。
现在我的问题是:
-
在我的returnurl上,我同时调用GetExpressCheckoutDetails和DoExpressCheckoutPayment。现在,我可以一直说一切都是正确的吗?当调用这两个时,交易会通过吗?我在想,如果用户资金不足,Paypal可能不会继续使用returnurl?
-
为什么我们需要在DoExpressCheckoutPayment中再次指定付款项目?我们什么时候已经在SetExpressCheckout中完成了?
我已经习惯了其他只需启动支付->重定向到支付网关->完成的支付网关。然后,当交易真正完成时,他们会进行回调,然后我可以将订单设置为已完成,并将项目交付给用户。
我希望有人能一劳永逸地为我澄清事情(关于这件事有很多类似的问题)
更新
$DECPFields = array(
'token' => $_GET['token'], // Required. A timestamped token, the value of which was returned by a previous SetExpressCheckout call.
'payerid' => $_GET['PayerID'], // Required. Unique PayPal customer id of the payer. Returned by GetExpressCheckoutDetails, or if you used SKIPDETAILS it's returned in the URL back to your RETURNURL.
'returnfmfdetails' => '1', // Flag to indiciate whether you want the results returned by Fraud Management Filters or not. 1 or 0. 'allowedpaymentmethod' => 'InstantPaymentOnly', // The payment method type. Specify the value InstantPaymentOnly.
'buttonsource' => '', // ID code for use by third-party apps to identify transactions in PayPal.
'USESESSIONPAYMENTDETAILS' => '1'
);
$PayPalRequest = array(
'DECPFields' => $DECPFields
);
$decp = $PayPal -> DoExpressCheckoutPayment($PayPalRequest);
这是请求/响应
Array
(
[TIMESTAMP] => 2014-04-13T00:14:26Z
[CORRELATIONID] => 7f6dd4f8798aa
[ACK] => Failure
[VERSION] => 112.0
[BUILD] => 10567876
[L_ERRORCODE0] => 10400
[L_SHORTMESSAGE0] => Transaction refused because of an invalid argument. See additional error messages for details.
[L_LONGMESSAGE0] => Order total is missing.
[L_SEVERITYCODE0] => Error
[ERRORS] => Array
(
[0] => Array
(
[L_ERRORCODE] => 10400
[L_SHORTMESSAGE] => Transaction refused because of an invalid argument. See additional error messages for details.
[L_LONGMESSAGE] => Order total is missing.
[L_SEVERITYCODE] => Error
)
)
[PAYMENTS] => Array
(
)
您对其他支付网关的解释本质上就是PayPal Payments Standard。一个非常基本的HTML表单,它将用户发送到网关,用户在那里登录或输入cc详细信息以完成支付,然后就完成了。然后,您可以设置IPN来接收有关该事务的数据,并像您提到的那样自动化后处理任务。
快速结账更高级。它使用了实际的API,并提供了更多的自由来集成您想要的东西来满足您的需求。
首先,GetExpressCheckoutDetails是可选的。当你调用SetExpressCheckout然后重定向到PayPal时,你可以使用重定向URL上的"useraction"参数来改变体验。如果使用useraction=commit,则会发生两件事。
- PayPal评论页面上的按钮将从"继续"更改为"支付"
- 当PayPal将用户发送回您的网站时,PayerID将作为URL参数返回。这允许您直接跳到DoExpressCheckoutPayment,如果您愿意的话
作为该功能的一部分,您还可以设置一个与PayPal的评论页面通信的回调。他们的评论页面会将买家的发货地址和商品详细信息张贴回您的脚本中。您的脚本可以获取这些数据,计算运输选项,并将运输和税务详细信息返回到PayPal审查页面。PayPal页面更新了一个下拉列表,其中填充了脚本返回的结果,这样用户就可以使用PayPal评论完成整个订单,而无需在自己的网站上构建另一个评论。
至于DoExpressCheckoutPayment,如果您在该请求中包含USESESSIONPAYMENTDETAILS参数,它将使用您通过SetExpressCheckout发送的详细信息,这样您就不必再次包含所有信息。
GECD和DECP确实可能出现问题,所以您总是希望运行错误处理并相应地进行日志记录。在某些情况下,在PayPal页面上选择的资金不起作用,而PayPal实际上是以一种循环的方式构建的,并根据您返回的特定错误代码进行处理。
希望能有所帮助!