Я использую вызов 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"}
Спасибо!
Если вы можете прочитать комментарии в функции 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
в функции
Вы завершили транзакцию Express Checkout, сначала выполнив операцию DoExpressCheckout? Каждая транзакция в PayPal должна быть завершена в первую очередь до выдачи идентификатора транзакции. В этом случае необходимо запустить DoExpressCheckout, прежде чем вы сможете получить идентификатор транзакции в деталях GetExpressCheckout.