Возврат средств после оплаты

Возвратом в рамках платёжной платформы ECommPay считается перевод пользователю средств, ранее списанных при проведении оплаты. Если средства были не списаны, а, например, заблокированы, то возвращение пользователю доступа к этим средствам выполняется в платформе через операцию отмены блокировки, а не операцию возврата (подробнее — Оплата в две стадии).

Платёжная платформа поддерживает выполнение возвратов через Gate или через Dashboard (Old Dashboard). В этом разделе представлена информация о выполнении возвратов через Gate. Общие сведения актуальны как для работы с платёжными картами, так и для работы с другими платёжными инструментами, а техническая информация актуальна только для работы с картами. Техническая информация о возврате средств при работе с другими платёжными инструментами представлена в разделе Альтернативные платёжные методы.

Общая информация

Платёжная платформа поддерживает возможности возврата средств пользователю после проведения разовой и повторяемой оплаты. В общем случае срок, в течение которого после оплаты можно выполнить возврат, не ограничивается, однако для некоторых платёжных методов могут быть установлены ограничения или дополнительные комиссии, взимаемые за выполнение возврата по истечении заданного времени.

Чтобы инициировать возврат при работе через Gate, стороны веб-сервиса необходимо отправить запрос к конечной точке /v2/payment/{название метода}/refund. При этом следует учитывать особенности и ограничения, перечисленные далее в соответствующих разделах.

В общем случае в зависимости от того, когда и на какую сумму инициируется возврат, для его выполнения формируется одна из следующих операций:

  • reversal, если возврат инициируется до закрытия операционного дня и на всю сумму оплаты;
  • refund, если возврат инициируется до закрытия операционного дня и на часть суммы оплаты или после закрытия операционного дня вне зависимости от суммы.

Исключением является возврат после оплаты, проведённой с использованием карты платёжной системы Visa или American Express. Для выполнения такого возврата в зависимости от того, когда он инициируется, и вне зависимости от суммы формируется одна из следующих операций:

  • reversal, если возврат инициируется до закрытия операционного дня;
  • refund, если возврат инициируется после закрытия операционного дня.
Прим.: Под операционным днём понимается временной диапазон, за который выполненные операции учитываются для проведения клиринга. Этот диапазон равен одним суткам с учётом варьирования их продолжительности при переходах на летнее и зимнее время. Начало и окончание операционного дня в разных случаях могут варьироваться с учётом разных факторов, информацию о которых следует уточнять у курирующего менеджера ECommPay.

Таким образом, возврат инициируется одним запросом и может выполняться для двух типов платежей — разовых и повторяемых оплат — с помощью одной из двух операций: refund или reversal.

Рис.: Схема соответствия между запросом, платежами и операциями


Схема соответствия между запросом, платежами и операциями

После выполнения возврата к веб-сервису передаётся оповещение, в котором содержится информация о результате выполнения возврата и о статусе платежа после возврата. Статус платежа может принимать следующие значения:

  • success — платёж проведён, возврат для платежа не выполнен;
  • reversed — до закрытия операционного дня для платежа выполнен возврат всей суммы;
  • refunded — после закрытия операционного дня для платежа выполнен возврат всей суммы;
  • partially reversed — до закрытия операционного дня для платежа выполнен возврат части суммы (только для карт платёжных систем Visa и American Express);
  • partially refunded — для платежа выполнен возврат части суммы (для карт платёжных систем Visa и American Express — после закрытия операционного дня);
  • scheduled recurring processing — для повторяемой оплаты выполнен возврат всей суммы или части суммы, при этом ожидаются дальнейшие списания средств в рамках этой оплаты.

Особенности

Срок выполнения возврата, как правило, зависит от банка-эмитента или платёжного провайдера, выполняющего операцию, и может занять длительное время.

При выполнении возврата изменяются данные о сумме платежа. В оповещении о результате возврата указывается актуальная сумма платежа, доступная для дальнейших возвратов. Актуальная сумма платежа рассчитывается как разница между исходной суммой платежа и суммой, возвращённой пользователю. Допустим, исходная сумма равна 13,70 долларов США. Тогда при возврате на сумму 10,00 долларов актуальная сумма платежа принимает значение 3,70 долларов, а при ещё одном возврате на сумму 3,70 долларов — 0,00 долларов. Это правило справедливо в том числе для регулярных оплат, при которых актуальную сумму платежа составляют суммы всех списаний в рамках этого платежа за вычетом суммы всех выполненных возвратов.

