我正在使用万事达卡支付网关。 如果我对hash_hmac sha256的数据或字符串进行硬编码,那么一切正常。
工作版本:
$vpcURL = 'https://migs.mastercard.com.au/vpcpay?';
$secret = strtoupper("MYSECRET CODE");
$data ="vpc_AccessCode=0E5AC9E6&vpc_Amount=1000&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.examplesite.com/payment-confirmation/&vpc_Version=1";
$sha256_hmac = strtoupper(hash_hmac('sha256', $data, pack('H*', $secret)));
header("Location: " . $vpcURL . "&" . $data . "&vpc_SecureHash=" . $sha256_hmac."&vpc_SecureHashType=SHA256");
但我无法将硬编码值传递给vpc_Amount 我从表格中获取金额,用户可以输入他们想要的金额。
所以我从中获得了金额:
$totalAmount = $_POST['totalAmount'];
现在我想将$ totalAmount传递给$ data。 所以我将$ data更改为:
$data ="vpc_AccessCode=0E5AC9E6&vpc_Amount=$totalAmount&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.examplesite.com/payment-confirmation/&vpc_Version=1";
当我使用此付款网关时,付款网关会直接转到确认页面:https://www.examplesite.com/payment-confirmation/
并且所有值都为空。
我认为这是一个简单的syntex错误..
我该如何解决这个问题?
如何正确地将$totalAmount
传递给$data
?
print_r ($data); gives this:
vpc_AccessCode=0E5AC9E6&vpc_Amount=58,258.00&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.examplesite.com/payment-confirmation/?vpc_Version=1
更新 如果我将代码更新为
$real_integer_amount = filter_var($totalAmount, FILTER_SANITIZE_NUMBER_INT);
$data ="vpc_AccessCode=0E5BC9E7&vpc_Amount={$real_integer_amount}&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.examplesite.com/payment-confirmation/?vpc_Version=1";
在确认页面显示实际金额,其他人是空的,但仍然没有进入支付网关,用户可以输入他们的卡详细信息
答案 0 :(得分:0)
我无法想象接收服务器在值中需要逗号。此外,您应该构建一个这样的查询字符串,以避免未转义值的问题:
public class Category {
String id;
String name;
String createAt;
...
}
public class Product extends Category{
String price;
....
}
Collections.sort(commonArrayList, new Comparator<Category>() {
@Override
public int compare(Category o1, Category o2) {
if(o1.getCreateAt()>o2.getCreateAt()){
return 1;
}else{
...
}
return 0;
}
});
答案 1 :(得分:0)
我在第一篇文章中发布的内容非常精细..
如果我将vpc_amount
更改为有效的任何(硬编码)值。
问题是当我将$totalAmount
分配给vpc_amount
时,变量($ totalAmount)包含小数点和千位分隔符。
这就是这个问题..
我只想在将totalAmount
传递给data
之前清理变量,以使其有效..
所以我把它更新为:
$real_integer_amount = filter_var($totalAmount, FILTER_SANITIZE_NUMBER_INT);
现在这很好..
所以最终的工作代码是:
$vpcURL = 'https://migs.mastercard.com.au/vpcpay?';
$secret = strtoupper("My Secret Code");
$real_integer_amount = filter_var($totalAmount, FILTER_SANITIZE_NUMBER_INT);
$data ="vpc_AccessCode=0E5AC9E6&vpc_Amount=$real_integer_amount&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.trinitycollege.lk/payment-confirmation/&vpc_Version=1";
$sha256_hmac = strtoupper(hash_hmac('sha256', $data, pack('H*', $secret)));
header("Location: " . $vpcURL . "&" . $data . "&vpc_SecureHash=" . $sha256_hmac."&vpc_SecureHashType=SHA256");
@ MagnusEriksson :感谢您的时间和建议..网址编码对此问题没有任何作用。
@ pvg 没有任何拼写错误..如果我只是在{$totalAmount}
使用$data
它不起作用..但这需要这个:{{1 }}
@ miken32 感谢您的回答。我尝试使用您的代码只是将params替换为我的实际细节..但它给了我这个错误“FILTER_SANITIZE_NUMBER_INT
”
我已经仔细检查了拼写和值/参数
这可能在将来帮助别人..