【问题标题】:Shopping Cart - update total amount after sales tax change - without reloading page using AJAX购物车 - 更改销售税后更新总金额 - 无需使用 AJAX 重新加载页面
【发布时间】:2012-07-08 03:43:54
【问题描述】:

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

我有一个购物车,它提供小计、税收和总计。用户必须选择他们的州才能知道我们是否收取税款。然后,他们单击“结帐”,这实际上是与 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 页面,在该页面中检查 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 变量设置为我们的新组合总数。

【问题讨论】:

    标签: php ajax shopping-cart authorize.net


    【解决方案1】:

    删除了 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

    其他运输信息(2 级数据) 税 (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);
    

    【讨论】:

    • 我正在使用基于数据库的购物车和 Authorize.net SIM。因此,当 ajax 发布到 php 页面时,是在我将计算出的税款插入数据库时​​吗?这是否会立即更新我的购物车以显示计算的税款?如果用户选择触发功能的 MI (michigan),则发送帖子,计算税金。所以在php页面的某个地方我可以更新数据库购物车来显示新的金额?我不知道这会在不刷新页面的情况下立即显示。如果是这样,那就太棒了!
    • 1.用户选择触发功能的 MI(密歇根州),发送帖子,计算税款,将税款保存在 DB 购物车中,使用 JSON 返回税款和其他金额。 2. Javascript 从步骤 1 中获取金额,解析并显示它们。 3. 点击提交按钮并调用另一个 Ajax 方法,向 Authorize.net 发出 curl 请求,并将值存储在会话中(我提供了一些用于实现上述目的的类)
    • 等一下,我刚刚读到您正在使用 SIM 方法阅读我帖子底部的编辑
    • 我觉得这很接近。单击“提交”时,它不会添加税。我什至尝试手动输入此 并且仍然没有添加它在。这是必须在 Authorize.net 中设置的东西才能接受 x_tax 字段并添加它吗?
    • 我粘贴了一个指向 sim 文档的链接,确保您按照它所说的方式做所有事情(我总是瞄准,所以我对此没有太多经验)也使用 &lt;|&gt; 作为根据文档,分隔符不仅仅是|
    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多