В то же время для разовых оплат, в рамках которых выполнено несколько платёжных операций, сумма платежа, доступная для дальнейших возвратов, может отличаться от суммы платежа, передаваемой в оповещении. Поэтому для оповещений о результатах таких оплат введён дополнительный параметр, в котором указывается сумма, доступная для дальнейших возвратов — remaining_refund. Подробная информация о таких оплатах представлена в разделе Разбиение суммы платежа.

В зависимости от используемого платёжного метода могут быть актуальны и другие особенности выполнения возвратов. К ним может относиться, например, удержание дополнительной комиссии за выполнение возврата по истечении заданного времени. Информацию о таких особенностях можно получить в разделе с описанием платёжных методов (Альтернативные платёжные методы) и у курирующего менеджера ECommPay.

Ограничения

Выполнение возвратов возможно с учётом следующих ограничений:

  • В рамках оплаты, для которой выполняется возврат, должно быть выполнено хотя бы одно списание средств пользователя, при этом самой оплате должен соответствовать один из следующих статусов: success, partially paid, sсheduled recurring processing или partially refunded.

    Если в рамках оплаты не выполнено ни одного успешного списания или статус оплаты не соответствует ни одному из перечисленных, то запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки, например 3081.

  • Валюта возврата должна соответствовать валюте оплаты, для которой выполняется возврат.

    Если в запросе передана валюта, не соответствующая валюте оплаты, то запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки 3284 (подробнее о таких кодах — в разделе Информация о выполнении операций).

  • Должна соблюдаться допустимая частота отправки запросов.

    Если повторный запрос на возврат отправлен ранее, чем через две минуты, то этот запрос отклоняется и к веб-сервису направляется оповещение с кодом ошибки 3285.

  • Остаток средств на счёте мерчанта должен быть достаточным для выполнения возврата.

    Информацию об остатке средств можно получить с помощью запроса через Data API (Использование Data API) или в интерфейсе Dashboard (Old Dashboard) (раздел Контроль балансов), а также при обращении к курирующему менеджеру ECommPay.

  • Должны соблюдаться актуальные для этого возврата специфические региональные требования, а также требования провайдеров и платёжных систем.

    Например, для одной оплаты, осуществляемой на территории Белоруссии или с использованием платёжной карты этой страны, допускается только один возврат. Информацию о специфике выполнения возвратов в зависимости от используемого платёжного метода можно получить в разделе Альтернативные платёжные методы и при обращении к курирующему менеджеру ECommPay.

  • Оплата, для которой выполняется возврат, не должна быть оспариваемой.

    Если для оплаты начался процесс опротестования, то запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки 3288.

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

  • При проведении частичного возврата его сумма не должна превышать актуальную сумму платежа, иначе запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки 3283.
  • Инициировать новый частичный возврат можно только после выполнения предыдущего, иначе запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки 3285.

Информация о форматах запросов и оповещений при использовании платёжных карт представлена далее, а о форматах запросов и оповещений при использовании других платёжных инструментов — в разделе Альтернативные платёжные методы.

Формат запроса

Формат запроса на возврат соответствует описанному в разделе Организация взаимодействия, конечной точкой API для этого запроса выступает /v2/payment/card/refund, а в теле запроса должны использоваться следующие объекты и параметры:

  • general — объект, содержащий основные идентификационные сведения запроса:
    • project_id — идентификатор проекта, полученный от ECommPay при интеграции;
    • payment_id — идентификатор платежа, для которого необходимо выполнить возврат;
    • signature — подпись к данным запроса, составленная после указания целевых параметров (подробнее — в разделе Работа с подписью к данным).
  • payment — объект, содержащий сведения о платеже:
    • description — описание причины возврата; относится только к операции возврата и не меняет описание оплаты, если оно было передано ранее.

Перечисленных параметров достаточно для возврата пользователю всей суммы платежа. Чтобы возвратить часть суммы, в объекте payment дополнительно необходимо использовать следующие параметры:

  • amount — сумма возврата, не превышающая актуальную сумму платежа, в минорных единицах валюты;
  • currency — код валюты возврата в формате ISO-4217 alpha-3; указываемая валюта должна быть той же, что и валюта платежа.

Дополнительно могут использоваться любые другие параметры, указанные в спецификации.

Таким образом, корректный запрос для возврата средств должен содержать идентификаторы проекта и платежа, подпись, описание причины возврата, а также, при необходимости, код валюты и сумму возврата.

Рис.: Пример набора данных в запросе на возврат средств

{
  "general": {
    "project_id": 239,
    "payment_id": "payment2",
    "signature": "of8k9xeKJ7KLTZYO56lCv+f1M0Sf/7eg=="
  },
  "payment": {
    "description": "refund",
// При частичном возврате:
    "amount": 1000,
    "currency": "USD"
  }
}

