2017-03-03 2 views
1

Je travaille sur une application PHP qui s'intègre dans l'API REST de PayPal. J'ai le traitement des transactions correctement et l'enregistrement de l'ID de transaction dans une base de données MySQL. J'essaie maintenant de rembourser la vente, mais je ne peux pas l'empêcher de donner une erreur «Demande JSON entrante ne mappe pas à l'API». Quelqu'un at-il des conseils sur la façon de faire fonctionner cela?Remboursement avec l'API PHP PayPal REST?

J'ai laissé certaines de mes tentatives dans le code avec des commentaires sur leur résultat. Je me sens un peu perdu dans la direction pour que ça marche. Toute aide serait appréciée.

J'ai suivi la documentation situé ici: https://developer.paypal.com/docs/integration/direct/payments/refund-payment/

je peux être luttais adapter cette demande à PHP.

J'ai trouvé ce morceau de code: https://github.com/paypal/PayPal-PHP-SDK/blob/master/sample/payments/RefundCapture.php

Mais il est « exigeant » un ensemble de fichiers qui semblent un peu trop pour une simple demande de remboursement.

<?php 

require_once(dirname(__FILE__) . '/paypalSDK/autoload.php'); // require paypal files 
require_once(dirname(__FILE__) . '/paypalSDK/paypal/rest-api-sdk-php/sample/common.php'); // require paypal files 
// call required stuff 
use PayPal\Api\Address; 
use PayPal\Api\Amount; 
use PayPal\Api\Details; 
use PayPal\Api\ExecutePayment; 
use PayPal\Api\FundingInstrument; 
use PayPal\Api\Item; 
use PayPal\Api\ItemList; 
use PayPal\Api\Payer; 
use PayPal\Api\Payment; 
use PayPal\Api\PaymentCard; 
use PayPal\Api\PaymentExecution; 
use PayPal\Api\Transaction; 
use PayPal\Api\Capture; 
use PayPal\Api\Refund; 
use PayPal\Api\RefundRequest; 
use PayPal\Api\Sale; 

$orderID = $_GET['order_id']; // order ID we wish to refund 
// pull the details from the database so we have the transaction refund ID 
$refQ = mysql_query("SELECT * FROM orders WHERE orders_ID = $orderID", $db); 
$refC = mysql_num_rows($refQ); 
if(!empty($refC)){ 

    $refR = mysql_fetch_assoc($refQ); 
    $refNumber = $refR['orders_transaction_ref']; // paypal transaction ID 
    $FinalTotal = $refR['orders_order_total']; // order total 
    // paypal credentials 
    $apiContext = new \PayPal\Rest\ApiContext(
     new \PayPal\Auth\OAuthTokenCredential(
      'abc',  
      'xyz' 
     ) 
    ); 
    $apiContext->setConfig(array('mode' => 'live',)); // live use, not sandbox 

    //$amount = new Amount(); // commenting these out seemingly has no effect 
    //$amount->setCurrency("USD") // commenting these out seemingly has no effect 
    // ->setTotal($FinalTotal); // commenting these out seemingly has no effect 

    $refund = new Refund(); // if I comment these 2 lines out, I get "refund cannot be null" 
    $refund->setAmount($FinalTotal); // if I comment these 2 lines out, I get "refund cannot be null" 

    $sale = new Capture(); // if I comment these 2 lines out, I get "Call to a member function refund() on a non-object" 
    $sale->setId($refNumber); // if I comment these 2 lines out, I get "Call to a member function refund() on a non-object" 

    $refundRequest = new RefundRequest(); // commenting these out seemingly has no effect 
    $refundRequest->setAmount($FinalTotal); // commenting these out seemingly has no effect 

    //$captureRefund = $sale->refundCapturedPayment($refundRequest, $apiContext); // failure, error 400 

    try { 
     $sale->refund($refund, $apiContext); 
     //$sale->refundCapturedPayment($refund, $apiContext); // failure, error 400 
    } catch (Exception $ex) { 
     echo '<pre style="font-size:16px;">'; 
      var_dump($ex); 
     echo '</pre>'; 
     exit(); 
     die; 
    } 
} 

Mise à jour 08/03/2017 @ 12h23

J'ai fait apparemment « certains » des progrès, bien que j'utilise le terme vaguement. L'état est retourné comme 'terminé' mais le remboursement ne se passe pas réellement. Il ne renvoie pas non plus l'ID de paiement parent comme le démontrent les exemples. Des idées à ce sujet? J'essaie toujours de faire fonctionner ça.

Ceci est le résultat que je reçois actuellement de PayPal:

