PayPal TransactionID отсутствует в ответе GetExpressCheckoutDetails

Я использую вызов GetExpressCheckoutDetails PayPal с действительным токеном, чтобы попытаться получить сведения о отправленной транзакции. Однако возвращаемые значения представляют собой очень маленькое подмножество того, что, по словам PayPal, должно быть возвращено в соответствии с их документацией, указанной по указанному ниже URL-адресу.

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

Кто-нибудь знает, почему PayPal не возвращает полный набор данных? В этом случае меня не особо волнует большая часть этого, но нам нужен идентификатор транзакции, указанный в документации как 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";
}

Возвращенный массив (реальная информация удалена)

Как видите, этот возвращаемый массив не содержит идентификатора транзакции. На самом деле все по новее N переменные типа, которые будут возвращены претензиями PayPal, отсутствуют.

    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) "[email protected]"["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"}

Спасибо!

0

Решение

Если вы можете прочитать комментарии в функции getShippingDetails() это говорит 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 в функции

1

Другие решения

Вы завершили транзакцию Express Checkout, сначала выполнив операцию DoExpressCheckout? Каждая транзакция в PayPal должна быть завершена в первую очередь до выдачи идентификатора транзакции. В этом случае необходимо запустить DoExpressCheckout, прежде чем вы сможете получить идентификатор транзакции в деталях GetExpressCheckout.

0

По вопросам рекламы [email protected]