I’m having problems capturing Paypal payment through DoExpressCheckoutPayment method. Paypal failed and returned with only one 10004 error which said
Transaction refused because of an invalid argument. See additional error messages for details.
However, Paypal did not specify which argument was invalid.
Is there a way to request Paypal to provide more details in this case?
Below are arguments which I post to Paypal using the NVP API.
DoExpressCheckoutPayment
L_PAYMENTREQUEST_0_NAME0=Hieu+Nguyen
L_PAYMENTREQUEST_0_AMT0=20
L_PAYMENTREQUEST_0_QTY0=1
PAYMENTREQUEST_0_AMT=20
PAYMENTREQUEST_0_ITEMAMT=20
PAYMENTREQUEST_0_SHIPTOPHONENUM=452435243
EMAIL=hieu%40thirststudios.com
METHOD=DoExpressCheckoutPayment
VERSION=124.0
PWD=[masked]
USER=[masked]
SIGNATURE=[masked]
PAYMENTREQUEST_0_PAYMENTACTION=Sale
RETURNURL=http%3A%2F%2Fhakuba.centralsnowsports.com.au.local%2F%3FACT%3D53%26G%3DVXdJWStNWGFNSTIvQ09mNmE1cXJWSXlDN0lqYXlQdnNZRjBHL2NoaWpMNVAwNGlaN1A2K1crNVRBbUpmNG1yY05NTC9Mb1hHUVBQL0VsTG9rUEFzbFE9PQ%3D%3D%26M%3DVldsZFNoZVVsRTBJNjFLbmxZSWRtbitQVkZvNEI1M2hrQXNUb2hBZHozQnhCcUVFZkJmM3B0VVBvek1vV3ZPdGpubXJuQlNHd1FaU01wcDNYZVlGMVE9PQ%3D%3D
CANCELURL=http%3A%2F%2Fhakuba.centralsnowsports.com.au.local%2F%3FACT%3D53%26G%3DejNhR1BDSlhRZ1o0MzZoWFAvVmttY2pzMzF5amhqbDZzV2NMemoxbjcvY2dPQTZ4ZlVtL0ltRUx0dmkwUlV0Y3dpRDBuUWxJNk12cnREVDQ4Z1NYMWc9PQ%3D%3D%26M%3DR013TVBmL1FHZkRtOWVRSzVUL0JqMmZYa1B4RTJVNFptdjBPSGJFTlJqK2VSdkU5V25FczM4WEs2WkcwK3FPaWxwYkFSaW1JbGpHOVJSbWpTRjR4N3c9PQ%3D%3D
PAYMENTREQUEST_0_CURRENCYCODE=JPY
ALLOWNOTE=0
CHANNELTYPE=Merchant
PAYMENTREQUEST_0_ALLOWEDPAYMENTMETHOD=InstantPaymentOnly
LOCALECODE=US
ADDROVERRIDE=0
NOSHIPPING=1
SOLUTIONTYPE=Sole
LANDINGPAGE=Billing
TOKEN=EC-59S20038JL208993V
PAYERID=XAC7EG8Y2M5D6
IPADDRESS=hakuba.centralsnowsports.com.au.local
[Updated] more API call argument
SetExpressCheckout
L_PAYMENTREQUEST_0_ITEMCATEGORY0=Physical
L_PAYMENTREQUEST_0_NAME0=Hieu+Nguyen
L_PAYMENTREQUEST_0_AMT0=20
L_PAYMENTREQUEST_0_QTY0=1
PAYMENTREQUEST_0_AMT=20
PAYMENTREQUEST_0_ITEMAMT=20
PAYMENTREQUEST_0_SHIPTOPHONENUM=3143214
EMAIL=hieu%40thirststudios.com
METHOD=SetExpressCheckout
VERSION=124.0
PWD=[masked]
USER=[masked]
SIGNATURE=[masked]
PAYMENTREQUEST_0_PAYMENTACTION=Sale
RETURNURL=http%3A%2F%2Fhakuba.centralsnowsports.com.au.local%2F%3FACT%3D53%26G%3DRlN5WWJUS21HeGd6cTlSTm95MFpZMkxTTTdMZEZ1OUV6S2FIY0pYSjVnM1M0d2FjQjVIQnlqQ3F2d3NFSHRhZHB3bTVnRUE3T1NzN0EwOTcvOVlIQ3c9PQ%3D%3D%26M%3DYWNEUGhhemNVRzNpM0liMEVSUi94TmxkRDZRdmM2R3UrTUh0c2x1dFgwZ2tTNHJjV2lRUHBMWjR6d29vTkxXa3VRUnRPM0xNcnoyYlNHV2NKU2kzb2c9PQ%3D%3D
CANCELURL=http%3A%2F%2Fhakuba.centralsnowsports.com.au.local%2F%3FACT%3D53%26G%3DWnJzWDBWU1JaZndldStIY1FUNjFUWlNyTWYwR0N4NlRQK0VnajAvRjF2bFViZlVhZWphU0o3M1Z5dlNrdWlHOG4rRGd6OUdHNHJQaVhMa0tzamZvcnc9PQ%3D%3D%26M%3DemsxeGV1cnZ4a2JVWnhZRHNaU0ExTHBOaEp6dUQ1b2hiTVF5MXVxMjZyaFh1aFRhUGQvZ0M3dlZGT2dFU0FUelU3bjR6Qm5VVFBLT2xPSlJTN3ROUmc9PQ%3D%3D
PAYMENTREQUEST_0_CURRENCYCODE=JPY
ALLOWNOTE=0
CHANNELTYPE=Merchant
PAYMENTREQUEST_0_ALLOWEDPAYMENTMETHOD=InstantPaymentOnly
LOCALECODE=US
ADDROVERRIDE=0
NOSHIPPING=1
SOLUTIONTYPE=Sole
LANDINGPAGE=Billing
GetExpressCheckoutDetails
METHOD=GetExpressCheckoutDetails
VERSION=124.0
PWD=[masked]
USER=[masked]
SIGNATURE=[masked]
TOKEN=EC-75541725B7341060R
I’m getting an error using PayPal payments Pro — but only at a certain quantity of a product. When ordering 55 items of a product the customer sees this error popup:
PayPal gateway has rejected request. The transaction id is not valid (#10004: Transaction refused because of an invalid argument. See additional error messages for details).
I’ve checked the PayPal log and have found the response to be:
[TIMESTAMP] => 2016-06-23T10:59:20Z
[CORRELATIONID] => 241c536268ca3
[ACK] => Failure
[VERSION] => 72.0
[BUILD] => 22386173
[L_ERRORCODE0] => 10004
[L_SHORTMESSAGE0] => Transaction refused because of an invalid argument. See additional error messages for details.
[L_LONGMESSAGE0] => The transaction id is not valid
[L_SEVERITYCODE0] => Error
[AMT] => 107.25
[CURRENCYCODE] => GBP
The strangest thing is that if the customer clicks «Place Order» a second time it will go through, or if the customer orders a different quantity (30 instead of 55 for example) the order still goes through.
Has anyone seen anything like this before? I don’t know how it could just happen based on the quantity, and as far as I know PayPal responds with the transaction ID and it isn’t something provided by Magento.
Any help would be great!
asked Jun 23, 2016 at 12:40
The first step is to copy the Abstract.php file from app/code/core/Mage/Paypal/Model/Api/
to app/code/local/Mage/Paypal/Model/Api/
. You can make these changes directly to the core file if you really have to, but it’s not recommended.
Find the _exportLineItems
function (line 390 in my version 1.9) — this is what we’re going to change.
Before the foreach ($items as $item) {
(around line 412) add this:
$running_total = 0;
Before the $request[sprintf($privateFormat, $i)] = $value;
(around line 423) add this:
if ($publicKey == 'amount') {
$running_total += $value;
}
Before the return $result;
(around line 427) add this:
// Check ITEMAMT. If different to running total, offset prices
if ((isset($request['ITEMAMT'])) && ($request['ITEMAMT'] > 0)) {
if ($running_total <> (float) $request['ITEMAMT']) {
$difference = ($running_total - (float) $request['ITEMAMT']);
// Apply difference to first product.
$request['L_AMT0'] = (string) ((float) $request['L_AMT0'] - $difference);
}
}
answered Nov 22, 2016 at 10:26
У меня проблемы с получением платежа Paypal с помощью метода DoExpressCheckoutPayment . Paypal не удалось и вернулся только с одной ошибкой 10004, в которой говорилось
Транзакция отклонена из-за недопустимого аргумента. Дополнительные сведения см. В дополнительных сообщениях об ошибках.
Однако Paypal не уточнил, какой аргумент является недопустимым.
Есть ли способ запросить у Paypal более подробную информацию в этом случае?
Ниже приведены аргументы, которые я отправляю в Paypal с помощью NVP API.
DoExpressCheckoutPayment
L_PAYMENTREQUEST_0_NAME0=Hieu+Nguyen
L_PAYMENTREQUEST_0_AMT0=20
L_PAYMENTREQUEST_0_QTY0=1
PAYMENTREQUEST_0_AMT=20
PAYMENTREQUEST_0_ITEMAMT=20
PAYMENTREQUEST_0_SHIPTOPHONENUM=452435243
EMAIL=hieu%40thirststudios.com
METHOD=DoExpressCheckoutPayment
VERSION=124.0
PWD=[masked]
USER=[masked]
SIGNATURE=[masked]
PAYMENTREQUEST_0_PAYMENTACTION=Sale
RETURNURL=http%3A%2F%2Fhakuba.centralsnowsports.com.au.local%2F%3FACT%3D53%26G%3DVXdJWStNWGFNSTIvQ09mNmE1cXJWSXlDN0lqYXlQdnNZRjBHL2NoaWpMNVAwNGlaN1A2K1crNVRBbUpmNG1yY05NTC9Mb1hHUVBQL0VsTG9rUEFzbFE9PQ%3D%3D%26M%3DVldsZFNoZVVsRTBJNjFLbmxZSWRtbitQVkZvNEI1M2hrQXNUb2hBZHozQnhCcUVFZkJmM3B0VVBvek1vV3ZPdGpubXJuQlNHd1FaU01wcDNYZVlGMVE9PQ%3D%3D
CANCELURL=http%3A%2F%2Fhakuba.centralsnowsports.com.au.local%2F%3FACT%3D53%26G%3DejNhR1BDSlhRZ1o0MzZoWFAvVmttY2pzMzF5amhqbDZzV2NMemoxbjcvY2dPQTZ4ZlVtL0ltRUx0dmkwUlV0Y3dpRDBuUWxJNk12cnREVDQ4Z1NYMWc9PQ%3D%3D%26M%3DR013TVBmL1FHZkRtOWVRSzVUL0JqMmZYa1B4RTJVNFptdjBPSGJFTlJqK2VSdkU5V25FczM4WEs2WkcwK3FPaWxwYkFSaW1JbGpHOVJSbWpTRjR4N3c9PQ%3D%3D
PAYMENTREQUEST_0_CURRENCYCODE=JPY
ALLOWNOTE=0
CHANNELTYPE=Merchant
PAYMENTREQUEST_0_ALLOWEDPAYMENTMETHOD=InstantPaymentOnly
LOCALECODE=US
ADDROVERRIDE=0
NOSHIPPING=1
SOLUTIONTYPE=Sole
LANDINGPAGE=Billing
TOKEN=EC-59S20038JL208993V
PAYERID=XAC7EG8Y2M5D6
IPADDRESS=hakuba.centralsnowsports.com.au.local
[Обновлено] дополнительный аргумент вызова API
SetExpressCheckout
L_PAYMENTREQUEST_0_ITEMCATEGORY0=Physical
L_PAYMENTREQUEST_0_NAME0=Hieu+Nguyen
L_PAYMENTREQUEST_0_AMT0=20
L_PAYMENTREQUEST_0_QTY0=1
PAYMENTREQUEST_0_AMT=20
PAYMENTREQUEST_0_ITEMAMT=20
PAYMENTREQUEST_0_SHIPTOPHONENUM=3143214
EMAIL=hieu%40thirststudios.com
METHOD=SetExpressCheckout
VERSION=124.0
PWD=[masked]
USER=[masked]
SIGNATURE=[masked]
PAYMENTREQUEST_0_PAYMENTACTION=Sale
RETURNURL=http%3A%2F%2Fhakuba.centralsnowsports.com.au.local%2F%3FACT%3D53%26G%3DRlN5WWJUS21HeGd6cTlSTm95MFpZMkxTTTdMZEZ1OUV6S2FIY0pYSjVnM1M0d2FjQjVIQnlqQ3F2d3NFSHRhZHB3bTVnRUE3T1NzN0EwOTcvOVlIQ3c9PQ%3D%3D%26M%3DYWNEUGhhemNVRzNpM0liMEVSUi94TmxkRDZRdmM2R3UrTUh0c2x1dFgwZ2tTNHJjV2lRUHBMWjR6d29vTkxXa3VRUnRPM0xNcnoyYlNHV2NKU2kzb2c9PQ%3D%3D
CANCELURL=http%3A%2F%2Fhakuba.centralsnowsports.com.au.local%2F%3FACT%3D53%26G%3DWnJzWDBWU1JaZndldStIY1FUNjFUWlNyTWYwR0N4NlRQK0VnajAvRjF2bFViZlVhZWphU0o3M1Z5dlNrdWlHOG4rRGd6OUdHNHJQaVhMa0tzamZvcnc9PQ%3D%3D%26M%3DemsxeGV1cnZ4a2JVWnhZRHNaU0ExTHBOaEp6dUQ1b2hiTVF5MXVxMjZyaFh1aFRhUGQvZ0M3dlZGT2dFU0FUelU3bjR6Qm5VVFBLT2xPSlJTN3ROUmc9PQ%3D%3D
PAYMENTREQUEST_0_CURRENCYCODE=JPY
ALLOWNOTE=0
CHANNELTYPE=Merchant
PAYMENTREQUEST_0_ALLOWEDPAYMENTMETHOD=InstantPaymentOnly
LOCALECODE=US
ADDROVERRIDE=0
NOSHIPPING=1
SOLUTIONTYPE=Sole
LANDINGPAGE=Billing
GetExpressCheckoutDetails
METHOD=GetExpressCheckoutDetails
VERSION=124.0
PWD=[masked]
USER=[masked]
SIGNATURE=[masked]
TOKEN=EC-75541725B7341060R
1 ответ
Лучший ответ
Обновление: для записи проблема разрешилась сама собой через несколько дней. Это должно быть проблема с внутренним механизмом Paypal. Тем не менее, после этого инцидента мы отказались от Paypal.
0
Hieu Nguyen
28 Июл 2017 в 09:28
Я искал сайт PayPal, форумы и Google в целом в поисках решения этой проблемы. Я знаю, что есть еще один вопрос, очень похожий на мой, хотя он остается без ответа, и мне не разрешено (пока) оставлять комментарии, чтобы попросить разъяснений здесь: что не так с этим кодом для обновления кнопки PayPal? Я получаю «недопустимая ошибка типа кнопки»
Я относительно новичок в использовании API Paypal, поэтому я просто воспроизведу шаги, которые привели меня сюда.
- Создал размещенную кнопку типа «добавить в корзину» на Paypal.
- Скопировал сгенерированный HTML на свой сайт.
- Вместо того, чтобы публиковать напрямую в Paypal, я просто публикую PHP-скрипт (вставлен ниже).
ini_set(‘track_errors’, правда);
$url = trim('https://api-3t.paypal.com/nvp');
$body_data = array(
'USER' => "omitted",
'PWD' => "omitted",
'SIGNATURE' => "_omitted_",
'VERSION' => "104",
'METHOD' => "BMUpdateButton",
'HOSTEDBUTTONID' => "_omitted_",
'BUTTONTYPE' => "CART",
'BUTTONCODE' => "HOSTED",
'L_BUTTONVAR0' => "amount="_new item price_",
'L_BUTTONVAR1' => "item_name="_item name_",
'L_BUTTONVAR2' => "currency_code="_new currency code_",
'L_BUTTONVAR3' => "on0=".$_POST['os0'],
'L_BUTTONVAR4' => "on1=".$_POST['on1'],
'L_BUTTONVAR5' => "on2=".$_POST['on2'],
'L_BUTTONVAR6' => "quantity=".$_POST['quantity']
);
$body_data = http_build_query($body_data, '', chr(38));
try
{
//create request and add headers
$params = array('http' => array(
'method' => "POST",
'content' => $body_data,
));
//create stream context
$ctx = stream_context_create($params);
//open the stream and send request
$fp = @fopen($url, 'r', false, $ctx);
//get response
$response = stream_get_contents($fp);
//check to see if stream is open
if ($response === false) {
throw new Exception("php error message = " . "$php_errormsg");
}
//echo $response . "<br/>";
//close the stream
fclose($fp);
//parse key from the response
$key = explode("&",$response);
//print_r ($key);
//set url to approve the transaction
$payPalURL = "https://www.paypal.com/cgi-bin/webscr" . str_replace("TOKEN", "token", htmlspecialchars(urldecode($key[0])));
If ( $key[5] == 'ACK=Success')
{
header( "Location: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=T3XNV39TEVDJG" );
}
else
{
echo $response;
echo $key[3];
echo 'ERROR Code: "' . str_replace("L_ERRORCODE0=", "", htmlspecialchars(urldecode($key[5]))) . '"<br/> Error Long Message: "' . str_replace("L_LONGMESSAGE0=", "", htmlspecialchars(urldecode($key[7]))) . '"';
}
}
catch(Exception $e)
{
echo 'Message: ||' .$e->getMessage().'||';
}
}
и в основном то, что я получаю, это ошибка:
Код: «10004» Длинное сообщение об ошибке: «Указанный тип кнопки недействителен».
Основная проблема заключается в том, что, несмотря на то, что я следую любым инструкциям API, которые могу получить (ИМХО, веб-сайт разработчиков PayPal — беспорядок), и я уверен, что правильно устанавливаю переменную BUTTONTYPE, я все еще получение этой ошибки.
Что я тестировал:
- Протестировал размещенную кнопку напрямую, работает нормально. Но мне нужно динамически обновлять цену товара.
- Изменил BUTTONTYPE на что-то неправильное. Это дает мне соответствующую ошибку: 11925, но когда я перемещаю ее на «правильное» значение, я снова получаю предыдущий код ошибки.
- Удалены все переменные, кроме необходимых: USER, PWD, SIGNATURE, VERSION, METHOD, HOSTEDBUTTONID,BUTTONTYPE,BUTTONCODE. Я получаю ту же ошибку.
- Изменил версию. На всякий случай, если значения, разрешенные для BUTTONTYPE, изменились с одного на другое. Та же ошибка.
Так что в основном я застрял здесь. У тебя есть идеи? Мой веб-сайт размещен на bluehost, хотя мне не разрешено «публиковать» сайт, пока это не будет исправлено для моего клиента.
заранее спасибо