关于php:Paypal的Express Checkout,为什么要用三种方法完成付款?

Express Checkout for Paypal, why three methods to complete a payment?

我不明白。

据我所知,要完成一项完整的交易,必须使用三种必不可少的方法。

  • SetExpressCheckout
    有道理,我创建了一个包含其中所有项目的付款,然后将用户重定向到我在响应中收到的redirecturi。

  • GetExpressCheckoutDetails
    此方法应位于SetExpressCheckout的returnurl上指定的url上。通过获取来自贝宝的令牌并使用它来调用此方法,我们可以获得付款人ID,该ID将用于调用最终方法DoExpressCheckoutPayment

  • DoExpressCheckoutPayment
    此方法需要我们现在都拥有的令牌和付款者ID。它还需要"付款"和付款项目才能真正完成交易。

  • 现在我的问题是:

  • 在我的returnurl上,我同时调用GetExpressCheckoutDetails和DoExpressCheckoutPayment。现在-我是否总能从中得出所有结论都是正确的,并且调用这两者时交易将通过?我在想,如果用户资金不足,贝宝可能不会继续返回returnurl?

  • 为什么我们需要在DoExpressCheckoutPayment中再次指定所有付款项目?我们何时已经在SetExpressCheckout中做到了?

  • 我已经习惯了其他付款网关,这些付款网关只需要启动付款->重定向到付款网关->完成即可。当交易真正完成时,他们然后在其中进行回调,然后我可以将订单设置为完成并将项目交付给用户。

    我希望有人能一劳永逸地为我澄清问题(对此有很多类似的问题)

    更新

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $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);

    这是请求/响应

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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付款标准。这是一种非常基本的HTML表单,可将??用户发送到他们登录或输入cc详细信息以完成付款的网关。然后,您可以设置IPN来接收有关该事务的数据,并像您提到的那样自动化后处理任务。

    Express Checkout更为高级。它使用实际的API,并提供了更多自由来完全按照您的需要进行集成。

    首先,GetExpressCheckoutDetails是可选的。当您调用SetExpressCheckout然后重定向到PayPal时,可以在该重定向URL上使用" useraction"参数来更改体验。如果使用useraction = commit,则会发生两件事。

    • PayPal审核页面上的按钮将从"继续"更改为"付款"
    • 当PayPal将用户送回您的网站时,PayerID将作为URL参数返回。如果需要,这使您可以直接跳至DoExpressCheckoutPayment。

    作为该功能的一部分,您还可以设置一个与PayPal的审核页面进行通信的回调。他们的评论页面将把买家的收货地址和物品详细信息发布回您的脚本。您的脚本可以获取该数据,并据此计算运输选项,然后将运输和税收详细信息返回到PayPal审核页面。 PayPal页面将更新一个下拉列表,其中会填充您的脚本返回的结果,因此用户可以使用PayPal审核完成整个订单,而您无需在自己的网站上进行其他审核。

    对于DoExpressCheckoutPayment,如果您在该请求中包含USESESSIONPAYMENTDETAILS参数,它将使用与SetExpressCheckout一起发送的详细信息,因此您不必再次将其全部包含在内。

    GECD和DECP确实可能出错,因此您始终希望通过错误处理并进行相应记录。在某些情况下,在PayPal页面上选择的资金无法使用,并且PayPal实际上以一种循环的方式构建,并根据您会得到的特定错误代码处理该资金。

    希望有帮助!