【问题标题】:PayPal TransactionID missing from GetExpressCheckoutDetails responseGetExpressCheckoutDetails 响应中缺少 PayPal TransactionID
【发布时间】:2014-12-04 22:53:35
【问题描述】:

我正在使用带有有效令牌的 PayPal 的 GetExpressCheckoutDetails 调用来尝试提取已提交交易的详细信息。但是,返回的值只是 PayPal 所说的应该根据下面 URL 中列出的文档返回的内容的一个很小的子集。

https://developer.paypal.com/docs/classic/api/merchant/GetExpressCheckoutDetails_API_Operation_NVP/

有人知道为什么 PayPal 没有返回完整的数据集吗?在这种情况下,我不太关心其中的大部分内容,但我们需要交易 ID,在文档中列为 PAYMENTREQUEST_n_TRANSACTIONID,以便我们可以将数据库中的交易与 PayPal 的交易历史记录相匹配。

paypalfunctions.php(相关函数)

function GetShippingDetails( $token ) {
    $nvpstr="&TOKEN=" . $token;
    $resArray=hash_call("GetExpressCheckoutDetails",$nvpstr);
    $ack = strtoupper($resArray["ACK"]);
    if($ack == "SUCCESS" || $ack=="SUCCESSWITHWARNING") {   
        $_SESSION['payer_id'] = $resArray['PAYERID'];
        } 
    return $resArray;
    }

function hash_call($methodName,$nvpStr) {
    global $API_Endpoint, $version, $API_UserName, $API_Password, $API_Signature;
    global $USE_PROXY, $PROXY_HOST, $PROXY_PORT;
    global $gv_ApiErrorURL;
    global $sBNCode;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$API_Endpoint);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POST, 1);

    if($USE_PROXY)
        curl_setopt ($ch, CURLOPT_PROXY, $PROXY_HOST. ":" . $PROXY_PORT); 

    $nvpreq="METHOD=" . urlencode($methodName) . "&VERSION=" . urlencode($version) . "&PWD=" . urlencode($API_Password) . "&USER=" . urlencode($API_UserName) . "&SIGNATURE=" . urlencode($API_Signature) . $nvpStr . "&BUTTONSOURCE=" . urlencode($sBNCode);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);

    $response = curl_exec($ch);

    $nvpResArray=deformatNVP($response);
    $nvpReqArray=deformatNVP($nvpreq);
    $_SESSION['nvpReqArray']=$nvpReqArray;

    if (curl_errno($ch)) {
        $_SESSION['curl_error_no']=curl_errno($ch) ;
        $_SESSION['curl_error_msg']=curl_error($ch);
        } else {
        curl_close($ch);
        }

    return $nvpResArray;
    }

function deformatNVP($nvpstr) {
    $intial=0;
    $nvpArray = array();

    while(strlen($nvpstr)) {
        $keypos= strpos($nvpstr,'=');
        $valuepos = strpos($nvpstr,'&') ? strpos($nvpstr,'&'): strlen($nvpstr);

        $keyval=substr($nvpstr,$intial,$keypos);
        $valval=substr($nvpstr,$keypos+1,$valuepos-$keypos-1);
        $nvpArray[urldecode($keyval)] =urldecode( $valval);
        $nvpstr=substr($nvpstr,$valuepos+1,strlen($nvpstr));
        }
    return $nvpArray;
    }

ExpressCheckoutReceipt.php

session_start();
ini_set( "session.bug_compat_warn", "off" );
require_once("paypalfunctions.php");

if ( isset( $_GET['token'] ) ) {
    $token = $_GET['token'];
    }

if ( $token != "" ) {
    $resArray = GetShippingDetails( $token );
    echo "<pre>";
    var_dump( $resArray );
    echo "</pre>";
    } else {
    echo "Error: Transaction Incomplete";
    }

返回的数组(已删除真实信息)

如您所见,此返回的数组不包含事务 ID。事实上,PayPal 声称将返回的所有较新的 n 类型变量都丢失了。

    array(21) {
["TOKEN"]=>
  string(20) "EC-XXXXXXXXXXXXXXXXX"
  ["TIMESTAMP"]=>
  string(20) "2014-12-04T22:10:46Z"
  ["CORRELATIONID"]=>
  string(13) "XXXXXXXXXXXXXXX"
  ["ACK"]=>
  string(7) "Success"
  ["VERSION"]=>
  string(3) "2.3"
  ["BUILD"]=>
  string(8) "14086142"
  ["EMAIL"]=>
  string(31) "test@test.com"
  ["PAYERID"]=>
  string(13) "XXXXXXXXXXXXX"
  ["PAYERSTATUS"]=>
  string(8) "verified"
  ["BUSINESS"]=>
  string(25) "TestCo"
  ["FIRSTNAME"]=>
  string(9) "Test"
  ["LASTNAME"]=>
  string(6) "Test"
  ["COUNTRYCODE"]=>
  string(2) "US"
  ["SHIPTONAME"]=>
  string(25) "Test Test"
  ["SHIPTOSTREET"]=>
  string(20) "123 Test St."
  ["SHIPTOCITY"]=>
  string(6) "Test City"
  ["SHIPTOSTATE"]=>
  string(2) "CA"
  ["SHIPTOZIP"]=>
  string(5) "33333"
  ["SHIPTOCOUNTRYCODE"]=>
  string(2) "US"
  ["SHIPTOCOUNTRYNAME"]=>
  string(13) "United States"
  ["ADDRESSSTATUS"]=>
  string(9) "Confirmed"
}

谢谢!

【问题讨论】:

    标签: php paypal express-checkout


    【解决方案1】:

    如果您可以在 getShippingDetails() 的函数中读取 cmets,它会显示 the authorization is not a completed transaction at this state - the buyer still needs an additional step to finalize the transaction

            //'--------------------------------------------------------------
            //' At this point, the buyer has completed authorizing the payment
            //' at PayPal.  The function will call PayPal to obtain the details
            //' of the authorization, incuding any shipping information of the
            //' buyer.  Remember, the authorization is not a completed transaction
            //' at this state - the buyer still needs an additional step to finalize
            //' the transaction
            //'--------------------------------------------------------------
    

    所以你还需要在这之后调用ConfirmPayment()方法,这将在函数中调用DoExpressCheckoutPayment

    【讨论】:

    • 就是这样!非常感谢!我不知道我是怎么错过的,但是在此之后我添加了对 DoExpressCheckoutPayment 的调用(使用 ConfirmPayment 函数),现在一切都到位了 - TransactionID 返回,虽然仍然不是 PayPal 谈论的格式 - 该文档页面必须做别的事。
    • 您需要查看thisDoExpressCheckoutPayment 文档。很高兴为您提供帮助。
    【解决方案2】:

    您是否通过先完成 DoExpressCheckout 操作完成了 Express Checkout 交易? PayPal 中的每笔交易都需要先完成,然后才能发出交易 ID。在这种情况下,需要先运行 DoExpressCheckout,然后才能在 GetExpressCheckout 详细信息中获取交易 ID。

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 2018-11-16
      • 2015-09-01
      • 2013-09-16
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 2015-04-08
      相关资源
      最近更新 更多