Как назначить переменную в строку hash_hmac sha256 или данные в php?

Я использую платежный шлюз 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 ="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";

на странице подтверждения он показывает реальную сумму, а остальные пустые, но все еще не идут к платежному шлюзу, где пользователь может ввести данные своей карты

-1

Решение

Я не могу представить, что принимающий сервер хочет запятые в значении. Кроме того, вы должны создать такую ​​строку запроса, чтобы избежать проблем с неэкранированными значениями:

<?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");
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 Спасибо за потраченное время и предложения .. Кодировка 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«

Я дважды проверил орфографию и значения / параметры

Это может помочь кому-то еще в будущем ..

0

По вопросам рекламы [email protected]