После получения входящего уведомления необходимо проверить его подлинность. Для этого используется механизм цифровой подписи. Подпись уведомления отправляется в 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.
Данный сервис не является обязательным для интеграции, вы можете реализовать более простой вариант с опросом статуса счета.
invoice_parameters = {amount.currency}|{amount.value}|{billId}|{siteId}|{status.value}
X-Api-Signature-SHA256
. Обращаясь к базе вытаскиваете данные для авторизации уведомления. Дальше обращаясь к API Qiwi проверяете подлинность.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
}