2013-02-08 1 views
0

Я очень новичок в paypal api, я следил за this и адаптировал код к моим потребностям.Идентификатор транзакции недействителен 10609

Я хотел бы сделать основной авторизации & Capture в 3 этапа, но я всегда терпит неудачу в захвате земли

  1. клиентов к paypal_pay_redirect.php для входа в систему PayPal и сделать paymet
  2. Оплата штраф, и мы приземляемся на paypal_success.php, здесь я запрашиваю авторизацию и сохраняю TRANSACTIONID для следующего шага
  3. paypal_capture.php Я использую транзакцию для захвата платежа, но я всегда получаю «10609: Идентификатор транзакции недействителен»

вот код, где ошибка?

благодаря

paypal_lib.php

<?php 
    // code from http://coding.smashingmagazine.com/2011/09/05/getting-started-with-the-paypal-api/ 
class Paypal { 
    /** 
    * Last error message(s) 
    * @var array 
    */ 
    protected $_errors = array(); 

    /** 
    * API Credentials 
    * Use the correct credentials for the environment in use (Live/Sandbox) 
    * @var array 
    */ 
    protected $_credentials = array(
        'USER' => 'xxxxxxxxxxxxxxxxxxxx', 
        'PWD' => 'xxxxxxxxxxxxx', 
        'SIGNATURE' => 'xxxxxxxxxxxxxxxxxxxxxxxxx' 
       ); 
    /** 
    * API endpoint 
    * Live - https://api-3t.paypal.com/nvp 
    * Sandbox - https://api-3t.sandbox.paypal.com/nvp 
    * @var string 
    */ 
    protected $_endPoint = 'https://api-3t.sandbox.paypal.com/nvp'; 

    /** 
    * API Version 
    * @var string 
    */ 
    protected $_version = '74.0'; 

    /** 
    * Make API request 
    * 
    * @param string $method string API method to request 
    * @param array $params Additional request parameters 
    * @return array/boolean Response array/boolean false on failure 
    */ 
    public function request($method,$params = array()) { 
    $this -> _errors = array(); 
    if(empty($method)) { //Check if API method is not empty 
     $this -> _errors = array('API method is missing'); 
     return false; 
    } 

    //Our request parameters 
    $requestParams = array_merge(
       array(
         'METHOD' => $method, 
         'VERSION' => $this -> _version 
         ), 
       $this -> _credentials 
       ); 

    //Building our NVP string 
    $request = http_build_query(array_merge($requestParams, $params)); 

    //cURL settings 
    $curlOptions = array (
       CURLOPT_URL => $this -> _endPoint, 
       CURLOPT_VERBOSE => 1, 
       CURLOPT_SSL_VERIFYPEER => true, 
       CURLOPT_SSL_VERIFYHOST => 2, 
       CURLOPT_RETURNTRANSFER => 1, 
       CURLOPT_POST => 1, 
       CURLOPT_POSTFIELDS => $request 
      ); 

    $ch = curl_init(); 
    curl_setopt_array($ch,$curlOptions); 

    //Sending our request - $response will hold the API response 
    $response = curl_exec($ch); 

    //Checking for cURL errors 
    if (curl_errno($ch)) { 
     $this -> _errors = curl_error($ch); 
     curl_close($ch); 
     return false; 
     //Handle errors 
    } else { 
     curl_close($ch); 
     $responseArray = array(); 
     parse_str($response,$responseArray); // Break the NVP string to an array 
     return $responseArray; 
    } 
    } 
} 

?> 

paypal_pay_redirect.php

<?php 
require("paypal_lib.php"); 

//Our request parameters 
$requestParams = array(
       'RETURNURL' => 'https://www.domain.com/paypal_success.php', 
       'CANCELURL' => 'https://www.domain.com/paypal_fail.php' 
       ); 

$orderParams = array(
      'PAYMENTREQUEST_0_AMT' => "57.00", 
      'PAYMENTREQUEST_0_SHIPPINGAMT' => '0', 
      'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR', 
    'PAYMENTREQUEST_0_ITEMAMT' => "57.00" 
      ); 

