Возврат средств после оплаты
Возвратом в рамках платежной платформы Rocketpay считается перевод пользователю средств, ранее списанных при проведении оплаты. Если средства были не списаны, а, например заблокированы, то возвращение пользователю доступа к этим средствам выполняется в платформе через операцию отмены блокировки, а не операцию возврата (подробнее — Оплата в две стадии).
Платежная платформа поддерживает возвраты через Gate или через Dashboard. В этом разделе представлена информация о возврате через Gate.
Общая информация
Платежная платформа поддерживает возможности возврата средств пользователю после проведения разовой и повторяемой оплаты. В общем случае срок, в течение которого после оплаты можно выполнить возврат, не ограничивается.
Чтобы инициировать возврат при работе через Gate, стороны веб-сервиса необходимо отправить запрос к конечной точке /v2/payment/card/refund. При этом следует учитывать особенности и ограничения, перечисленные далее в соответствующих разделах.
В общем случае в зависимости от того, когда и на какую сумму инициируется возврат, для его выполнения формируется одна из следующих операций:
reversal, если возврат инициируется до закрытия операционного дня и на всю сумму оплаты;refund, если возврат инициируется до закрытия операционного дня и на часть суммы оплаты или после закрытия операционного дня вне зависимости от суммы.
Исключением является возврат после оплаты, проведенной с использованием карты платежной системы Visa. Для выполнения такого возврата в зависимости от того, когда он инициируется, и вне зависимости от суммы формируется одна из следующих операций:
reversal, если возврат инициируется до закрытия операционного дня;refund, если возврат инициируется после закрытия операционного дня.
Таким образом, возврат инициируется одним запросом и может выполняться для двух типов платежей — разовых и повторяемых оплат — с помощью одной из двух операций: refund или reversal.
Рис.: Схема соответствия между запросом, платежами и операциями
После выполнения возврата к веб-сервису передается оповещение, в котором содержится информация о результате выполнения возврата и о статусе платежа после возврата. Статус платежа может принимать следующие значения:
success— платеж проведен, возврат для платежа не выполнен;reversed— до закрытия операционного дня для платежа выполнен возврат всей суммы;refunded— после закрытия операционного дня для платежа выполнен возврат всей суммы;partially reversed— до закрытия операционного дня для платежа выполнен возврат части суммы (только для карт платежных систем Visa);partially refunded— для платежа выполнен возврат части суммы (для карт платежных систем Visa — после закрытия операционного дня);scheduled recurring processing— для повторяемой оплаты выполнен возврат всей суммы или части суммы, при этом ожидаются дальнейшие списания средств в рамках этой оплаты.
Особенности
Срок выполнения возврата, как правило, зависит от банка-эмитента или платежного провайдера, выполняющего операцию, и может занять длительное время.
При выполнении возврата изменяются данные о сумме платежа. В оповещении о результате возврата указывается актуальная сумма платежа, доступная для дальнейших возвратов. Актуальная сумма платежа рассчитывается как разница между исходной суммой платежа и суммой, возвращенной пользователю. Допустим, исходная сумма равна 13,70 долларов США. Тогда при возврате на сумму 10,00 долларов актуальная сумма платежа принимает значение 3,70 долларов, а при еще одном возврате на сумму 3,70 долларов — 0,00 долларов. Это правило справедливо в том числе для регулярных оплат, при которых актуальную сумму платежа составляют суммы всех списаний в рамках этого платежа за вычетом суммы всех выполненных возвратов.
В то же время для разовых оплат, в рамках которых выполнено несколько платежных операций, сумма платежа, доступная для дальнейших возвратов, может отличаться от суммы платежа, передаваемой в оповещении. Поэтому для оповещений о результатах таких оплат введен дополнительный параметр, в котором указывается сумма, доступная для дальнейших возвратов — remaining_refund. Подробная информация о таких оплатах представлена в разделе Разбиение суммы платежа.
Ограничения
Выполнение возвратов возможно с учетом следующих ограничений:
- В рамках оплаты, для которой выполняется возврат, должно быть выполнено хотя бы одно списание средств пользователя, при этом самой оплате должен соответствовать один из следующих статусов:
success,partially paid,sсheduled recurring processingилиpartially refunded.Если в рамках оплаты не выполнено ни одного успешного списания или статус оплаты не соответствует ни одному из перечисленных, то запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки, например
3081. - Валюта возврата должна соответствовать валюте оплаты, для которой выполняется возврат.
Если в запросе передана валюта, не соответствующая валюте оплаты, то запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки
3284(подробнее о таких кодах — в разделе Статусы операций и коды ответов). - Должна соблюдаться допустимая частота отправки запросов.
Если повторный запрос на возврат отправлен ранее, чем через две минуты, то этот запрос отклоняется и к веб-сервису направляется оповещение с кодом ошибки
3285. - Остаток средств на счете мерчанта должен быть достаточным для выполнения возврата.
Информацию об остатке средств можно получить с помощью запроса через Data API (Использование Data API) или в Dashboard (раздел Контроль балансов), а также при обращении к курирующему менеджеру Rocketpay.
- Должны соблюдаться актуальные для этого возврата специфические региональные требования, а также требования провайдеров и платежных систем.
Например, для одной оплаты, осуществляемой на территории Белоруссии или с использованием платежной карты этой страны, допускается только один возврат.
- Оплата, для которой выполняется возврат, не должна быть оспариваемой.
Если для оплаты начался процесс опротестования, то запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки
3288.
Помимо перечисленных ограничений для частичных возвратов действуют следующие:
- При проведении частичного возврата его сумма не должна превышать актуальную сумму платежа, иначе запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки
3283. - Инициировать новый частичный возврат можно только после выполнения предыдущего, иначе запрос на возврат отклоняется и к веб-сервису направляется оповещение с кодом ошибки
3285.
Формат запроса
Формат запроса на возврат соответствует описанному в разделе Общий порядок интеграции, конечной точкой API для этого запроса выступает /v2/payment/card/refund, а в теле запроса должны использоваться следующие объекты и параметры:
general— объект, содержащий основные идентификационные сведения запроса:project_id— идентификатор проекта, полученный от Rocketpay при интеграции;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"
}
}
Формат оповещений
Формат оповещения о результате возврата соответствует описанному в разделе Оповещения (callbacks) в Gate. Информация об актуальной сумме платежа содержится в объекте payment, а о сумме, возвращенной пользователю, — в объекте operation. Также оповещение может содержать описание причины возврата в объекте operation_description, если это было настроено специалистами технической поддержки по запросу мерчанта.
operation_id объекта operation.Далее представлены примеры информации из оповещений о полном и частичном возврате для разовой оплаты на исходную сумму 13,70 USD:
- на сумму
10,00 USD, при этом актуальная сумма платежа равна3,70 USD, а статус платежа соответствуетpartially refunded; - на сумму
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=="
}
Дополнительные материалы
При работе с возвратами также могут быть полезны следующие материалы:
- Типы платежей, операции и платежи — раздел с общей информацией о типах поддерживаемых платежей и операций, а также об их возможных статусах.
- Оповещения (callbacks) в Gate — раздел с информацией об оповещениях и работе с ними.
- Статусы операций и коды ответов— раздел с информацией о кодах ошибок, используемых в платежной платформе.
- — раздел с информацией о проведении платежей и операций через Dashboard.