Проверочные запросы (Check URL)

Если в свойствах счёта магазина выставить Check URL, то магазину, кроме уведомления о проведённой оплате, будут отсылаться проверочные запросы.

Проверочные запросы служат для того, чтобы:

  • Убедиться, что заказ существует, ещё не оплачен и срок действия заказа не истёк.
  • Указать сумму заказа, если магазин не передал сумму в HTML-форме.
  • Проверить статус заказа, если товар уже оплачен.

Проверочные запросы MONETA.Assistant отсылает на указанную страницу магазина Check URL методом GET или POST. Ответ должен быть в формате XML. Во время оплаты одного заказа MONETA.Assistant может несколько раз отсылать проверочные запросы.

Параметры проверочного запроса

MNT_COMMAND
Для проверочных запросов — CHECK. Параметр отсутствует у уведомлений на Pay URL.
MNT_ID
Идентификатор магазина в системе MONETA.RU.
MNT_TRANSACTION_ID
Внутренний идентификатор заказа в магазине.
MNT_OPERATION_ID
Номер операции в системе MONETA.RU. Если операция ещё не создана, поле может отсутствовать.
MNT_AMOUNT
Фактическая сумма без учёта комиссии MONETA.RU. Если магазин не передал сумму в HTML-форме, параметра может не быть — тогда магазин обязан вернуть сумму в ответе, иначе MONETA.Assistant завершит обработку с ошибкой.
MNT_CURRENCY_CODE
ISO-код валюты оплаты заказа.
MNT_SUBSCRIBER_ID
Внутренний идентификатор пользователя в учётной системе магазина.
MNT_TEST_MODE
1 — тестовый режим, 0 — реальный.
MNT_SIGNATURE
Подпись запроса (см. ниже).
MNT_USER
Номер счёта пользователя при оплате с пользовательского счёта в «MONETA.RU». Может отсутствовать, если способ оплаты ещё не выбран.
paymentSystem.unitId
Идентификатор платёжной системы, если выбрана система, отличная от «MONETA.RU». Может отсутствовать.
MNT_CORRACCOUNT
Номер счёта плательщика; при оплате с пользовательского счёта совпадает с MNT_USER. Может отсутствовать.
MNT_CUSTOM1, MNT_CUSTOM2, MNT_CUSTOM3, другие параметры
Параметры, переданные в запросе на оплату через MONETA.Assistant.

Формирование подписи проверочного запроса

В каждом проверочном запросе передаётся MNT_SIGNATURE. Магазин должен вычислить подпись по тем же правилам и сравнить с полученным значением.

MNT_SIGNATURE = MD5(
  MNT_COMMAND + MNT_ID + MNT_TRANSACTION_ID + MNT_OPERATION_ID
  + MNT_AMOUNT + MNT_CURRENCY_CODE + MNT_SUBSCRIBER_ID + MNT_TEST_MODE
  + КОД_ПРОВЕРКИ_ЦЕЛОСТНОСТИ_ДАННЫХ)
  • Не добавляйте параметры и не меняйте порядок полей в формуле.
  • MNT_AMOUNT — с двумя десятичными знаками (1.23, 123.00).
  • Если в запросе нет MNT_OPERATION_ID, MNT_AMOUNT, MNT_SUBSCRIBER_ID, при вычислении подписи эти поля пропускаются (пустая строка, не null, не 0, не пробел). Для уведомления об оплате отсутствует MNT_COMMAND — его также не подставляют.

Примечание: Пример: нет MNT_OPERATION_ID, MNT_AMOUNT и MNT_SUBSCRIBER_ID:

MNT_SIGNATURE = MD5(
  MNT_COMMAND + MNT_ID + MNT_TRANSACTION_ID + MNT_CURRENCY_CODE
  + MNT_TEST_MODE + КОД_ПРОВЕРКИ_ЦЕЛОСТНОСТИ_ДАННЫХ)

Ответ на проверочный запрос

Магазин должен вернуть ответ в XML.

При получении ответа в системе MONETA.RU анализируются поля. MONETA.Assistant прекращает обработку оплаты, если:

  • Не удалось получить ответ от обработчика.
  • Ответ имеет неверный формат.
  • MNT_ID или MNT_TRANSACTION_ID не соответствуют запросу.
  • MNT_RESULT_CODE не из допустимого списка.
  • MNT_SIGNATURE не совпадает с подписью, сгенерированной в MONETA.RU.

