web-dev-qa-db-fra.com

API Paypal: les totaux des montants des articles du panier ne correspondent pas aux montants des commandes

Je travaille avec l'API de paiement express Paypal et j'ai des problèmes pour définir la quantité. Voici mes paramètres URI:

$params = array(
   'METHOD' => 'SetExpressCheckout',
   'PAYMENTREQUEST_0_SHIPPINGAMT' => '0',
   'PAYMENTREQUEST_0_TAXAMT' => '0',
   'PAYMENTREQUEST_0_HANDLINGAMT' => '0',
   'PAYMENTREQUEST_0_AMT' => "50.00",
   'RETURNURL' => $this->_returnUri,
   'CANCELURL' => $this->_cancelUri,
   'HDRIMG' => $this->_logoUri,
   'PAYMENTREQUEST_0_CURRENCYCODE' => 'GBP',
   'L_PAYMENTREQUEST_0_DESC0' => 'Product description',
   'L_PAYMENTREQUEST_0_NAME0' => 'Product name',
   'L_PAYMENTREQUEST_0_AMT0' => "50.00",
   'L_PAYMENTREQUEST_0_QTY0' => "2"
);

Si L_PAYMENTREQUEST_0_QTY0 est défini sur 1, le processus fonctionne correctement. Cependant, le changer en 2 et ajouter 'PAYMENTREQUEST_0_ITEMAMT' => "100.00" au tableau me donne l'erreur suivante:

TIMESTAMP: 2012-04-17T12:11:16Z
CORRELATIONID: da43f6c91254
ACK: Failure
VERSION: 88.0
BUILD: 2808426
L_ERRORCODE0: 10413
L_SHORTMESSAGE0: Transaction refused because of an invalid argument. See additional error messages for details.
L_LONGMESSAGE0: The totals of the cart item amounts do not match order amounts.
L_SEVERITYCODE0: Error

J'ai essayé pendant des heures de le réparer et j'ai abandonné. Quelqu'un peut-il souligner le besoin que je dois faire pour que cela fonctionne?

15
Rijndael

Vous manquez une ITEMAMT. Voir aussi ma réponse dans Paiement PayPal avec frais de livraison et erreur qui contient un exemple de travail avec plusieurs quantités. 

&L_PAYMENTREQUEST_0_NAME0=10% Decaf Kona Blend Coffee  
&L_PAYMENTREQUEST_0_NUMBER0=623083  
&L_PAYMENTREQUEST_0_DESC0=Size: 8.8-oz 
&L_PAYMENTREQUEST_0_AMT0=9.95  
&L_PAYMENTREQUEST_0_QTY0=2  
&L_PAYMENTREQUEST_0_NAME1=Coffee Filter bags  
&L_PAYMENTREQUEST_0_NUMBER1=623084  
&L_PAYMENTREQUEST_0_DESC1=Size: Two 24-piece boxes  
&L_PAYMENTREQUEST_0_AMT1=39.70  
&L_PAYMENTREQUEST_0_QTY1=2  
&PAYMENTREQUEST_0_ITEMAMT=99.30  
&PAYMENTREQUEST_0_TAXAMT=2.58  
&PAYMENTREQUEST_0_SHIPPINGAMT=3.00  
&PAYMENTREQUEST_0_HANDLINGAMT=2.99  
&PAYMENTREQUEST_0_SHIPDISCAMT=-3.00  
&PAYMENTREQUEST_0_INSURANCEAMT=1.00  
&PAYMENTREQUEST_0_AMT=105.87  
&PAYMENTREQUEST_0_CURRENCYCODE=USD  
25
Robert

Pas directement lié à la question, mais puisque cela apparaît en premier dans Google lors de la recherche par message d'erreur, cela pourrait être utile aux autres personnes qui reçoivent cette erreur.

Cette erreur risque de se produire si certains champs ne sont pas définis (null/vide).

Par exemple, dans mon cas, c'était (ajout de sauts de ligne pour plus de clarté):

    PAYMENTREQUEST_0_PAYMENTACTION=Sale
    &REQCONFIRMSHIPPING=0
    &RETURNURL=some_url
    &CANCELURL=some_other_url
    &BRANDNAME=Brand
    &L_PAYMENTREQUEST_0_NAME0=
    &L_PAYMENTREQUEST_0_AMT0=1.00
    &L_PAYMENTREQUEST_0_QTY0=1
    &PAYMENTREQUEST_0_AMT=1.00
    &PAYMENTREQUEST_0_CURRENCYCODE=USD

Et cela me donnait la même erreur, même si les montants sont corrects. Je pense que c'est un problème d'analyse syntaxique, car si vous insérez même un espace après L_PAYMENTREQUEST_0_NAME0 = dans 

&L_PAYMENTREQUEST_0_NAME0=&L_PAYMENTREQUEST_0_AMT0=1.00

Ça fonctionne bien. 

Donc, je suppose que, du côté de Paypal, il attribue simplement "& L_PAYMENTREQUEST_0_AMT0 = 1.00" à L_PAYMENTREQUEST_0_NAME0, le supprimant ainsi efficacement du message et provoquant par conséquent cette erreur, car sans cette ligne, les montants ne s'ajoutent pas.

2
Zar Shardan

J'ai eu le même problème et je l'ai résolu en formatant les prix dans foreach par la fonction number_format pour le paramètre L_PAYMENTREQUEST_0_AMT $ k.

Exemple:

$items_amount = 0;
foreach ($products as $k => $product) {
    $params["L_PAYMENTREQUEST_0_NAME$k"] = $product['name'];
    $params["L_PAYMENTREQUEST_0_DESC$k"] = $product['desc'];
    $params["L_PAYMENTREQUEST_0_AMT$k"] = number_format($product['priceIVA'], 2);
    $params["L_PAYMENTREQUEST_0_QTY$k"] = $product['count'];
    $items_amount += (floatval($product['priceIVA']) * $product['count']);
}

$params['PAYMENTREQUEST_0_AMT'] = $params['PAYMENTREQUEST_0_ITEMAMT'] = number_format($items_amount, 2);
0
realmag777