object(PayPal\Api\Refund)#3 (1) { 
    ["_propMap":"PayPal\Common\PayPalModel":private]=> 
    array(5) { 
    ["id"]=> 
    string(17) "123456789123456789" 
    ["create_time"]=> 
    string(20) "2017-03-06T20:56:32Z" 
    ["state"]=> 
    string(9) "completed" 
    ["amount"]=> 
    object(PayPal\Api\Amount)#9 (1) { 
     ["_propMap":"PayPal\Common\PayPalModel":private]=> 
     array(3) { 
     ["total"]=> 
     string(4) "0.02" 
     ["currency"]=> 
     string(3) "USD" 
     ["details"]=> 
     object(PayPal\Api\Details)#13 (1) { 
      ["_propMap":"PayPal\Common\PayPalModel":private]=> 
      array(1) { 
      ["subtotal"]=> 
      string(4) "0.02" 
      } 
     } 
     } 
    } 
    ["links"]=> 
    array(1) { 
     [0]=> 
     object(PayPal\Api\Links)#17 (1) { 
     ["_propMap":"PayPal\Common\PayPalModel":private]=> 
     array(3) { 
      ["href"]=> 
      string(59) "https://api.paypal.com/v1/payments/refund/123456789123456789" 
      ["rel"]=> 
      string(4) "self" 
      ["method"]=> 
      string(3) "GET" 
     } 
     } 
    } 
    } 
} 

est Ci-dessous le code de retour actuellement la réponse ci-dessus ...

require_once(dirname(__FILE__) . '/paypalSDK/autoload.php'); // require paypal files 
require_once(dirname(__FILE__) . '/paypalSDK/paypal/rest-api-sdk-php/sample/bootstrap.php'); // require paypal files 
require_once(dirname(__FILE__) . '/paypalSDK/paypal/rest-api-sdk-php/sample/common.php'); // require paypal files 
// call required stuff 
use PayPal\Api\Address; 
use PayPal\Api\Amount; 
use PayPal\Api\Details; 
use PayPal\Api\ExecutePayment; 
use PayPal\Api\FundingInstrument; 
use PayPal\Api\Item; 
use PayPal\Api\ItemList; 
use PayPal\Api\Payer; 
use PayPal\Api\Payment; 
use PayPal\Api\PaymentCard; 
use PayPal\Api\PaymentExecution; 
use PayPal\Api\Transaction; 
use PayPal\Api\Capture; 
use PayPal\Api\Refund; 
use PayPal\Api\RefundRequest; 
use PayPal\Api\Sale; 

$orderID = $_GET['order_id']; // internal order ID we wish to refund 

// pull the details from database so we have the PayPal transction ID 
$refQ = mysql_query("SELECT * FROM orders WHERE orders_ID = $orderID", $db); 
$refC = mysql_num_rows($refQ); 
if(!empty($refC)){ 

    $refR = mysql_fetch_assoc($refQ); 
    $refNumber = $refR['orders_transaction_ref']; // PayPal transaction ID 

    // attempted 'PAY-' ID, results in "Requested resource ID was not found." 
    // $refNumber = $refR['orders_payment_ref']; // ex. PAY-123456789

    $FinalTotal = $refR['orders_order_total']; // order total 

    // paypal credentials 
    $apiContext = new \PayPal\Rest\ApiContext(
     new \PayPal\Auth\OAuthTokenCredential(
      'abc',  
      'xyz' 
     ) 
    ); 
    $apiContext->setConfig(array('mode' => 'live',)); // live use, not sandbox 

    //$amount = new Amount(); // commenting these out seemingly has no effect 
    //$amount->setCurrency("USD") // commenting these out seemingly has no effect 
    // ->setTotal($FinalTotal); // commenting these out seemingly has no effect 

    /* 
    // attempted code 
    // ### Refund object 
    $refund = new Refund(); 
    //$refund = new RefundRequest(); 
    $refund->setAmount($FinalTotal); 
    */ 

    $refund = new Refund(); 
    $refund->setId($refNumber); 
    $refund->setSaleId($refNumber); 
    $refund->setAmount($FinalTotal); 
    $refund->setReason("Testing refund code"); 
    //$refund->get($refNumber, $apiContext); 

    // Attempted code, didn't work 
    // https://stackoverflow.com/questions/18927591/paypal-api-how-to-get-sale-id-and-refund-payment-made-via-paypal 
    // Fatal error: Uncaught exception 'InvalidArgumentException' with message 'paymentId cannot be null' in /home/cartridgeworkspl/public_html/cfx_controllers/paypalSDK/paypal/rest-api-sdk-php/lib/PayPal/Validation/ArgumentValidator.php:25 Stack trace: #0 
    // $payments = Payment::get($refNumber, $apiContext); 
    // $payments->getTransactions(); 
    // $obj = $payments->toJSON();//I wanted to look into the object 
    // $paypal_obj = json_decode($obj);//I wanted to look into the object 
    // $transaction_id = $paypal_obj->transactions[0]->related_resources[0]->sale->id; 
    // $this->refund($transaction_id);//Call your custom refund method 

    try { 
     //var_dump($refund); 
     $refundResponse = Refund::get($refNumber, $apiContext); 
     echo '<pre>'; 
      var_dump($refundResponse); 
     echo '</pre>'; 
     echo $refundResponse->getState(); 
     echo $refundResponse->getReasonCode(); 
    } catch (Exception $ex) { 
     // NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY 
     ResultPrinter::printError("Get Payment", "Payment", null, null, $ex); 
     exit(1); 
    } 

} 

