2

据我了解,为了在不重新加载的情况下更新页面或计算价格,我必须使用 ajax。正确的?

我有一个购物车,它提供小计、税收和总计。用户必须选择他们的州才能知道我们是否收取税款。然后,他们单击“结帐”,这实际上是与 Authorize.net 相关联的按钮。我的客户不希望页面重新加载或刷新,因此我必须在他们选择状态后使用 Ajax 更新页面。

Authorize.net 有一组变量,例如$amount_var, $loginID,$transactionKey等。他们使用这些变量并将它们放入它们的“隐藏”值中以进行处理。我正在尝试将$amount_var变量更改为等于我的总计算量,这是在 ajax 访问的 php 页面中处理的。

状态下拉菜单有onchange="doStateTax()". WhereGRANDtotalprice是一个隐藏字段,其中包含购物车中所有项目的总和,并且ddl是他们选择的任何状态。

<script type="text/javascript">
    function doStateTax(){
        var grandtotalX = $('#GRANDtotalprice').val();
        var statetaxX = $('#ddl').val();

        $.post('statetax_query.php',
        {statetaxX:statetaxX, grandtotalX:grandtotalX}, 
        function(data) {
            data = $.parseJSON(data);
            $('.products-placeholder').html(data.products);     
            $('.statetax-placeholder').html(data.statetax);     
            $('.total-placeholder').html(data.total);
            // ...
        });
        return false;
    };
</script>

这将发布到一个 PHP 页面,在该页面中检查 state = "michigan"。如果是这样,他们将被征收 6% 的税。这是我进行计算的 PHP 页面:

 <?php
    if (($_POST['statetaxX'] == 'MI'))
    {
        $taxselect = .06;
        $taxselect1 = 1.06;
    }
    else
    {
        $taxselect = 0;
        $taxselect1 = 1;
    }

    $products = number_format(($_POST['grandtotalX']), 2, '.', '');
    $tax = number_format((($_POST['grandtotalX'])*($taxselect)), 2, '.', '');
    $total = number_format((($_POST['grandtotalX'])*($taxselect1)), 2, '.', '');

    $results = array(
       'products' => $products,
       'statetax' => $tax,
       'total' => $total
    );
    $json = json_encode($results);
    echo $json;
?>

这就是我对流程如何工作的想法......我认为结果会回到所谓的“成功回调”,对吗?我确实看到小计、税收和总计会立即发生变化,因此确实有效。由于此代码,它在 a 中显示数字:

$('.total-placeholder').html(data.total);

但这只会显示结果。在我的代码中如何或在哪里导致 Authorize.net 将他们的$amount_var变量更改为我的总数?同样,他们的代码部分位于页面底部附近的我的 php 购物车中:

$amount_var = "youramount;
$loginID        = "loginid";
$transactionKey = "transkey";

如果我可以将我的成功回调注入到他们称为的隐藏字段x_amount中,那将非常容易,但这并不容易。他们$amount_var出于其他原因使用 ,例如设置指纹,因此我必须将它们设置$amount_var为等于我自己的计算。我在php页面中设置吗?还是javascript?别处?

编辑:响应代码 99 错误

几乎可以正常工作。添加代码后,我收到响应代码 99 错误。当我选择一个不需要税收的州时,它会起作用。当我选择 MI (michigan) 时,它会给出响应代码 99。根据我的发现,这是因为这部分之间存在不匹配:

<input type='hidden' name='x_amount' value='<?php echo $amount; ?>' />

和这个:

// The following lines generate the SIM fingerprint.  PHP versions 5.1.2 and
// newer have the necessary hmac function built in.  For older versions, it
// will try to use the mhash library.
if( phpversion() >= '5.1.2' )
    { $fingerprint = hash_hmac("md5", $loginID . "^" . $sequence . "^" . $timeStamp .     "^" . $amount . "^", $transactionKey); }
else 
    { $fingerprint = bin2hex(mhash(MHASH_MD5, $loginID . "^" . $sequence . "^" .         $timeStamp . "^" . $amount . "^", $transactionKey)); }
?>

因为隐藏字段中的“$amount”部分已被您的脚本替换,但上面 $fingerprint 的“$amount”部分并未被脚本更改。我认为 Authorize.net 需要指纹部分和隐藏字段匹配。这让我回到了如何将这个 $amount 变量设置为我们的新组合总数。

4

1 回答 1

2

删除了一堆东西 B/C 它是用于 AIM 方法的

如果需要,请检查我的答案的历史记录

编辑

有一个名为x_tax

在这条线之后

$('.statetax-placeholder').html(data.statetax);

添加这个

$('input[name=x_tax]').val("Tax1<|>state tax<|>"+data.statetax);

来自 SIM 指南第 28 页的底部:http ://www.authorize.net/support/SIM_guide.pdf

ADDITIONAL SHIPPING INFORMATION (Level 2 Data) Tax (x_tax) 值:有效的税额或分隔的税务信息 格式:提交分隔的税务信息时,值必须用括号分隔 <|> 注释:收取的税额或提交时此信息通过 HTML 表单 POST 形式提供,也允许包含销售税名称、描述和金额的分隔税信息。„ 税项名称<|> „ 税项说明<|> „ 税额 格式:提交分隔信息时不允许使用美元符号($)。注意:x_amount 中交易的总金额必须包含这个金额。示例:州税<|>0.0625">

另一个编辑

在 php 端在 ajax 调用中生成指纹(PHP 端):

if( phpversion() >= '5.1.2' )
{
    $fingerprint = hash_hmac("md5", $loginID . "^" . $sequence . "^" . $timeStamp .     "^" . $amount . "^", $transactionKey);
}
else 
{
    $fingerprint = bin2hex(mhash(MHASH_MD5, $loginID . "^" . $sequence . "^" .         $timeStamp . "^" . $amount . "^", $transactionKey));
}

$results = array(
   'products' => $products,
   'statetax' => $tax,
   'total' => $total,
   'fingerprint' => $fingerprint // Pass the fingerprint
);
$json = json_encode($results);
echo $json;

在成功的 Ajax 上:

// Tax amount
$('input[name=x_tax]').val("Tax1<|>state tax<|>"+data.statetax);
// Total amount
$('input[name=x_amount]').val(data.total);
// use the new Fingerprint
$('input[name=x_fp_hash]').val(data.fingerprint);
于 2012-07-08T13:12:18.020 回答