-1

我正在使用万事达卡支付网关。如果我对 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/并且所有值都是空的。

我认为这是一个简单的语法错误..

我怎样才能解决这个问题?如何正确传递$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";

在确认页面中,它显示真实金额,其他为空,但仍未进入支付网关,用户可以在其中输入他们的卡详细信息

4

2 回答 2

0

我无法想象接收服务器想要值中的逗号。此外,您应该构建一个这样的查询字符串以避免未转义值的问题:

<?php
$vpcURL = 'https://migs.mastercard.com.au/vpcpay?';
$secret = strtoupper("MYSECRET CODE");
$totalAmount = str_replace(",", "", $_POST["totalAmount"]);

$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",
];
$data = http_build_query($data);

$sha256_hmac = strtoupper(hash_hmac('sha256', $data, pack('H*', $secret)));
header("Location: " . $vpcURL . "&" . $data . "&vpc_SecureHash=" . $sha256_hmac."&vpc_SecureHashType=SHA256");
于 2017-03-08T06:27:32.680 回答
0

我在第一次发布的内容非常好..

如果我更改vpc_amount为任何有效的(硬编码)值..

问题是当我将变量($totalAmount)分配$totalAmountvpc_amount包含小数点和千位分隔符时..这使得这个问题..

我只是想在将它传递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 :感谢您的时间和建议。URL 编码对这个问题没有任何作用。

@ pvg没有任何拼写错误..如果我只是使用{$totalAmount}$data不起作用..但这需要这个:FILTER_SANITIZE_NUMBER_INT

@ miken32谢谢你的回答。我试图通过用我的实际细节替换参数来使用你的代码..但它给了我这个错误“ HTTP Status - 400 E5000: Cannot form a matching secure hash based on the merchant's request using either of the two merchant's secrets

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

这可能会在将来对其他人有所帮助..

于 2017-03-08T07:26:12.530 回答