Формат оповещений

Формат оповещения о результате возврата соответствует описанному в разделе Оповещения. Информация об актуальной сумме платежа содержится в объекте payment, а о сумме, возвращённой пользователю, — в объекте operation. Также оповещение может содержать описание причины возврата в объекте operation_description, если это было настроено специалистами технической поддержки по запросу мерчанта.

Прим.: В случае, если для одной оплаты выполняются несколько частичных возвратов, при разборе оповещений следует учитывать, что каждому отдельному частичному возврату (то есть каждой отдельной операции) соответствует свой идентификатор. Его значение передаётся в параметре operation_id объекта operation.

Далее представлены примеры информации из оповещений о полном и частичном возврате для разовой оплаты на исходную сумму 13,70 USD:

  1. на сумму 10,00 USD, при этом актуальная сумма платежа равна 3,70 USD, а статус платежа соответствует partially refunded;
  2. на сумму 13,70 USD, при этом актуальная сумма платежа равна 0,00 USD, а статус платежа соответствует refunded.

В каждом из этих примеров содержится описание оплаты, так как оно было передано в запросе на оплату, и описание причины возврата.

Рис.: Пример данных из оповещения о частичном возврате средств

{ 
  "project_id":239,
  "payment":{ 
    "id":"payment2",
    "type":"purchase", // Тип платежа — разовая оплата
    "status":"partially refunded", // Статус платежа после частичного возврата
    "date":"2019-11-13T14:52:14+0000",
    "method":"card",
    "sum":{ 
      "amount":370, // Актуальная сумма платежа
      "currency":"USD" // Код валюты платежа
    },
    "description":"Tai massage session" // Описание оплаты
  },
  "account":{ 
    "number":"424242******4243",
    "type":"visa",
    "card_holder":"JUDY DOE",
    "expiry_month":"03",
    "expiry_year":"2023"
  },
  "operation_description":"Deficient service", // Описание причины возврата
  "operation":{ 
    "id":3862,
    "type":"refund", // Тип операции
    "status":"success", // Статус операции
    "date":"2019-11-13T14:52:15+0000",
    "created_date":"2019-11-13T14:52:12+0000",
    "request_id":"0c4457b5fe8dada59-e7b58eceb8aecfa791-00049391",
    "sum_initial":{ 
      "amount":1000, // Сумма возврата
      "currency":"USD" // Код валюты возврата (в соответствии с валютой платежа)
    },
    "sum_converted":{ 
      "amount":1000,
      "currency":"USD"
    },
    "code":"0",
    "message":"Success",
    "provider":{ 
      "id":414,
      "payment_id":"",
      "endpoint_id":414
    }
  },
  "signature":"of8k9xerKSK4XL1QFaDH3p9Mh0CIcjmOwSwKJ7KLTZYO56lCv+f1M0Sf/7eg=="
}

Рис.: Пример данных из оповещения о полном возврате средств

{ 
  "project_id":239,
  "payment":{
    "id":"payment2",
    "type":"purchase", // Тип платежа — разовая оплата
    "status":"refunded", // Статус платежа после полного возврата
    "date":"2019-11-13T13:52:09+0000",
    "method":"card",
    "sum":{ 
      "amount":0, // Актуальная сумма платежа
      "currency":"USD" // Валюта платежа
    },
    "description":"Tai massage session" // Описание оплаты
  },
  "account":{
    "number":"424242******4243",
    "token":"14c24c8a5384b413f11b2956a82ddaeea609ea49",
    "type":"visa",
    "card_holder":"JUDY DOE",
    "expiry_month":"03",
    "expiry_year":"2023"
  },
  "customer":{
    "id":"1478"
  },
  "operation_description":"Service cancellation", // Описание причины возврата
  "operation":{
    "id":3861,
    "type":"refund", // Тип операции
    "status":"success", // Статус операции
    "date":"2019-11-13T13:52:09+0000",
    "created_date":"2019-11-13T13:52:08+0000",
    "request_id":"67a97cd6b14f1aa0543c81e18cd270b66-aadc6e790206d5-00038611",
    "sum_initial":{ 
      "amount":1370, // Сумма возврата
      "currency":"USD" // Код валюты возврата (в соответствии с валютой платежа)
    },
    "sum_converted":{
      "amount":1370,
      "currency":"USD"
    },
    "code":"0",
    "message":"Success",
    "provider":{
      "id":414,
      "payment_id":"",
      "endpoint_id":414
    }
  },
  "signature":"of8k9xerKSK4XL1QFaDH3p9Mh0CIcjmOwSwKJ7KLTZYO56lCv+f1M0Sf/7eg=="
}