Формат ответа на проверочный запрос

<?xml version="1.0" encoding="UTF-8"?>
<MNT_RESPONSE>
  <MNT_ID></MNT_ID>
  <MNT_TRANSACTION_ID></MNT_TRANSACTION_ID>
  <MNT_RESULT_CODE></MNT_RESULT_CODE>
  <MNT_DESCRIPTION></MNT_DESCRIPTION>
  <MNT_AMOUNT></MNT_AMOUNT>
  <MNT_SIGNATURE></MNT_SIGNATURE>
  <MNT_ATTRIBUTES>
    <ATTRIBUTE>
      <KEY></KEY>
      <VALUE></VALUE>
    </ATTRIBUTE>
  </MNT_ATTRIBUTES>
</MNT_RESPONSE>

Поля ответа:

MNT_ID, MNT_TRANSACTION_ID
Идентификаторы магазина и заказа.
MNT_RESULT_CODE
Код ответа (см. таблицу ниже).
MNT_DESCRIPTION
Описание состояния заказа в произвольной форме.
MNT_AMOUNT
Сумма оплаты.
MNT_SIGNATURE
Подпись ответа.
MNT_ATTRIBUTES
Необязательный блок произвольных параметров, сохраняемых в операции.
KEY / VALUE
Имя (до 32 символов) и значение параметра.

Формирование подписи в ответе на проверочный запрос

MNT_SIGNATURE = MD5(
  MNT_RESULT_CODE + MNT_ID + MNT_TRANSACTION_ID
  + КОД_ПРОВЕРКИ_ЦЕЛОСТНОСТИ_ДАННЫХ)

Примечание: Не меняйте порядок полей. MONETA.Assistant проверяет ответ по той же формуле.

Коды ответа на проверочный запрос

КодОписание
100В ответе указана сумма заказа для оплаты. Используйте, когда в проверочном запросе не был передан MNT_AMOUNT.
200Заказ оплачен. Уведомление об оплате магазину доставлено.
302Заказ в обработке; точный статус определить нельзя.
402Заказ создан и готов к оплате. Уведомление об оплате ещё не доставлено.
500Заказ неактуален (например, отменён). При этом коде MONETA.RU не будет повторять отправку уведомления об оплате, если оно не было доставлено.

Примечание: Обычно для продолжения оплаты используют коды 402 или 100.

Примеры проверочных запросов

Проверочный запрос для заказа FF790ABCD, счёт 54600817, сумма 120.25, без номера операции:

checkURL?MNT_COMMAND=CHECK&MNT_ID=54600817&MNT_TRANSACTION_ID=FF790ABCD&MNT_AMOUNT=120.25&MNT_CURRENCY_CODE=RUB&MNT_TEST_MODE=0&MNT_SIGNATURE=ea2d49048bdf11857f1b50270aedbc8d

Строка для MD5 (подряд, без разделителей):

CHECK54600817FF790ABCD120.25RUB0QWERTY

где QWERTY — код проверки целостности данных.

Пример ответа магазина:

<?xml version="1.0" encoding="UTF-8"?>
<MNT_RESPONSE>
  <MNT_ID>54600817</MNT_ID>
  <MNT_TRANSACTION_ID>FF790ABCD</MNT_TRANSACTION_ID>
  <MNT_RESULT_CODE>402</MNT_RESULT_CODE>
  <MNT_DESCRIPTION>Order created, but not paid</MNT_DESCRIPTION>
  <MNT_AMOUNT>120.25</MNT_AMOUNT>
  <MNT_SIGNATURE>5ebb58862cf8781b62bcc2cc8d66913e</MNT_SIGNATURE>
  <MNT_ATTRIBUTES>
    <ATTRIBUTE><KEY>name</KEY><VALUE>John Smith</VALUE></ATTRIBUTE>
    <ATTRIBUTE><KEY>email</KEY><VALUE>John.Smith@gmail.com</VALUE></ATTRIBUTE>
  </MNT_ATTRIBUTES>
</MNT_RESPONSE>

Строка для MD5 ответа (подряд):

40254600817FF790ABCDQWERTY

Поля name и email из MNT_ATTRIBUTES сохраняются в операции.