Перейти к содержанию

Уведомления

Чтобы партнёр мог отслеживать состояние операций, QIWI использует уведомления — HTTPS POST-запросы, отправляемые на URL-адрес партнёра.

Структура

Каждый запрос состоит из заголовков и тела.

Заголовок запроса Signature содержит цифровую подпись. Цифровая подпись используется для защиты от подмены запросов: по её значению можно понять, что уведомление поступило от QIWI, а не от мошенников.

Тело запроса содержит строковое представление JSON-объекта с данными уведомления (data). Набор данных зависит от типа операции, для которого сформировано уведомление.

Уведомления могут приходить о состоянии как финансовой, так и нефинансовой операции. Пример финансовой операции — подтверждение платежа, нефинансовой — проверка карты.

Описание уведомлений и примеры их содержимого см. в документации API приёма платежей.

Сценарий

Каждый раз при получении уведомления сервер партнёра должен:

В случае расхождения уведомление следует игнорировать.

Обратите внимание

Ответственность за возможные финансовые потери, произошедшие из-за отсутствия валидации подписи, лежит на партнёре.

Уведомления о платежах следует принимать только с указанных ниже диапазонов IP-адресов компании QIWI:

  • 79.142.16.0/20
  • 195.189.100.0/22
  • 91.232.230.0/23
  • 91.213.51.0/24

При получении и обработке уведомления сервер партнёра должен вернуть HTTP-код 200 OK. До этого момента QIWI будет повторять попытку отправить уведомление в течение определённого времени.

Если по какой-то причине сервер партнёра успешно получил и обработал уведомление, но не вернул 200 OK, при повторной попытке доставки не нужно обрабатывать такое уведомление, как уведомление о новом событии.

Пример успешного сценария получения уведомления изображён на диаграмме ниже.

%%{init: {
    "sequence" : {
        "wrap":true,
        "messageFontSize":14,
        "noteFontSize":14,
        "actorMargin":90 }}}%%
sequenceDiagram
    participant B as QIWI
    participant P as Партнёр
    Note left of B: Клиент оплатил товар или услугу
    B->>P: Уведомление о событии (Signature, data)
    P->>P: Вычисление подписи
    P->>P: Сравнение с Signature
    Note over P: Результат вычисления равен значению из Signature
    P->>B:  HTTP Status: 200 OK
    B->>B: Результат получения — успешный

Обратите внимание

Если уведомление не поступило в течение 10 минут с момента совершения операции, необходимо выполнить запрос статуса операции.

Вычисление цифровой подписи

Для вычисления подписи необходимы строковые представления «секрета» (secret) и подписываемых данных, т.е. параметров тела уведомления (parameters).

Значение secret совпадает со значением ключа серверных уведомлений, указанным в разделе «Настройки» личного кабинета.

Обратите внимание

Необходимо обеспечить надежное хранение secret и не допускать несанкционированный доступ к нему.

Подпись вычисляется для следующих параметров тела уведомления:

Тип операции Параметры
PAYMENT • payment.paymentId
• payment.createdDateTime
• payment.amount.value
REFUND • refund.refundId
• refund.createdDateTime
• refund.amount.value
CAPTURE • capture.captureId
• capture.createdDateTime
• capture.amount.value
CHECK_CARD • checkPaymentMethod.requestUid
• checkPaymentMethod.checkOperationDate
PAYOUT • payout.payoutId
• payout.createdDateTime
• payout.amount.value

Алгоритм вычисления подписи

  1. Приведите значения нужных параметров к строковому представлению (UTF-8) и объедините их в одну строку.

    Пример

    parameters = {payment.paymentId}|{payment.createdDateTime}|{payment.amount.value}

  2. Вычислите хэш (HMAC), используя алгоритм SHA256: hash = HMAС(SHA256, secret, parameters).

Полученное в п.2 значение сравнивается со значением заголовка Signature в уведомлении.

Обратите внимание

В payment.amount.value необходимо всегда передавать число с указанием дробной части.

❌ Нет ✅ Да
1 1.00

URL-адрес

URL-адрес получения уведомлений задаётся для определённого siteId и указывается в личном кабинете в разделе «Настройки».

Чтобы указать URL-адрес для отдельной операции, используйте:

URL-адрес должен начинаться с https, так как уведомления отправляются по протоколу HTTPS на порт 443. URL-адрес должен быть доступен из Интернета.

Сертификат сайта должен быть выпущен доверенным центром сертификации: Comodo, Verisign, Thawte и т.п.

Частота отправки уведомлений

Уведомления, которые QIWI расценивает как неуспешно доставленные, распределяются по очередям для повторной отправки:

  • 1 попытка с отложенным временем 5 секунд;
  • 1 попытка с отложенным временем 1 минута;
  • 3 попытки с отложенным временем по 5 минут.

Время повторной отправки может быть увеличено.

Пример уведомления

Важная информация

Запрос приведён в качестве примера: полный список уведомлений, их актуальные формат и набор параметров см. в разделе «Серверные уведомления» документации API приёма платежей.

Успешное холдирование средств
{
  "payment": {
    "type": "PAYMENT",
    //paymentId, необходимый для подтверждения платежа
    "paymentId": "824c7744-1650-4836-abaa-842ca7ca8a74",
    "createdDateTime": "2022-07-27T12:43:35+03:00",
    "merchantSiteUid": "test-00",
    "status": {
        "value": "SUCCESS",
        "changedDateTime": "2022-07-27T12:43:47+03:00"
    },
    "amount": {
        "value": 1.00,
        "currency": "RUB"
    },
    "paymentMethod": {
        "type": "CARD",
        "maskedPan": "512391******6871",
        "cardHolder": null,
        "cardExpireDate": "3/2030"
    },
    "tokenData": {
        "paymentToken": "cc123da5-2fdd-4685-912e-8671597948a3",
        "expiredDate": "2030-03-01T00:00:00+03:00"
    },
    "customFields": {
        "cf2": "dva",
        "cf1": "1",
        "cf4": "4",
        "cf3": "tri",
        "cf5": "5",
        "full_name": "full_name",
        "phone": "phone",
        "contract_id": "contract_id",
        "comment": "test",
        "booking_number": "booking_number"
    },
    "paymentCardInfo": {
        "issuingCountry": "643",
        "issuingBank": "Тинькофф банк",
        "paymentSystem": "MASTERCARD",
        "fundingSource": "UNKNOWN",
        "paymentSystemProduct": "TNW|TNW|Mastercard® New World—Immediate Debit|TNW|Mastercard New World-Immediate Debit"
    },
    "customer": {
        "email": "darta@mail.ru",
        "account": "11235813",
        "phone": "79850223243"
    },
    "gatewayData": {
        "type": "ACQUIRING",
        "eci": "2",
        "authCode": "0123342",
        "rrn": "001239598011"
    },
    "billId": "191616216126154",
    "flags": [
        "AFT"
    ]
  },
  "type": "PAYMENT",
  "version": "1"
}