购物车 - 更新销售税后的总金额 - 无需使用AJAX重新加载页面

时间:2012-07-08 12:44:45

标签: php ajax shopping-cart authorize.net

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

我有一个购物车,可以提供小计,税金和总计。用户必须选择他们的状态才能知道我们是否收取税款。然后,他们点击“checkout”,这实际上是一个与Authorize.net绑定的按钮。我的客户端不希望页面重新加载或刷新,所以我必须使用Ajax在页面选择状态后更新页面。

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

状态下拉菜单包含onchange="doStateTax()"。其中GRANDtotalprice是隐藏字段,其中包含购物车中所有商品的总计,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页面,它会检查状态=“密歇根”。如果是这样,他们将被征收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;
?>

这里我不知道这个过程是如何运作的......我认为结果会回到所谓的“成功回调”中吗?我确实看到了小计,税金和总额的变化,以便DOES正常运作。它显示了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(密歇根州)时,它会给出响应代码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”部分被您的脚本替换,但上面$指纹的$ amount部分不会被脚本更改。我认为Authorize.net需要指纹部分和隐藏的字段要匹配。这让我回到如何将这个$ amount变量设置为我们新的合计总数。

1 个答案:

答案 0 :(得分:2)

删除了一套用于目标方法的STUFF B / C

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

修改

有一个名为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

  

其他运输信息(2级数据)   税   (x_tax)   值:有效税额或分隔税务信息   格式:提交分隔税务信息时,必须为值   由括号内的管道界定&lt; |&gt;   注意:收取税额或在提交此信息时   HTML表格POST的手段,包括的分隔税法信息   还允许销售税名称,描述和金额。   税项名称&lt; |&gt;   税务说明&lt; |&gt;   税额   格式:提交分隔时不允许使用美元符号($)   信息。   注意:x_amount中的事务总量必须包括   这一数额。   例:   州税&lt; |&gt; 0.0625“&gt;

另一个编辑

在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);