HARDPLATON
@HARDPLATON

Как правильно принять http уведомление от qiwi на php?

Есть документация https://developer.qiwi.com/ru/p2p-payments/#notifi... то что информация приходит методом POST это понятно, но вот как сделать авторизацию уведомлений не пойму. Можете помочь написать этот скрипт?
  • Вопрос задан
  • 716 просмотров
Пригласить эксперта
Ответы на вопрос 3
vabka
@vabka
Токсичный шарпист
После получения входящего уведомления необходимо проверить его подлинность. Для этого используется механизм цифровой подписи. Подпись уведомления отправляется в HTTP заголовке X-Api-Signature-SHA256. Для формирования подписи используется механизм проверки целостности HMAC с хэш-функцией SHA256.

Алгоритм проверки подписи:

1. Объединить значения следующих параметров уведомления в одну строку с разделителем |:

invoice_parameters = {amount.currency}|{amount.value}|{billId}|{siteId}|{status.value}

где {*} – значение параметра. Все значения при проверке подписи должны трактоваться как строки.

2. Вычислить HMAC-хэш c алгоритмом хэширования SHA256:

hash = HMAС(SHA256, invoice_parameters, secret_key) Где:

secret_key – ключ функции ;
invoice_parameters – строка из п.1;
3. Сравнить значение заголовка X-Api-Signature-SHA256 с результатом из п.2.

Процесс авторизации уведомления необходим, чтобы вы, как получатель уведомления, могли подтвердить, что этот запрос реально пришёл от QIWI
Какой из пунктов не понятен?

Ну и ещё сам киви пишет
Данный сервис не является обязательным для интеграции, вы можете реализовать более простой вариант с опросом статуса счета.
Ответ написан
Комментировать
JaxAdam
@JaxAdam
Junior Full-Stack Developer
Очень просто.
1) При регистрации транзакции (перевода) вы сохраняете данные необходимые для авторизации транзакции в БД веб-сервиса. Данные описаны в первом шаге в документации в разделе "Авторизация уведомлений":
invoice_parameters = {amount.currency}|{amount.value}|{billId}|{siteId}|{status.value}

2) Уведомление о переводе приходит вам в виде POST запроса, с телом запроса есть примеры в документации. Из заголовков (headers) запроса вы берете заголовок X-Api-Signature-SHA256. Обращаясь к базе вытаскиваете данные для авторизации уведомления. Дальше обращаясь к API Qiwi проверяете подлинность.
3) Если API прислал ответ со статусом 200 делаете что надо с уведомлением. Если нет, то ничего не делаете)
Ответ написан
Комментировать
alexrnov
@alexrnov
Авторизация уведомлений Qiwi Wallet в Kotlin.
Возможно это кому-нибудь подскажет как реализовать авторизацию на PHP.

import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
...
private fun checkSignature(req: HttpServletRequest): Boolean {
    val signature: String = req.getHeader("Signature") ?: return false
    val parameters = paymentId + "|" + createdDateTime + "|" + amount.value

    val hmacSha256: Mac = Mac.getInstance("HmacSHA256")
    hmacSha256.init(SecretKeySpec(apiKeyToken.toByteArray(), "HmacSHA256"))
    val result = Hex.encodeHexString(hmacSha256.doFinal(parameters.toByteArray()))

    return signature == result
}

Параметры: paymentId, createdDateTime, amount.value, берутся из параметров уведомления.
apiKeyToken - тот же токен, который используется и при авторизации запросов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы