Я работаю с 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
Я пробовал несколько часов подряд, чтобы исправить это и отказался. Может ли кто-то выделить, что мне нужно сделать, чтобы заставить его работать?
Вам не хватает 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
Не имеет прямого отношения к вопросу, но так как это появляется первым в 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 = в
&L_PAYMENTREQUEST_0_NAME0=&L_PAYMENTREQUEST_0_AMT0=1.00
Он работает нормально.
Поэтому я предполагаю, что в конце PayPal он просто присваивает значение «& L_PAYMENTREQUEST_0_AMT0 = 1,00» для L_PAYMENTREQUEST_0_NAME0, тем самым эффективно удаляя его из сообщения и, следовательно, вызывает эту ошибку, так как без этой строки суммы не складываются.
У меня были те же проблемы и разрешили это, установив цены в 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);