【问题标题】:PayPal returns ACK Failure on SetExpressCheckoutPayPal 在 SetExpressCheckout 上返回 ACK 失败
【发布时间】:2013-01-19 14:49:17
【问题描述】:

我尝试通过在 PayPal 中提供以下数据来获取 PayPal 的令牌:

Array
(
    [PAYMENTREQUEST_0_CURRENCYCODE] => EUR
    [PAYMENTREQUEST_0_INVNUM] => TLT-GR-1
    [RETURNURL] => http://www.mysite.ext/my_app/payment-completed/
    [CANCELURL] => http://www.mysite.ext/my_app/payment-canceled/
    [PAYMENTREQUEST_0_PAYMENTACTION] => Sale
    [SOLUTIONTYPE] => Sole
    [L_PAYMENTREQUEST_0_NAME0] => Product Description
    [L_PAYMENTREQUEST_0_AMT0] => 0.38
    [L_PAYMENTREQUEST_0_QTY0] => 19.27
    [PAYMENTREQUEST_0_AMT] => 7.32
    [PAYMENTREQUEST_0_ITEMAMT] => 1
)

这是生成上述数组值的代码:

$data           =   array();

$data['PAYMENTREQUEST_0_CURRENCYCODE']  =   $currencyCode;
$data['PAYMENTREQUEST_0_INVNUM']        =   $order->ID;
$data['RETURNURL']                      =   $returnUrl;
$data['CANCELURL']                      =   $cancelUrl;
$data['PAYMENTREQUEST_0_PAYMENTACTION'] =   'Sale';
$data['SOLUTIONTYPE']                   =   'Sole';

$subtotal   =   0;
$tax        =   0;
$counter    =   0;

foreach($products as $product)
{
    if($product->Type == 0)     //  Production is diretion
    {
        if($product->NightDuration == 0)
        {
            $price  =   round($product->Price   ,   2);
            $qty    =   round($product->Qty     ,   2);

            $data['L_PAYMENTREQUEST_0_NAME'         .   $counter]   =   $product->Title;
            $data['L_PAYMENTREQUEST_0_AMT'          .   $counter]   =   $price;
            $data['L_PAYMENTREQUEST_0_NUMBER'       .   $counter]   =   ($counter + 1);
            $data['L_PAYMENTREQUEST_0_QTY'          .   $counter]   =   $qty;
            $data['L_PAYMENTREQUEST_0_TAXAMT'       .   $counter]   =   round(($qty * $price) * ($taxPercentage / 100), 2);
            $data['L_PAYMENTREQUEST_0_ITEMCATEGORY' .   $counter]   =   'Digital';
            $subtotal                                               +=  $qty * $price;
            $tax                                                    +=  ($qty * $price) * ($taxPercentage / 100);
        }
        else
        {

        }
    }
    else
    {

    }

    $counter++;
}

$data['PAYMENTREQUEST_0_AMT']           =   round($subtotal + $tax, 2);
$data['PAYMENTREQUEST_0_ITEMAMT']       =   1;
$data['PAYMENTREQUEST_0_TAXAMT']        =   round($tax, 2);
echo "<pre>";
print_r($data);
echo "</pre>";
$data                                   =   http_build_query($data, '', '&');

$pp =   new TaxiBookingPayPal();
$rt =   $pp->PPHttpPost('SetExpressCheckout', $data);

echo "<pre>";
print_r($rt);
echo "</pre>";

我从 PayPal 得到以下结果:

Array
(
    [TIMESTAMP] => 2013%2d01%2d19T14%3a44%3a25Z
    [CORRELATIONID] => bdfce7f34a1db
    [ACK] => Failure
    [VERSION] => 94
    [BUILD] => 4181146
    [L_ERRORCODE0] => 10413
    [L_SHORTMESSAGE0] => Transaction%20refused%20because%20of%20an%20invalid%20argument%2e%20See%20additional%20error%20messages%20for%20details%2e
    [L_LONGMESSAGE0] => The%20totals%20of%20the%20cart%20item%20amounts%20do%20not%20match%20order%20amounts%2e
    [L_SEVERITYCODE0] => Error
)

你能看出这段代码有什么问题吗?有谁可以帮帮我吗?

经过长时间研究我的代码,我发现问题出在我的数字中的十进制数字上。问题是我不知道小数到底有什么问题:(

谢谢

【问题讨论】:

    标签: php paypal paypal-sandbox


    【解决方案1】:

    ITEMAMT + TAXAMT + SHIPPINGAMT + HANDLINGAMT 必须等于 AMT。

    ITEMAMT 应该只是项目的小计,但你只传递了一个 1。

    此外,您的数量为 19.27。我从来没有专门测试过他们是否会接受这样的 QTY 值,但即使他们接受了,你的 ITEMAMT 应该是 7.32。

    在这种情况下,您不会传递其他值,因此您的 ITEMAMT 和 AMT 将是相同的。您在此处传递的 1 会导致您遇到错误,因为它不计入您的 AMT。

    【讨论】:

    • 我已经更改了我的代码并进行了更正,现在可以正常工作了。问题在于数量。在我的情况下,因为我不能在 L_PAYMENTREQUEST_0_QTY0 中使用小数,所以我已经计算了最终价格,然后我将它设置为商品的 AMT 并将 QTY 设置为 1,但是您仍然可以看到这是一种错误的方法。
    【解决方案2】:

    查看错误信息:购物车商品总金额与订单金额不匹配。

    您发送给 PayPal 的号码不正确。 (你确定你的计算是正确的吗?)

    【讨论】:

    • 我已经尝试过手动计算并且是正确的,为什么不自动呢?
    • 我刚刚更新了我的问题,通过放置生成数据的 PHP 代码来查看我的代码是什么
    【解决方案3】:

    检查任何金额值是否不超过两位小数,例如“12.123”不是有效金额,而“12.12”是有效金额。

    在准备购物车时,购物车的总金额+额外费用(税费+运费)必须等于总金额

    【讨论】:

    • 你是对的。就我而言,我有一些四位数的值,但在使用这些值之前,我用两位小数的长度将它们四舍五入。
    猜你喜欢
    • 2013-09-05
    • 2016-05-02
    • 2012-02-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多