$item = array(
      'L_PAYMENTREQUEST_0_NAME0' => 'xxxxxxxxxx', 
      'L_PAYMENTREQUEST_0_DESC0' => 'xxxxxxxxxx', 
      'L_PAYMENTREQUEST_0_AMT0' => "57.00", 
    'L_PAYMENTREQUEST_0_QTY0' => '1' 
     ); 

$paypal = new Paypal(); 
$response = $paypal -> request('SetExpressCheckout',$requestParams + $orderParams + $item); 
if(is_array($response) && $response['ACK'] == 'Success') { //Request successful 
    $token = $response['TOKEN']; 
    header('Location: https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=' . urlencode($token)); 
} 


?> 

paypal_success.php

<?php 
require("paypal_lib.php"); 

if(isset($_GET['token']) && !empty($_GET['token'])) { // Token parameter exists 
    // Get checkout details, including buyer information. 
    // We can save it for future reference or cross-check with the data we have 
    $paypal = new Paypal(); 
    $checkoutDetails = $paypal -> request('GetExpressCheckoutDetails', array('TOKEN' => $_GET['token'])); 

    // Complete the checkout transaction 
    $requestParams = array(
      'TOKEN' => $_GET['token'], 
      'PAYMENTACTION' => 'Authorization', 
      'PAYERID' => $_GET['PayerID'], 
      'PAYMENTREQUEST_0_AMT' => '57', // Same amount as in the original request 
      'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR' // Same currency as the original request 
      ); 

    $response = $paypal -> request('DoExpressCheckoutPayment',$requestParams); 
    if(is_array($response) && $response['ACK'] == 'Success') { // Payment successful 
    // We'll fetch the transaction ID for internal bookkeeping 
    $transactionId = $response['PAYMENTINFO_0_TRANSACTIONID']; 
    echo "OK id: ".$transactionId; 
    var_dump($response); 
    } 

var_dump($checkoutDetails); 

} 
?> 

paypal_capture.php

<?php 
require("paypal_lib.php"); 

$paypal = new Paypal(); 

// Complete the checkout transaction 
$requestParams = array(
       'AMT' => '57.00', 
       'AUTHORIZATIONID' => 'xxxxxxxxxxxxxxxxxxx', //what I get in paypal_success.php 
       'CURRENCYCODE' => 'EUR', 
       'COMPLETETYPE' => 'Complete', // Same amount as in the original request 
       ); 

$response = $paypal -> request('DoCapture',$requestParams); 

var_dump($response); 

?> 

ответ

1

Две вещи:

Во-первых, в paypal_pay_redirect.php, добавить PAYMENTREQUEST_0_PAYMENTACTION => 'Authorization' к $orderParams.

Во-вторых, в paypal_success.php, change PAYMENTACTION TO PAYMENTREQUEST_0_PAYMENTACTION.

Вот почему:

В вашем SetExpressCheckout вызова, если вы не установите PAYMENTREQUEST_0_PAYMENTACTION, PayPal предполагает, что это будет Sale. И если в вашем вызове SetExpressCheckout установлено значение Sale, тогда PayPal разрешит вам установить его на Sale на ваш вызов DoExpressCheckoutPayment.

Кроме того, в вашем вызове DoExpressCheckoutPayment вы смешиваете новые имена переменных старого и старого стиля. (Некоторые переменные, такие как PAYMENTACTION, были переименованы, когда PayPal представила параллельные платежи для Express Checkout. PAYMENTACTION - это старый стиль, PAYMENTREQUEST_0_PAYMENTACTION - это новый стиль.) Когда вы смешиваете имена старого стиля и нового стиля, подобные этому, PayPal распознает переменные, используя один стиль и игнорирует другой. В вашем случае распознаются PAYMENTREQUEST_0_AMT и PAYMENTREQUEST_0_CURRENCYCODE, но PAYMENTACTION игнорируется.

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