Я использую платежный шлюз 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";
на странице подтверждения он показывает реальную сумму, а остальные пустые, но все еще не идут к платежному шлюзу, где пользователь может ввести данные своей карты
Я не могу представить, что принимающий сервер хочет запятые в значении. Кроме того, вы должны создать такую строку запроса, чтобы избежать проблем с неэкранированными значениями:
<?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");
то, что я написал в первую очередь, работает очень хорошо ..
если я изменю 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
«
Я дважды проверил орфографию и значения / параметры
Это может помочь кому-то еще в будущем ..