How to get PayPal transaction ID from invoice ID

I work with an e-commerce site that uses the PayPal verification component written in PHP. For accounting purposes, I want more information using the PayPal PHP SOAP API.

I learned how to access a transaction using a transaction ID and a GetTransactionDetails object:

// snip - include PayPal libraries and set up APIProfile object - $trans_details =& PayPal::getType('GetTransactionDetailsRequestType'); $tran_id = $_GET['transactionID']; $trans_details->setTransactionId($tran_id, 'iso-8859-1'); $caller =& PayPal::getCallerServices($profile); $response = $caller->GetTransactionDetails($trans_details); $paymentTransDetails = $response->getPaymentTransactionDetails(); // snip - work with transaction details - 

However, I need to improve this to first find out the 12-character transaction identifier using the account identifier that I have in the local MySQL database (which is also referenced by transactions on the PayPal website).

I assume that you need to use Transaction Search for this, but I do not know how to do this with the PHP SOAP API. How can I get the transaction ID for the account ID?

+4
source share
2 answers

I plunged into the API documentation and was able to find it.

 // snip - include PayPal libraries and set up APIProfile object (variable: profile) - $trans_search =& PayPal::getType('TransactionSearchRequestType'); // 01/12/201 as an example date, we always need a start date for the API $start_date_str = '01/12/2011'; $start_time = strtotime($start_date_str); $iso_start = date('Ymd\T00:00:00\Z', $start_time); $trans_search->setStartDate($iso_start, 'iso-8859-1'); $invoice_ID = '10942456'; // here we insert the invoice ID we know $trans_search->setInvoiceID($invoice_ID); $caller =& PayPal::getCallerServices($profile); $response = $caller->TransactionSearch($trans_search); // execute search $ptsr = $response->getPaymentTransactions(); $nrecs = sizeof($ptsr); $ack = $response->getAck(); if( ($ack != ACK_SUCCESS) && ($ack != ACK_SUCCESS_WITH_WARNING) ) exit; // jump out on error if($nrecs == 1){ // check whether we found only one transaction (as expected) $paymentTransaction = $ptsr[0]; // we found our transaction ID $transID = $paymentTransaction->getTransactionID(); }else{ // invoice ID not unique?! :-( exit('Found multiple transactions: '. print_r($ptsr, true)); // jump out } // snip - work with transaction ID - 
+3
source

It’s easy enough to use the TransactionSearch API to search for a transaction by invoice number. All you have to do is send the INVNUM parameter in the API call to PayPal.

For example (based on the code example of a PayPal TransactionSearch transaction code):

 <?php /** TransactionSearch NVP example; last modified 08MAY23. * * Search your account history for transactions that meet the criteria you specify. */ $environment = 'sandbox'; // or 'beta-sandbox' or 'live' /** * Send HTTP POST Request * * @param string The API method name * @param string The POST Message fields in &name=value pair format * @return array Parsed HTTP Response body */ function PPHttpPost($methodName_, $nvpStr_) { global $environment; // Set up your API credentials, PayPal end point, and API version. $API_UserName = urlencode('xxxxxxxxxxxx'); $API_Password = urlencode('yyyyyyyyy'); $API_Signature = urlencode('zzzzzzzzzzzzzzzzzzzzzzz'); $API_Endpoint = "https://api-3t.paypal.com/nvp"; if("sandbox" === $environment || "beta-sandbox" === $environment) { $API_Endpoint = "https://api-3t.$environment.paypal.com/nvp"; } $version = urlencode('84.0'); // Set the curl parameters. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $API_Endpoint); curl_setopt($ch, CURLOPT_VERBOSE, 1); // Turn off the server and peer verification (TrustManager Concept). 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); // Set the API operation, version, and API signature in the request. $nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_"; // Set the request as a POST FIELD for curl. curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq); // Get response from the server. $httpResponse = curl_exec($ch); if(!$httpResponse) { exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')'); } // Extract the response details. $httpResponseAr = explode("&", $httpResponse); $httpParsedResponseAr = array(); foreach ($httpResponseAr as $i => $value) { $tmpAr = explode("=", $value); if(sizeof($tmpAr) > 1) { $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1]; } } if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) { exit("Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint."); } return $httpParsedResponseAr; } 

Before that, everything is as usual. The only changes to the selection are here:

 // Set request-specific fields. //$transactionID = urlencode('example_transaction_id'); $invoice = urlencode('1234'); // Add request-specific fields to the request string. //$nvpStr = "&TRANSACTIONID=$transactionID"; $nvpStr = "&INVNUM=$invoice"; 

Here, setting the correct STARTDATE:

 // Set additional request-specific fields and add them to the request string. $startDateStr = "01/01/2010"; // in 'mm/dd/ccyy' format $endDateStr; // in 'mm/dd/ccyy' format if(isset($startDateStr)) { $start_time = strtotime($startDateStr); $iso_start = date('Ymd\T00:00:00\Z', $start_time); $nvpStr .= "&STARTDATE=$iso_start"; } if(isset($endDateStr)&&$endDateStr!='') { $end_time = strtotime($endDateStr); $iso_end = date('Ymd\T24:00:00\Z', $end_time); $nvpStr .= "&ENDDATE=$iso_end"; } // Execute the API operation; see the PPHttpPost function above. $httpParsedResponseAr = PPHttpPost('TransactionSearch', $nvpStr); 

And here, adding a simple if statement to activate or not return the full result of the TransactionSearch API or return only the PayPal transaction ID (bla.php? View = minimum):

 if($_GET['view'] != "minimal") { if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) { echo('TransactionSearch Completed Successfully: '.print_r($httpParsedResponseAr, true)); } else { echo('TransactionSearch failed: ' . print_r($httpParsedResponseAr, true)); } } else { // Output only the TransactionID echo $httpParsedResponseAr['L_TRANSACTIONID0']; } ?> 
+2
source

Source: https://habr.com/ru/post/1387744/


All Articles