【问题标题】:Paypal PHP NVP API - The totals of the cart item amounts do not match order amountsPaypal PHP NVP API - 购物车项目总金额与订单金额不匹配
【发布时间】:2012-01-18 22:37:54
【问题描述】:

我的自定义贝宝购物车上的总数有问题。使用 PHP NVP API 我得到:

TIMESTAMP: 2012-01-18T07:27:10Z
CORRELATIONID: d1fac4fa784ef
ACK: Failure
VERSION: 84.0
BUILD: 2271164
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

但是,我知道我的总数应该是正确的。这是PHP:

$count = sizeof($cartItem);
$subtotal = 0;
$itmStr = '';
foreach($cartItem as $k = $ci)
{
  $sub = $ci['cart_amt']*$ci['cart_price'];
  $subtotal = $sub + $subtotal;

  $itmStr .= '&L_PAYMENTREQUEST_'.$k.'_NUMBER0='.$ci['cart_id'].'&L_PAYMENTREQUEST_'.$k.'_NAME0='.$ci['cart_item'].'&L_PAYMENTREQUEST_'.$k.'_AMT0='.$ci['cart_price'].'&L_PAYMENTREQUEST_'.$k.'_QTY0='.$ci['cart_amt'].'&L_PAYMENTREQUEST_'.$k.'_DESC0='.truncate($ci['cart_desc'], 25);
}

$subtotal = (float) $subtotal; 
if(round($subtotal) < 25)
{
  $ups_rate = (float) 9.95; 
  $usps_rate = (float) 7.50; 
} 

$ups_rate = number_format($ups_rate, 2, '.', ''); 
$usps_rate = number_format($usps_rate, 2, '.', ''); 
$_SESSION['ups_rate'] = $ups_rate; 
$_SESSION['usps_rate'] = $usps_rate; 
$ups_tot = $ups_rate + $subtotal; 
$usps_tot = $usps_rate + $subtotal; 
$_SESSION['ups_tot'] = $ups_tot; 
$_SESSION['usps_tot'] = $usps_tot; 
$_SESSION['subtotal'] = $subtotal; 
$base_total = $subtotal+$usps_rate; 
$handling = number_format((float) ($base_total*0.029) + .30, 2, '.', ''); 
$total = number_format($handling+$base_total, 2, '.', ''); 

$returnURL = append_sid("{$url}cart.php", 'mode=paypal_transaction&currencyCodeType='.urlencode($currencyCodeType).'&paymentType='.urlencode($paymentType)); 
$cancelURL = append_sid("{$url}cart.php", 'paymentType='.urlencode($paymentType)); 

$nvpstr = ""; 
$shiptoAddress = "&PAYMENTREQUEST_0_SHIPTONAME=$personName&PAYMENTREQUEST_0_SHIPTOSTREET=$SHIPTOSTREET&PAYMENTREQUEST_0_SHIPTOCITY=$SHIPTOCITY&PAYMENTREQUEST_0_SHIPTOSTATE=$SHIPTOSTATE&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE=$SHIPTOCOUNTRYCODE&PAYMENTREQUEST_0_SHIPTOZIP=$SHIPTOZIP"; 

$nvpstr = '&ADDRESSOVERRIDE=1'.$shiptoAddress.'&MAXAMT='.(string)$total."&PAYMENTREQUEST_0_AMT=".(string)$total."&PAYMENTREQUEST_0_ITEMAMT=".(string)$subtotal.'&CALLBACKTIMEOUT=4&PAYMENTRREQUEST_0_HANDLINGAMT='.$handling.'&PAYMENTREQUEST_0_SHIPPINGAMT='.$usps_rate.'&ReturnUrl='.$returnURL.'&CANCELURL='.$cancelURL.'&PAYMENTINFO_0_CURRENCYCODE='.$currencyCodeType.'&PAYMENTREQUEST_0_PAYMENTACTION='.$paymentType.$itmStr; 

