快速结账的基本PayPal沙盒授权和捕获逻辑


Basic Paypal Sandbox Authorization and Capture Logic for Express Checkout

我不理解或文档部分错误。这是我第一次做基本 IPN 响应之外的事情。

我有一个开发人员帐户,其中包含包括签名在内的所有凭据。我的整个网站都是PHP,我希望使用一个函数进行所有PayPal授权和捕获。我现在正在编写这个函数,只有以下非动态功能

function testHandler()
{
    if ( function_exists('get_magic_quotes_gpc') ) { $get_magic_quotes_exists = true; }
    $req = '';
    $myPost = array(
    'USER'                          => 'USER',
    'PWD'                           => 'PASSWORD',
    'SIGNATURE'                     => 'SIGNATURE',
    'METHOD'                        => 'SetExpressCheckout',
    //'METHOD'                        => 'GetExpressCheckoutDetails',
    //'TOKEN' => 'EC-XXXXXXXXXXXX', 
    'VERSION'                       => '95'
    'PAYMENTREQUEST_0_PAYMENTACTION'=> 'Authorization', #Sets up authorization for a single future payment
    'PAYMENTREQUEST_0_AMT'          => '1', #The amount authorized
    'PAYMENTREQUEST_0_CURRENCYCODE' => 'USD', #The currency, e.g. US dollars
    'cancelUrl'                     => 'http://www.yourdomain.com/cancel.html',
    'returnUrl'                     => 'http://www.yourdomain.com/success.html' 
    );
    foreach ( $myPost as $key => $value )
    {
        if ( $get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1 )
        {
            $value = urlencode(stripslashes($value));
        }
        else
        {
            $value = urlencode($value);
        }
        $req .= "&$key=$value";
    }
    $ch = curl_init( 'https://api-3t.sandbox.paypal.com/nvp' );
    curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1) ;
    curl_setopt( $ch, CURLOPT_POST, 1) ;
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $req );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 1 );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
    curl_setopt( $ch, CURLOPT_FORBID_REUSE, 1 );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Connection: Close') );
    if(  !( $res = curl_exec($ch) ) ) { curl_close($ch); exit; }
    curl_close($ch);
    return $res;
}

首先,这是我需要的全部后端吗?提供$myPost的内容是根据我们在此过程中的任何步骤量身定制的。

我已经在我的服务器上运行了这个脚本,它确实返回了一个令牌。我手动输入令牌以模拟被重定向的客户,并且我看到一个空白的结帐页面,这是预期的,因为任何时候都没有传递任何项目详细信息。

https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-XXXXXXXX

在创建令牌(如标准快速结帐变量)时,我是否应该在$myPost中包含订单详细信息? item_name等即使价格已经过去了,为什么没有出现?结帐页面的摘要完全是裸露的。

接下来,需要注释掉$myPost部分来检索带有 GetExpressCheckoutDetails 的付款人 ID。

当我尝试运行该代码步骤时,我得到此响应

TOKEN=EC%2dXXXXXXXXXX&BILLINGAGREEMENTACCEPTEDSTATUS=0&CHECKOUTSTATUS=PaymentActionNotInitiated&TIMESTAMP=2015%2d01%2d12T22%3a47%3a01Z&CORRELATIONID=403d2feb197db&ACK=Success&VERSION=95&BUILD=14726230&CURRENCYCODE=USD&AMT=1%2e00&SHIPPINGAMT=0%2e00&HANDLINGAMT=0%2e00&TAXAMT=0%2e00&INSURANCEAMT=0%2e00&SHIPDISCAMT=0%2e00&PAYMENTREQUEST_0_CURRENCYCODE=USD&PAYMENTREQUEST_0_AMT=1%2e00&PAYMENTREQUEST_0_SHIPPINGAMT=0%2e00&PAYMENTREQUEST_0_HANDLINGAMT=0%2e00&PAYMENTREQUEST_0_TAXAMT=0%2e00&PAYMENTREQUEST_0_INSURANCEAMT=0%2e00&PAYMENTREQUEST_0_SHIPDISCAMT=0%2e00&PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED=false&PAYMENTREQUESTINFO_0_ERRORCODE=0

这是有道理的,因为没有输入付款信息。我是否应该在沙盒期间输入真实的财务信息才能进入下一步?我是否应该从客户那里收集它并在创建令牌时传递它?在哪里可以访问此创建的令牌并强制执行下一步?

如果这是实时的,并且我能够传递项目详细信息,以便结帐页面不为空,则客户将输入他们的详细信息,并在URL中使用其令牌重定向到之后的页面。此时,我可以将令牌与 GetExpressCheckoutDetails 一起使用并检索付款人 ID?有了这个付款人ID,我可以使用DoExpressCheckoutPayment来获取交易ID,以便最终付款捕获?

感谢您的阅读

听起来你已经掌握了它的要点。 Express Checkout 由 3 个独立的 API 调用组成:SetExpressCheckout、GetExpressCheckoutDetails和 DoExpressCheckoutPayment。

SEC 只是该过程的第一步,是的,您可以在调用中包含更多参数,以便显示所有订单数据并按预期使用,如您在前面的链接中看到的那样。

在完成最终的 DECP 调用之前,不会转移任何资金,并且只会保存该请求中包含的详细信息并通过PayPal系统传递。