1

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
)

そのコードに何か問題がありますか?私を助けてくれる人はいますか?

私のコードを長い間調査した結果、問題は私の数字の10進数に起因していることがわかりました。問題は、小数の何が正確に間違っているのかわからないことです:(

ありがとう

4

3 に答える 3

2

ITEMAMT + TAXAMT + SHIPPINGAMT+HANDLINGAMTはAMTと等しくなければなりません。

ITEMAMTはアイテムだけの小計である必要がありますが、そこには1しか渡されていません。

また、19.27の数量があります。そのようなQTY値を受け入れるかどうかを具体的にテストしたことはありませんが、受け入れる場合でも、ITEMAMTは7.32である必要があります。

この場合、他の値を渡していないため、ITEMAMTとAMTは同じになります。そこを通過する1は、AMTに加算されないため、発生するエラーの原因になります。

于 2013-01-19T19:38:49.187 に答える
1

エラーメッセージを見てください:カートアイテムの金額の合計が注文金額と一致しません。

PayPalに送信する番号が正しくありません。(計算が正しいことを確認しますか?)

于 2013-01-19T15:46:12.787 に答える
1

金額の値に小数点以下2桁以下がないかどうかを確認します。たとえば、「12.123」は無効な金額ですが、「12.12」は有効な金額です。

カートを準備している間、カート+エクストラ(税+送料)の合計金額は合計金額と等しくなければなりません

于 2013-01-21T05:11:51.723 に答える