【问题标题】:Error when subtotal (ITEMAMT) is $0.00小计 (ITEMAMT) 为 $0.00 时出错
【发布时间】:2013-10-05 17:08:20
【问题描述】:

当我尝试使用小计为 0.00 美元的 PayPal API 时,我收到以下错误:

[10413] => 购物车商品总金额与订单金额不匹配。

这是传递给 SetExpressCheckout 的请求数据(个人信息替换为 ...):

    [0] => L_PAYMENTREQUEST_0_AMT0=9.99
    [1] => L_PAYMENTREQUEST_0_NAME0=Name
    [2] => L_PAYMENTREQUEST_0_QTY0=1
    [3] => L_PAYMENTREQUEST_0_NUMBER0=1
    [4] => L_PAYMENTREQUEST_0_AMT1=-9.99
    [5] => L_PAYMENTREQUEST_0_NAME1=Discount
    [6] => L_PAYMENTREQUEST_0_QTY1=1
    [7] => L_PAYMENTREQUEST_0_NUMBER1=0
    [8] => PAYMENTREQUEST_0_AMT=2.51
    [9] => PAYMENTREQUEST_0_ITEMAMT=0.00
    [10] => PAYMENTREQUEST_0_SHIPPINGAMT=2.38
    [11] => PAYMENTREQUEST_0_TAXAMT=0.13
    [12] => PAYMENTREQUEST_0_SHIPTONAME=...
    [13] => PAYMENTREQUEST_0_SHIPTOSTREET=...
    [14] => PAYMENTREQUEST_0_SHIPTOSTREET2=...
    [15] => PAYMENTREQUEST_0_SHIPTOCITY=...
    [16] => PAYMENTREQUEST_0_SHIPTOSTATE=...
    [17] => PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE=...
    [18] => PAYMENTREQUEST_0_SHIPTOZIP=...
    [19] => PAYMENTREQUEST_0_SHIPTOPHONENUM=...
    [20] => CANCELURL=...
    [21] => RETURNURL=...
    [22] => NOSHIPPING=1
    [23] => ALLOWNOTE=0

我怎样才能让它工作?

【问题讨论】:

    标签: paypal paypal-sandbox express-checkout


    【解决方案1】:

    “PAYMENTREQUEST_0_ITEMAMT=0.00”必须大于零。

    https://www.paypalobjects.com/webstatic/en_US/developer/docs/pdf/pp_nvpapi_developerguide.pdf 第 72 页

    [....字符长度和限制:值是一个正数,以任何货币计不得超过 10,000 美元.....]

    【讨论】:

    • 我认为这是针对 AMT,而不是 ITEMAMT(这是所有 AMT 的总和)。
    • 如果 ITEMAMT 是所有 AMT 的总和,并且每个 AMT 都必须大于零,那么根据定义,ITEMAMT 不能为零。
    • 了解您在这里想要完成的工作会很有帮助。您想免费“出售”一件商品,但仍要收取运费和税费吗?在您的示例中,AMT 是 ITEMAMT、SHIPPINGAMT 和 TAXAMT 的总和,而不是(正如您在评论中所说)“ITEMAMT [...] 是所有 AMT 的总和”...
    • @Matthias - AMT 不必大于零。将折扣传递给 PayPal 的方式是传递一个负的 AMT(您可以在我的问题中看到我所做的)。 PayPal 文档显示折扣以这种方式运作。
    • @RaphaelSchweikert - 有时我给客户优惠券导致购物车小计为 0.00 美元,但他们仍然需要完成结帐(出于多种原因,一个是我想在 PayPal 中记录订单,另一个是仍然收取运费,他们需要为此付费)。
    【解决方案2】:

    我在您的代码中看不到 order total 参数。请检查!

    同时我使用以下参数测试调用:

                List<PaymentDetailsItemType> lineItems = 
                                  new ArrayList<PaymentDetailsItemType>();
    
                PaymentDetailsItemType item = new PaymentDetailsItemType();
                BasicAmountType amt = new BasicAmountType();
    
                amt.setCurrencyID(CurrencyCodeType.fromValue(dto.getCurrencyCode()));
                amt.setValue("9.99");
    
                item.setAmount(amt);
    
                item.setQuantity(dto.getItemQuantity());
                item.setName("Name");
                item.setNumber("1");
    
                lineItems.add(item);
    
                PaymentDetailsItemType item1 = new PaymentDetailsItemType();
                BasicAmountType amt1 = new BasicAmountType();
    
                amt1.setCurrencyID(CurrencyCodeType.fromValue(dto.getCurrencyCode()));
                amt1.setValue("-9.99");
    
                item1.setAmount(amt1);
                item1.setQuantity(dto.getItemQuantity());
                item1.setName("Discount");
                item1.setNumber("0");
                lineItems.add(item1);
                ...
    
            BasicAmountType itemsTotal = new BasicAmountType();
            itemsTotal.setValue(Double.toString(itemTotal));
    
            BasicAmountType orderTotal = new BasicAmountType();
            orderTotal.setValue(Double.toString(orderTotal));
    

    itemTotal 和 orderTotal 为 0。我得到了 10525: This transaction cannot be processed. The amount to be charged is zero.

    也许我的代码可以使用其他参数,然后是您的代码。我认为如果您将订单总额添加到您的代码中,您将得到相同的 10525。

    请检查!

    编辑:

    我在网上找到了这个解释:

    如果一个或多个小计为零,您可以包括 请求中值为 0 的字段,传递一个空字符串,或者 将字段完全排除在请求之外。然而,总和 剩余小计字段(如果指定)必须加起来为 AMT。

    Here is a link.

    【讨论】:

    • 是的,如果订单总额为零,我会收到该错误,但在我的情况下,订单总额不为零,而是小计为零。
    【解决方案3】:

    您可以添加临时商品以进行结帐,并添加更多折扣运费以减去临时商品数量。 Paypal 接受的最低金额为 0.01 美元。 这是我的代码。它适用于我的情况:

                var itemDetails = new PaymentDetailsItemType();
                itemDetails.Name = "Shipping and Handling";
                itemDetails.Amount = new BasicAmountType(currency, "0.01");
                itemDetails.Quantity = 1;
                //itemDetails.Tax = new BasicAmountType(currency, tax.ToString());
                itemDetails.ItemCategory = ItemCategoryType.PHYSICAL;
    
    
                itemDetails.Description = "Item temporary for payment.";
                paymentDetails.PaymentDetailsItem.Add(itemDetails);
    
                itemTotal = (double)0.01;
                paymentDetails.ShippingDiscount = new BasicAmountType(currency, "-0.01"); 
    

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 2020-02-22
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多