Подпись уведомления отправляется в заголовке X-Api-Signature-SHA256. Для формирования подписи используется механизм проверки целостности HMAC с хэш-функцией SHA256.
Алгоритм проверки подписи:
1) Объединить значения параметров в одну строку с разделителем |:
invoice_parameters = {amount.currency}|{amount.value}|{billId}|{siteId}|{status.value}
где {*} – значение параметра уведомления. Все значения при проверке подписи должны трактоваться как строки.
2) Вычислить HMAC-хэш c алгоритмом хэширования SHA256:
hash = HMAС(SHA256, secret_key, invoice_parameters) Где:
secret_key – ключ функции ;
invoice_parameters – строка из п.1;
3)Сравнить значение заголовка X-Api-Signature-SHA256 с результатом из п.2.
<?php
$validSignatureFromNotificationServer = '07e0ebb10916d97760c196034105d010607a6c6b7d72bfa1c3451448ac484a3b';
$notificationData = [
'bill' => [
'siteId' => 'test',
'billId' => 'test_bill',
'amount' => ['value' => 1, 'currency' => 'RUB'],
'status' => ['value' => 'PAID']
],
'version' => '3'
];
$merchantSecret = 'test-merchant-secret-for-signature-check';
/** @var \Qiwi\Api\BillPayments $billPayments */
$billPayments->checkNotificationSignature(
$validSignatureFromNotificationServer, $notificationData, $merchantSecret
); // true
?>
После того, как был получен входящий запрос-уведомление, необходимо проверить подлинность цифровой подписи и отправить ответ в формате JSON. В ответе должен вернуться код результата обработки уведомления. Код результата должен находиться в параметре error.
<?php
require_once 'QIWI/src/BillPayments.php';
require_once 'QIWI/vendor/curl/curl/src/Curl/Curl.php';
const SECRET_KEY = 'eyJ2ZXJzaW9uIjoiUDJQIiwiZGF0YSI6eyJwYXlpbl9tZXJjaGFudF9zaXRlX3VpZCI6ImF6YXYtMDAiLCJ1c2VyX2lkIjoiNzkwNjQ1Nzg4OTUiLCJzZWNyZXQiOiIwNWVhZmUwNzNjMTFlM*******************************';
/** @var \Qiwi\Api\BillPayments $billPayments */
$billPayments = new Qiwi\Api\BillPayments(SECRET_KEY);
$billId = time() + 10 * 5; // '893794793973'
$fields = [
'amount' => 1.00,
'currency' => 'RUB',
'comment' => 'test',
'expirationDateTime' => '2019-04-16T21:45:00+03:00'
];
$response = $billPayments->createBill($billId, $fields);
$payUrl = $response['payUrl'];
if ($payUrl) {
header ('Location: ' . $payUrl);
}
?>
Установка с помощью npm: