2014-04-10 108 views
0

我不明白。快速结账的贝宝,为什么有三种方法来完成付款?

就我目前所知,有三种必须的方法才能完成完整的交易。

  1. SetExpressCheckout 有道理,我创建它的项目和所有付款,然后将用户重定向到我收到的响应redirecturi。

  2. GetExpressCheckoutDetails 该方法应该位于SetExpressCheckout的returnurl指定的url上。通过让这来自贝宝并使用它来调用这个方法的道理,我们可以得到付款人的ID,我们将用它来调用的最后方法DoExpressCheckoutPayment

  3. DoExpressCheckoutPayment 该方法需要令牌和计费用户标识,我们现在都有。它还要求付款和付款项目才能真正完成交易。

现在我的问题是:

  1. 在我RETURNURL,我打电话都GetExpressCheckoutDetails然后DoExpressCheckoutPayment。现在 - 我能否始终坚持一切都是正确的,并且在调用这两件事情时交易将会通过?我在想,如果用户没有足够的资金,也许Paypal不会继续使用returnurl?

  2. 为什么我们需要在DoExpressCheckoutPayment中再次指定付款项目?当我们已经在SetExpressCheckout中完成时?

我很习惯其他支付网关,只需启动付款 - >重定向到支付网关 - >完成。当交易完成后,他们在那里进行回拨,然后我可以设置完成的订单并将物品交付给用户。

我希望有人能澄清事情对我来说,一劳永逸(有关于这个这么多similiar问题)

更新

$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 
     (
     ) 

回答

1

你对其他支付网关的解释基本上是PayPal Payments Standard。一种非常基本的HTML表单,它将用户发送到他们登录的网关或输入cc详细信息以完成付款并完成。然后,您可以设置IPN以接收有关该事务的数据并自动执行后面提到的后处理任务。

Express Checkout更先进。它使用实际的API,并提供了更多的自由来整合事情,以满足您的需求。

首先,GetExpressCheckoutDetails是可选的。当您调用SetExpressCheckout并重定向到PayPal时,您可以使用该重定向URL上的“useraction”参数来更改体验。如果你使用useraction = commit,那么会发生两件事情。

  • 贝宝查看页面上的按钮,将改变从“继续”,“支付”
  • 的PayerID将返回一个URL参数时,贝宝将用户返回到您的网站。这可以让你直接跳到DoExpressCheckoutPayment,如果你想。

作为该功能的一部分,您还可以使用setup a callback that communicates with PayPal's review page。他们的评论页面会将买方的送货地址和商品详情发送回您的脚本。您的脚本可以获取该数据,使用该数据计算运费选项,然后将运费和税务详细信息返回到PayPal评论页面。 PayPal页面更新了一个下拉列表,该列表将填充您的脚本返回的结果,以便用户可以使用PayPal评论完成整个订单,并且不需要在自己的网站上构建另一个评论。

至于DoExpressCheckoutPayment,如果您在该请求中包含USESESSIONPAYMENTDETAILS参数,它将使用您通过SetExpressCheckout发送的详细信息,因此您不必再次包含它。

GECD和DECP确实可能出错,所以您总是希望通过错误处理来运行,并相应地记录日志。有些情况下,PayPal页面上选择的资金不起作用,PayPal actually builds in a way to circle back around and handle that基于您将返回的特定错误代码。

希望有帮助!

+0

可以说我不使用useraction = commit - paypal有什么想法?创建订单 - >重定向到PayPal - >返回商家网站审查订单? (但不是快速结账,所以你不会回到商家店铺,直到你完成完成?) - 因为我仍然不明白getExpressCheckoutDetails部分,为什么它有 – Karem

+1

定期流程将包括用户被发送到PayPal登录或输入cc详细信息,然后查看订单并单击继续。那时他们会被送回你的网站。您将使用GECD获取送货地址,以便您可以计算可能需要应用的送货/税款,并在致电DECP完成整件事之前向买方显示最终评估页。 –

+0

非常好的解释!所以我使用了useraction = commit,所以即使我有USESESSIONPAYMENTDETAILS和token,payerid提供时,我仍然可以直接调用DoExpressCheckoutPayment:Order total is missing? – Karem