使用上面的代码,我使用以下参数调用 SetExpressCheckout:

&ADDRESSOVERRIDE=1&PAYMENTREQUEST_0_SHIPTONAME=test user&PAYMENTREQUEST_0_SHIPTOSTREET=123 somewhere st&PAYMENTREQUEST_0_SHIPTOCITY=mytown&PAYMENTREQUEST_0_SHIPTOSTATE=NC&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE=US&PAYMENTREQUEST_0_SHIPTOZIP=12345&MAXAMT=64.71&PAYMENTREQUEST_0_AMT=64.71&PAYMENTREQUEST_0_ITEMAMT=50.64&CALLBACKTIMEOUT=4&PAYMENTRREQUEST_0_HANDLINGAMT=2.12&PAYMENTREQUEST_0_SHIPPINGAMT=11.95&ReturnUrl=http://xxxx/cart.php?mode=paypal_transaction&sid=XXX&CANCELURL=http://therealmsofwickedry.com/cart.php?mode=paypal_transaction&sid=XXX&PAYMENTINFO_0_CURRENCYCODE=USD&PAYMENTREQUEST_0_PAYMENTACTION=Sale&L_PAYMENTREQUEST_0_NUMBER0=3320&L_PAYMENTREQUEST_0_NAME0=ITem number 1&L_PAYMENTREQUEST_0_AMT0=47.32&L_PAYMENTREQUEST_0_QTY0=1&L_PAYMENTREQUEST_0_DESC0=No description available&L_PAYMENTREQUEST_1_NUMBER0=4605&L_PAYMENTREQUEST_1_NAME0=Item number 2&L_PAYMENTREQUEST_1_AMT0=3.32&L_PAYMENTREQUEST_1_QTY0=1&L_PAYMENTREQUEST_1_DESC0=No description available

我没有传递参数吗?我是否以某种方式对它们进行了错误编码?任何指针将不胜感激!

【问题讨论】:

  • 您的 URL 编码是否正确?您的 $returnURL 或 $cancelURL 似乎没有经过 URL 编码。
  • @Josh 我确实注意到这些有问题。看起来 URI 由于某种原因翻了一番。我以为您只需要对值进行编码,而不是对整个 URL 进行编码?
  • 每个 NVP 的所有值都必须经过 url 编码。因为您的返回 URL http://... 是名称 returnURL 的值,所以它也必须被编码,而不仅仅是它的一部分。这有意义吗?
  • @Josh 实际上确实如此。但这会导致 Paypal 抛出有关数字总数的特定错误吗?
  • 我不确定,但是对 NVP 中未编码的任何值进行 URL 编码是安全的,看看会发生什么。

标签: php paypal paypal-nvp


【解决方案1】:

您每次都在重复相同的列表项。例如,如果你有 'NUMBER0',你应该有 'NUMBER'.$c.'='...等(其中 $c 从 0 开始,每次通过循环递增)每个 AMT0 都一样, QTY0 等。由于 PayPal 只会添加一项来获得其总数,因此如果您的总数超过一项,则会出现数学错误。 我对这个很陌生,如果我误解了,请道歉

【讨论】:

  • 这似乎是问题所在,因为它已经清除了该特定错误消息。但是,现在我收到了Internal Error: Timeout Processing Request
  • @chaosKreator:当身份验证数据出现错误时,PayPal 有时会超时 - 从沙箱复制和粘贴后,我卡住了一次,最后有一个额外的空间
  • 是的,我已经读过。我仔细检查了我的信息几次,一切似乎都是正确的。不知道发生了什么。我似乎无法在 X.com 上得到答案。 ://
猜你喜欢
  • 2021-01-20
  • 2013-01-08
  • 2012-11-29
  • 2015-11-17
  • 2012-05-21
  • 1970-01-01
  • 2016-05-05
  • 2016-10-13
相关资源
最近更新 更多