Php 对于贝宝,为什么要用三种方法来完成付款?

Php 对于贝宝,为什么要用三种方法来完成付款?,php,paypal,Php,Paypal,我不明白 据我目前所知,要完成一项完整的交易,必须有三种方法 SetExpressCheckout 有意义的是,我创建了一个包含所有项目的付款,然后将用户重定向到我在响应中收到的重定向URI GetExpressCheckoutDetails 此方法应位于SetExpressCheckout的returnurl上指定的url上。通过获取来自paypal的令牌并将其用于调用此方法,我们可以获得付款人ID,我们将使用该ID调用最终方法DoExpressCheckoutPayment DoExpres

我不明白

据我目前所知,要完成一项完整的交易,必须有三种方法

  • SetExpressCheckout 有意义的是,我创建了一个包含所有项目的付款,然后将用户重定向到我在响应中收到的重定向URI

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

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

  • 现在我的问题是:

  • 在我的returnurl上,我同时调用GetExpressCheckoutDetails和DoExpressCheckoutPayment。现在-我可以一直从一切都是正确的出发,并在调用这两个时完成交易吗?我在想,如果用户资金不足,Paypal可能不会继续返回URL

  • 为什么我们需要在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
            (
            )
    

    您对其他支付网关的解释本质上是什么。这是一个非常基本的HTML表单,它将用户发送到网关,用户在那里登录或输入cc详细信息以完成支付并完成支付。然后,您可以设置接收有关该事务的数据,并自动执行您提到的后处理任务

    更先进。它使用了实际的API,并提供了更多的自由,可以按照您希望的方式来集成内容,以满足您的需求

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

    • PayPal查看页面上的按钮将从“继续”更改为“支付”
    • PayPal将用户发送回您的站点时,PayRid将作为URL参数返回。如果愿意,可以直接跳到DoExpressCheckoutPayment
    作为该功能的一部分,您还可以。他们的评论页面会将买家的发货地址和商品详细信息发布回您的脚本。您的脚本可以获取该数据,计算运输选项,并将运输和税务详细信息返回到PayPal查看页面。PayPal页面将更新一个下拉列表,该列表将填充脚本返回的结果,这样用户就可以使用PayPal review完成整个订单,而无需在自己的站点上构建另一个review

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

    GECD和DECP确实可能出了问题,所以您总是希望执行错误处理并相应地记录。有些情况下,在PayPal页面上选择的资金不起作用,并且基于您将返回的特定错误代码


    希望有帮助

    假设我不使用useraction=commit——贝宝有什么想法?创建订单->重定向到贝宝->返回商户站点查看订单?(但是express checkout不是为了让你在完成之前不会回到商家商店吗?)-因为我仍然不理解GetExpress checkout细节部分,为什么它会在那里正常的流程包括用户被发送到PayPal登录或输入cc细节,然后查看订单并单击继续。那时它们会被发送回您的站点。您可以使用GECD获取发货地址,这样您就可以计算可能需要应用的发货/税务,并在致电DECP完成整件事情之前向您的买家显示最终审查页面。非常好的解释!所以我使用了useraction=commit,这样即使使用了SessionPaymentDetails和token,我也可以在失败时直接调用DoExpressCheckoutPayment,payerid提供:缺少订单总数?请检查我更新的答案代码。当它应该使用setexpress中的付款详细信息时,我不应该在这个请求中指定合计?好吧,是的,这种方式确实有效,而且也没有那么复杂。因为你已经在秒内完成了,所以在DECP中再做一次基本上是复制/粘贴。特别是如果你在用我的图书馆。