2011-12-23 2 views
4

Я работаю с веб-сайтом электронной коммерции, который использует компонент проверки PayPal, написанный на PHP. Для целей бухгалтерского учета я хочу получить некоторую дополнительную информацию с помощью API SOAP API PayPal.Как получить идентификатор транзакции PayPal из счета-фактуры ID

я узнал, как получить доступ к транзакции с использованием идентификатора транзакции и GetTransactionDetails объекта:

// 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 - 

Однако мне нужно усилить это так, что я могу узнать 12-символьная строка идентификатор транзакции сначала используя идентификатор счета, который я имею в локальной базе данных MySQL (на которую также ссылается транзакция на веб-сайте PayPal).

Я предполагаю, что для этого мне нужно использовать Transaction Search, но я не знаю, как это сделать с помощью PHP SOAP API. Как я могу получить идентификатор транзакции для идентификатора счета?

+0

Чтобы уточнить, у вас есть свой идентификатор счета, но у вас нет идентификатора транзакции с плательщиком? –

+0

Да, точно. У меня есть идентификатор счета, который, насколько мне известно, генерируется компонентом PHP при оформлении заказа. Мне нужен идентификатор транзакции, который PayPal генерирует для транзакции. – hbit

+0

Создает ли ваше приложение идентификатор счета или вы получаете эту информацию из PayPal? –

ответ

3

Я нырнул в документации API и удалось найти его.

// 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('Y-m-d\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 - 
2

Достаточно просто использовать TransactionSearch API для поиска транзакции по номеру счета-фактуры. Все, что вам нужно сделать, это отправить параметр INVNUM в вызове API в PayPal.

Например (на основе TransactionSearch PHP пример кода PayPal):

<?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; 
} 

До здесь это все, как обычно. Единственные изменения в образце здесь:

// 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"; 

Здесь, установив правильную 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('Y-m-d\T00:00:00\Z', $start_time); 
    $nvpStr .= "&STARTDATE=$iso_start"; 
    } 

if(isset($endDateStr)&&$endDateStr!='') { 
    $end_time = strtotime($endDateStr); 
    $iso_end = date('Y-m-d\T24:00:00\Z', $end_time); 
    $nvpStr .= "&ENDDATE=$iso_end"; 
} 

// Execute the API operation; see the PPHttpPost function above. 
$httpParsedResponseAr = PPHttpPost('TransactionSearch', $nvpStr); 

И здесь, добавив простой, если заявление, чтобы вызвать или не возвращать полный TransactionSearch результат API, или возвращать только PayPal идентификатор транзакции (bla.php вид = минимальное):

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']; 
} 


?> 
+0

Вы определенно захотите изменить это, но это должно по крайней мере начать. – Robert

+0

Ваш ответ работает с API-интерфейсом Name-Value Pair (NVP), а не с SOAP API. Кроме того, большинство из них не имеет отношения к моей проблеме.Я проголосовал за это, так как это помогло мне решить проблему самостоятельно. Благодаря! – hbit

Смежные вопросы