据我所知,为了在不重新加载的情况下更新页面或计算价格,我必须使用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页面,在那里它会检查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;
?>
这是我对这个过程如何运作失去思考的地方。。。我认为结果会回到所谓的"成功回调"中,对吧?我确实看到小计、税收和总额立即发生变化,所以这确实有效。它显示的数字在一个因为这个代码在这里:
$('.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"部分被您的脚本替换了,但上面$fingerprint的"$amount"部分没有被脚本更改。我认为Authorize.net需要指纹部分和隐藏字段匹配。这让我回到了如何将这个$amount变量设置为我们新的组合总和。
移走了一堆B/C,这是为了AIM METHOD
如果你想要,请查看我答案的历史记录
编辑
有一个名为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);