据我了解,为了在不重新加载的情况下更新页面或计算价格,我必须使用 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 变量设置为我们的新组合总数。