Paypal API:购物车商品金额总额与订单金额不匹配

17

我正在使用Paypal快速结账API,并遇到设置数量的问题。以下是我的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

我已经试了几个小时来解决这个问题,但已经放弃了。有人能够指出我需要做什么来让它工作吗?


你尝试过在 'PAYMENTREQUEST_0_AMT' => "100.00" 的同时设置 L_PAYMENTREQUEST_0_QTY0 = 2'L_PAYMENTREQUEST_0_AMT0' => "100.00" 吗?也许 PayPal 不会计算 2x50.00,而只是查找每行的总额。我这里只是做出了一些假设。 - Jakub
哎呀,那个不起作用。 - Rijndael
我不知道这是否会有帮助,但也许你所有的美元价值都应该格式化为'0.00'。 - thescientist
3个回答

25
你缺少一个ITEMAMT。请参考我在Paypal Express checkout with shipping cost and error 的答案,其中包含了多个数量的工作示例。
&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  

3
这解决了我的“我已经加上了运费,为什么出问题了?”的问题。Paypal文档应该直接链接到这个网站... - s d
有人知道我怎么可以在这个好的例子中添加两个或更多产品吗?谢谢。 - Drk_alien

2

虽然这与问题并不直接相关,但由于在谷歌搜索错误消息时首先出现,这可能对其他遇到此错误的人有用。

如果某些字段未设置(为null / 空白),则可能会出现此错误。

例如,在我的情况下,它是这样的(为了清晰起见添加了换行符):

    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,从而有效地将其从消息中删除,并因此触发此错误,因为如果没有那一行,金额确实不会相加。


0

我也遇到了同样的问题,通过在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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接