API Paypal: сумма сумм корзины не соответствует сумме заказов

Я работаю с API экспресс-оплаты paypal, и у меня возникают проблемы с настройкой количества. Ниже приведены параметры моего 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"
);

Если для параметра L_PAYMENTREQUEST_0_QTY0 установлено значение 1, процесс прекрасен. Однако, меняя его на 2 и добавляя к массиву 'PAYMENTREQUEST_0_ITEMAMT' = > "100.00", я получаю следующую ошибку:

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

Я пробовал несколько часов подряд, чтобы исправить это и отказался. Может ли кто-то выделить, что мне нужно сделать, чтобы заставить его работать?

Ответы

Ответ 1

Вам не хватает ITEMAMT. См. Также мой ответ в Paypal Express checkout с стоимостью и ошибкой доставки, который содержит рабочий пример с несколькими количествами.

&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  

Ответ 2

Не напрямую, связанный с вопросом, но так как это появляется первым в Google при поиске по сообщению об ошибке, это может быть полезно для других людей, которые получают эту ошибку.

Вы можете получить эту ошибку, если некоторые из полей не установлены (null/blank).

Например, в моем случае это было (разрывы строк добавлены для ясности):

    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

И это дало мне ту же ошибку, хотя суммы были в порядке. Я думаю, что это проблема синтаксического анализа, потому что если вы вставляете даже пробел после L_PAYMENTREQUEST_0_NAME0 = in

&L_PAYMENTREQUEST_0_NAME0=&L_PAYMENTREQUEST_0_AMT0=1.00

Он отлично работает.

Поэтому я предполагаю, что в конце PayPal он просто присваивает значение "& L_PAYMENTREQUEST_0_AMT0 = 1,00" для L_PAYMENTREQUEST_0_NAME0, тем самым эффективно удаляя его из сообщения и, следовательно, запускает эту ошибку, так как без этой строки суммы не складываются.

Ответ 3

У меня была такая же проблема и она была решена путем формирования цен в foreach по функции number_format для параметра L_PAYMENTREQUEST_0_AMT $k

Пример:

$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);