Toute aide serait extrêmement apprécié.

Répondre

0

J'ai réussi à travailler mon chemin à travers elle. Vous trouverez ci-dessous un code qui permet de rembourser avec succès les commandes PayPal effectuées via l'API REST.

<?php 
    require_once(dirname(__FILE__) . '/paypalSDK/autoload.php'); // require paypal files 
    require_once(dirname(__FILE__) . '/paypalSDK/paypal/rest-api-sdk-php/sample/bootstrap.php'); // require paypal files 
    require_once(dirname(__FILE__) . '/paypalSDK/paypal/rest-api-sdk-php/sample/common.php'); // require paypal files 

    // call required PayPal functionality 
    use PayPal\Api\Address; 
    use PayPal\Api\Amount; 
    use PayPal\Api\Details; 
    use PayPal\Api\ExecutePayment; 
    use PayPal\Api\FundingInstrument; 
    use PayPal\Api\Item; 
    use PayPal\Api\ItemList; 
    use PayPal\Api\Payer; 
    use PayPal\Api\Payment; 
    use PayPal\Api\PaymentCard; 
    use PayPal\Api\PaymentExecution; 
    use PayPal\Api\Transaction; 
    use PayPal\Api\Capture; 
    use PayPal\Api\Refund; 
    use PayPal\Api\RefundRequest; 
    use PayPal\Api\Sale; 

    $orderID = $_GET['order_id']; // internal order ID we wish to refund 

    // pull the details from database so we have the PayPal transction ID 
    $refQ = mysql_query("SELECT * FROM orders WHERE orders_ID = $orderID", $db); 
    $refC = mysql_num_rows($refQ); 
    if(!empty($refC)){ 

     $refR = mysql_fetch_assoc($refQ); // array of order data 

     $refNumber = $refR['orders_transaction_ref']; // PayPal transaction ID 
     $FinalTotal = $refR['orders_order_total']; // order total 

     // get PayPal access token via cURL 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, "https://api.paypal.com/v1/oauth2/token"); 
     curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      'Accept: application/json', 
      'Accept-Language: en_US' 
     )); 
     curl_setopt($ch, CURLOPT_USERPWD, 'USER:PASS'); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=client_credentials'); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $output = curl_exec($ch); 
     $json = json_decode($output); 
     $token = $json->access_token; // this is our PayPal access token 

     // refund PayPal sale via cURL 
     $header = Array(
      "Content-Type: application/json", 
      "Authorization: Bearer $token", 
     ); 
     $ch = curl_init("https://api.paypal.com/v1/payments/sale/$refNumber/refund"); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, '{}'); 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
     $res = json_decode(curl_exec($ch)); 
     $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
     curl_close($ch); 

     // if res has a state, retrieve it 
     if(isset($res->state)){ 
      $state = $res->state; 
     }else{ 
      $state = NULL; // otherwise, set to NULL 
     } 

     // if we have a state in the response... 
     if($state == 'completed'){ 
      // the refund was successful 
     }else{ 
      // the refund failed 
      $errorName = $res->name; // ex. 'Transaction Refused.' 
      $errorReason = $res->message; // ex. 'The requested transaction has already been fully refunded.' 
     } 
    } 
?> 
0

Je crois que le problème est que lorsque vous soumettez le remboursement, vous devez également définir le contexte de l'API. Le premier contexte établit la connexion à l'API, puis vous définissez l'ID de vente. Je crois que vous devez ensuite définir le contexte API pour cet ID de vente, mais je ne suis pas 100%.

+0

Hmm, je pensais que cela pourrait être lié au manque de devises. J'ai essayé d'ajouter "setCurrency (" USD ")" à $ refund mais j'ai l'erreur "Erreur fatale: Appel à la méthode non définie PayPal \ Api \ Refund :: setCurrency() dans /processRefund.node.php sur la ligne 48" – ihateartists