如何将变量分配给hash_hmac sha256字符串或php中的数据?

时间:2017-03-08 05:51:43

标签: php string sha256 hmac mastercard

我正在使用万事达卡支付网关。 如果我对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";

在确认页面显示实际金额,其他人是空的,但仍然没有进入支付网关,用户可以输入他们的卡详细信息

2 个答案:

答案 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

我已经仔细检查了拼写和值/参数

这可能在将来帮助别人..