В следующем примере содержится информация о том, что для повторяемой оплаты с суммой всех списаний, равной 7,99 EUR, выполнен возврат на сумму 7,99 EUR и до выполнения следующего списания актуальная сумма платежа равна 0,00 EUR. Статус платежа в данном случае не изменился, так как в рамках этого платежа ожидаются дальнейшие списания (подробнее о статусах — в разделе Модель проведения платежей).

Рис.: Пример данных из оповещения о полном возврате средств

{ 
  "project_id":239,
  "payment":{ 
    "id":"payment3",
    "type":"recurring", // Тип платежа — повторяемая оплата
    "status":"scheduled recurring processing", // Статус платежа после возврата
    "date":"2019-11-13T17:23:26+0000",
    "method":"card",
    "sum":{ 
      "amount":0, // Актуальная сумма платежа
      "currency":"EUR" // Валюта платежа
    },
  },
  "account":{ 
    "number":"424242******4243",
    "token":"14c24c8a5384b413f11b2956a82ddaeea609ea49",
    "type":"visa",
    "card_holder":"JUDY DOE",
    "expiry_month":"03",
    "expiry_year":"2023"
  },
  "customer":{ 
    "id":"1478"
  },
  "recurring":{ 
    "id":1061,
    "currency":"EUR",
    "valid_thru":"2027-05-31T00:00:00+0000"
  },
  "operation_description":"Refund for payment3 order", // Описание причины возврата
  "operation":{ 
    "id":3861,
    "type":"refund", // Тип операции
    "status":"success", // Статус операции при успешном возврате
    "date":"2019-11-13T17:23:26+0000",
    "created_date":"2019-11-13T17:23:25+0000",
    "request_id":"bb36c8b4bce2c4-0198d59676189b0e344d1-00056689",
    "sum_initial":{ 
      "amount":799, // Сумма возврата
      "currency":"EUR" // Код валюты возврата (в соответствии с валютой платежа)
    },
    "sum_converted":{ 
      "amount":799,
      "currency":"EUR"
    },
    "code":"0",
    "message":"Success",
    "provider":{ 
      "id":414,
      "payment_id":"",
      "endpoint_id":6
    }
  },
  "signature":"of8k9xerKSK4XL1QFaDH3p9Mh0CIcjmOwSwKJ7KLTZYO56lCv+f1M0Sf/7eg=="
}

В следующем примере содержится информация о том, что для разовой оплаты отклонён возврат на сумму 60,00 USD в связи с нехваткой средств на счёте мерчанта, о чём свидетельствует код ошибки 3028 (подробнее о таких кодах — в разделе Информация о выполнении операций). Сумма и статус платежа в данном случае не изменились.

Рис.: Пример данных из оповещения об отказе в возврате средств

{ 
  "project_id":239,
  "payment":{ 
    "id":"payment7",
    "type":"purchase", // Тип платежа — разовая оплата
    "status":"success", // Статус платежа при отказе в возврате
    "date":"2019-12-29T15:29:47+0000",
    "method":"card",
    "sum":{ 
      "amount":6000, // Сумма платежа
      "currency":"USD" // Валюта платежа
    },
  },
  "account":{ 
    "number":"424242******4243",
    "token":"14c24c8a5384b413f11b2956a82ddaeea609ea49",
    "type":"visa",
    "card_holder":"JUDY DOE",
    "expiry_month":"03",
    "expiry_year":"2023"
  },
  "operation_description":"Error", // Описание причины возврата
  "operation":{ 
    "id":3869,
    "type":"reversal", // Тип операции
    "status":"decline", // Статус операции при отказе в возврате
    "date":"2019-12-29T15:32:29+0000",
    "created_date":"2019-12-29T15:32:29+0000",
    "request_id":"713446e4b43-06bfc7eed42c4c854697846a-00059692",
    "sum_initial":{ 
      "amount":6000, // Сумма возврата
      "currency":"USD" // Код валюты возврата (в соответствии с валютой платежа)
    },
    "sum_converted":{ 
      "amount":6000,
      "currency":"USD"
    },
    "code":"3028", // Код ошибки
    "message":"Insufficient funds on merchant balance", // Описание ошибки
    "provider":{ 
      "id":120,
      "payment_id":"",
      "endpoint_id":120
    }
  },
  "signature":"of8k9xerKSK4XL1QFaDH3p9Mh0CIcjmOwSwKJ7KLTZYO56lCv+f1M0Sf/7eg=="
}

Дополнительные материалы

При работе с возвратами также могут быть полезны следующие материалы: