Я пытаюсь использовать доступ к API для моего локального провайдера, так как в документации API сказано, что я должен отправлять параметры записи также с хеш-значением в путь API-шлюза. Api gate way возвращает мне ошибку 010, когда я отправил эту ошибку по почте, они сказали, что ошибка хеш-значения. Как сказано в документации API, я должен отсортировать все входные параметры в post по ascii для создания строки подписи, а затем преобразовать строку подписи с hash_mac по секретному ключу пользователя. Я путаю с «сортировкой всех входных параметров по ascii», что это значит. Любое объяснение очень ценится.
Документация сказала —
Значение хеша, вычисленное HMACSHA1 с секретным ключом, предоставленным провайдером. HashValue будет генерироваться следующими методами:
1. Все входные параметры, которые заполняются клиентом, сортируются по ASCII, чтобы быть Строкой подписи.
2. Строка подписи будет зашифрована HMACSHA1 с предоставлением секретного ключа
по провайдеру.
Пример кода Api для генерации хеш-значения
<?php
$signData = hash_hmac('sha1',
SignatureString,Secret Key, false);
$signData= strtoupper($signData);
echo urlencode($signData);
?>
Пользовательские параметры ввода
<form action="http://121.143.168.11/Payment/Payment/pay" method="post">
<input type="hidden" id="merchantID" name="merchantID" value="382987634198262"/>
<input type="hidden" id="invoiceNo" name="invoiceNo" value="0345"/>
<input type="hidden" id="productDesc" name="productDesc" value="TESTProduct"/>
<input type="hidden" id="amount" name="amount" value="000000010000"/>
<input type="hidden" id="currencyCode" name="currencyCode" value="104"/>
<input type="hidden" id="categoryCode" name="categoryCode" value="000012"/>
<input type="hidden" id="userDefined1" name="userDefined1" value="UserDefined1"/>
<input type="hidden" id="userDefined2" name="userDefined2" value="UserDefined2"/>
<input type="hidden" id="userDefined3" name="userDefined3" value="UserDefined3"/>
<input type="hidden" id="hashValue" name="hashValue" value="BA115F06B0629EC69EDBA33604301B891D5C9F8C"/>
/>
Мой вопрос заключается в том, как я могу сгенерировать строку подписи для указанных выше параметров ввода пользователя.
Спасибо
Предполагая, что вы отправляете эту форму через POST, и что переменные POST не содержат никакого мусора, и что я правильно понимаю инструкцию «отсортировано по»:
$secret = 'XXXXXX';
ksort($_POST); // sort by input names alphabetically
$signature_source = '';
foreach ($_POST as $value) {
$signature_source .= $value;
}
$signature = hash_hmac('sha1', $signature_source, $secret, false);
Не нужно подавать заявку urlencode()
к этому, если на картинке нет чего-то еще, что я скучаю.
$_form_data = array(
'merchantID' => '400123456712345',
'invoiceNo' => '1234567890333',
'productDesc' => 'Test Product',
'amount' => '000000010000',
'currencyCode' => 840,
'userDefined1' => 'userDefined1',
'userDefined2' => 'userDefined2',
'userDefined3' => 'userDefined3',
);
function getPaymentHash($data)
{
asort($data, SORT_STRING); // sorting values by ASCII
$str = implode('', $data);
$signData = hash_hmac('sha1', $str, 'secret key', false);
$signData = strtoupper($signData);
return urlencode($signData);
}
$hashValue = getPaymentHash($_form_data);
удачи 🙂