Рекуррентные платежи
Рекуррентный платеж — это повторное списание денег с карты пользователя. Такие платежи бывают двух типов в зависимости от участия пользователя и проверки 3DS:
- Без участия пользователя, по токену. Такие платежи называются Merchant Initialized Transaction (MIT).
- С идентификацией пользователя через 3DS. Такие платежи называются Customer Initialized Transaction (CIT).
Сейчас проводить рекуррентные платежи можно только банковской картой, позже появятся другие способы.
Рекуррентные платежи MIT
MIT — это платежи, которые вы инициируете без участия пользователя, используя ранее полученный токен карты. Пользователь не подтверждает каждый платеж, а только видит списание.
Основные шаги
- Получить согласие пользователя на безакцептные списания.
- Провести первый успешный платеж и получить токен.
- Выполнять следующие платежи по этому токену.
Согласие пользователя
Рекуррентные платежи происходят автоматически, без участия пользователя. Вы несете полную ответственность за сумму, периодичность и за то, что пользователь действительно согласился на такие списания. Согласие потребуется в спорных ситуациях, например, если пользователь заявит, что не разрешал списывать деньги.
Как получить согласие
Любым способом, который позволит вам подтвердить факт согласия в спорной ситуации. Главное, чтобы пользователь узнал о последующих списаниях.
- Опишите условия подключения автоплатежей так, чтобы пользователь их точно прочел.
- Добавьте чекбокс с понятной подписью, например, Сохранить карту, Подключить автоплатеж, Подписаться на пожертвования и т.п.
Если пользователь отмечает чекбокс — автоплатеж включается, если нет — не включается.
Где разместить чекбокс:
- На вашей стороне — вы сами решаете, как он выглядит и где находится.
- В платежном виджете Zetplat — готовая опция, которую можно показать пользователю.
Токен для рекуррентных платежей
Токен — это безопасный заменитель данных карты. Чтобы его получить, нужно провести первый успешный платеж с указанием сохранить данные карты. В ответ на такой платеж вернется токен. Полученный токен можно сохранить и использовать для:
- последующих рекуррентных платежей,
- выплат на ту же карту.
Способы получить токен
-
Через API (с чекбоксом на своей стороне). При создании платежной сессии или в любом запросе на проведение платежа передайте параметр
allow_recurring=true(в объектеpayment_settings). Если платеж успешен, в ответе вернется токен. При этом согласие пользователя вы должны получить заранее, например, через свой чекбокс. -
Через платежный виджет Zetplat. В виджете можно включить отображение чекбокса с текстом Соглашаюсь на автоплатежи. Если пользователь отметит его и платеж пройдет успешно, токен будет возвращен автоматически.
Статусы токена
Статус (token_active) | Значение |
|---|---|
true | Токен активен, по нему можно проводить платежи |
false | Токен неактивен, платеж не пройдет (вернется ошибка) |
Чтобы проверить статус токена, отправьте запрос token/state.
В поле type передайте значение recurring_token, в поле recurring_token.token — токен, статус которого нужно узнать.
В ответ придет token_info дата окончания действия токена (completed_date) и его статус (token_active). Дата окончания действия токена completed_date никак не проверяется на стороне Zetplat — токен останется активным и после даты, указанной в этом параметре.
Важно помнить, что активный токен не гарантирует успешное прохождения платежа, отказ может быть получен от банка-эмитента карты.
Как отключить токен
Если токен больше не нужен (например, пользователь отключил автоплатеж), отправьте запрос recurrent/disable.
В ответ придет recurring_token_info.
Если статус token_active: false, значит, токен отключен, по нему больше нельзя проводить платежи.
После отключения в параметре
completed_dateможет появиться дата, относящаяся к 2000 году. Это техническое значение, на которое можно не обращать внимания.
Как сделать рекуррентный платеж MIT
1. Проведите успешный платеж с указанием создать токен
- Без виджета
- С виджетом
При создании платежной сессии или в запросе на создание платежа в payment_settings
передайте в поле allow_recurring значение true.Пример
curl -X POST \
https://proxy-demo.zetplat.com/api/v1/transaction/init/checkout \
-H 'Content-Type: application/json' \
-H 'X-Project-Id: your_project_name' \
-H 'X-Signature: signature' \
-d '{
"payment_info": {
"type": "card_info",
"card_info": {
"type": "card_details",
"card_details": {
"card_number": "4242424242424242",
"card_exp_month": "01",
"card_exp_year": "22",
"card_code": "087"
}
}
},
"sum_info": {
"sum": 10000,
"currency_code": "rub"
},
"user_info": {
"user_id": "lucky"
},
"payment_settings": {
"allow_recurring": true
}
}'
Если вы проводите платеж с виджетом, можете показать пользователю на виджете чекбокс Соглашаюсь на автоплатежи. Для этого в запросе на создание токена для виджета передайте в поле show_autopay_option значение true.
Это необязательно: вы можете получить согласие пользователя раньше, передать
allow_recurring: trueпри создании платежной сессии и показать пользователю виджет без галочки, как при обычном платеже.
Пример
curl -X POST \
https://proxy-demo.zetplat.com/api/v1/token \
-H 'Content-Type: application/json' \
-H 'X-Project-Id: your_project_name' \
-H 'X-Signature: signature' \
-d '{
"payment_form_config": {
"session_id": "ps_34851",
"show_autopay_option": true
}
}'
Потом сформируйте платежную форму с этим токеном.
Если пользователь поставит галочку в чекбоксе Соглашаюсь на автоплатежи, то есть согласится на проведение рекуррентных списаний с карты, вам придет токен.
2. Сохраните токен после успешного платежа
Если платеж пройдет успешно и при оплате через платежную форму пользователь согласится на рекуррентные списания, в вебхуке checkout_results вернется токен.
Пример
curl -X POST \
https://partner.ru \
-H 'Content-Type: application/json' \
-H 'X-Signature: signature' \
-d '{
"type": "checkout_results",
"session_info": {
"id": "ps_3230",
"transaction_status": "completed",
"created_date": "2024-05-27T02:03:00.000000Z",
"updated_at": "2024-05-27T02:03:00.000000Z",
"payments": [{
"id": "pm_2705",
"transaction_status": "successful",
"created_date": "2024-05-27T02:03:00.000000Z",
"completed_date": "2024-05-27T02:03:00.000000Z",
"user_info": {
"user_id":"lucky"
},
"payment_info": {
"type": "card_info",
"card_info": {
"card_network": "visa",
"card_last4": "4242"
}
},
"recurring_token_info": {
"token": "feda2b2106a2e8747bbdc4c9f53c7f5f6ab845ffa1b7cc68ca839720af99b3d1",
"created_date": "2020-07-14T13:17:11+03:00",
"completed_date": "2020-07-31T16:05:42+03:00",
"token_active": true,
"type": "recurring_token"
},
"sum_info": {
"sum": 10000,
"currency_code": "rub"
},
"payment_settings": {
"allow_recurring": true
}
}]
}
}'
3. Проводите платежи с использованием токена
Отправьте запрос на проведение платежа с типом оплаты recurring_token_info. Вместо данных банковской карты передайте токен, который вы сохранили при предыдущем платеже.
Пример
curl -X POST \
https://proxy-demo.zetplat.com/api/v1/transaction/init/checkout \
-H 'Content-Type: application/json' \
-H 'X-Project-Id: your_project_name' \
-H 'X-Signature: signature' \
-d '{
"payment_info": {
"type": "recurring_token_info",
"recurring_token_info": {
"token": "e9876f32bcd947f79c324cf2da5726304a894f6ae2037de7705fdb3e0a134d39"
}
},
"sum_info": {
"sum": 10000,
"currency_code": "rub"
},
"user_info": {
"user_id": "lucky"
}
}'
Как сделать рекуррентный платеж CIT
Рекуррентный платеж CIT (Customer Initialized Transaction) — это возможность проводить оплату по токену с верификацией плательщика через 3DS. Для гарантии успешной оплаты платежей CIT мы рекомендуем использовать идентификатор проекта, предназначенный для платежей с 3DS.
1. Создайте платежную сессию
Отправьте запрос на создание сессии transaction/init/checkout. В запросе передайте значение payment_info.recurrent.initiated_by:client и URL для возврата плательщика после прохождения верификации 3DS в параметре back_url.
Пример
curl -X POST \
https://proxy-demo.zetplat.com/api/v1/transaction/init/checkout \
-H 'Content-Type: application/json' \
-H 'X-Project-Id: your_project_name' \
-H 'X-Signature: signature' \
-d '{
"payment_info": {
"type": "recurring_token_info",
"recurring_token_info": {
"token": "token_value",
"initiated_by": "client"
}
},
"sum_info": {
"sum": 10000,
"currency_code": "rub"
},
"user_info": {
"user_id": "lucky"
},
"payment_settings": {
"back_url": "https://zetplat.com"
}
}'
2. Получите данные для редиректа
Получите от Zetplat вебхук action_pending с данными для редиректа на страницу прохождения 3DS.
Пример
curl -X POST \
https://partner.ru \
-H 'Content-Type: application/json' \
-H 'X-Signature: signature' \
-d '{
"type": "action_pending",
"session_info": {
"id": "ps_3230",
"transaction_status": "active",
"created_date": "2024-05-27T02:03:00.000000Z",
"updated_at": "2024-05-27T02:03:00.000000Z",
"payments": [{
"id": "pm_2705",
"transaction_status": "pending",
"created_date": "2024-05-27T02:03:00.000000Z",
"user_info": {
"user_id":"user@152.ru"
},
"payment_info": {
"type": "card_info",
"card_info": {
"card_network": "visa",
"card_last4": "4242"
}
},
"sum_info": {
"sum": 10000,
"currency_code": "rub"
},
"fee_info": {
"fee": {
"merchant_fee": {
"sum": 10,
"currency_code": "RUB"
}
}
},
"user_action": {
"type": "destination_info",
"destination_info": {
"url_address": "https://proxy.zetplat.com?foo=bar",
"domain": "https://proxy.zetplat.com",
"http_method": "GET",
"additional_params": {
"foo": "bar"
},
"extra_params": {
"paReq": "sdfew^//asdhbv",
"MD": "abc75daefnn"
}
}
}
}]
}
}'
3. Перенаправьте пользователя на 3DS
Получите из ответа Zetplat:
user_action.destination_info.url— адрес для перенаправления,user_action.destination_info.method— метод запроса (GET или POST).
Выполните перенаправление указанным методом.
После прохождения 3DS пользователь вернется на ваш
back_url. Метод вызоваback_urlтакже может быть GET или POST. Если это POST, а ваш обработчик ожидает GET, настройте преобразование (редирект) из POST в GET.
4. Дождитесь результата платежа
Zetplat отправит вам вебхук checkout_results. Статус successful означает успешный платеж.
Пример
curl -X POST \
https://partner.ru \
-H 'Content-Type: application/json' \
-H 'X-Signature: signature' \
-d '{
"type": "checkout_results",
"session_info": {
"id": "ps_3230",
"transaction_status": "completed",
"created_date": "2024-05-27T02:03:00.000000Z",
"updated_at": "2024-05-27T02:03:00.000000Z",
"payments": [{
"id": "pm_2705",
"transaction_status": "successful",
"created_date": "2024-05-27T02:03:00.000000Z",
"completed_date": "2024-05-27T02:03:00.000000Z",
"user_info": {
"user_id":"lucky"
},
"payment_info": {
"type": "card_info",
"card_info": {
"card_network": "visa",
"card_last4": "4242"
}
},
"recurring_token_info": {
"token": "feda2b2106a2e8747bbdc4c9f53c7f5f6ab845ffa1b7cc68ca839720af99b3d1",
"created_date": "2020-07-14T13:17:11+03:00",
"completed_date": "2020-07-31T16:05:42+03:00",
"token_active": true,
"type": "recurring_token"
},
"sum_info": {
"sum": 10000,
"currency_code": "rub"
}
}]
}
}'
Подробнее о статусах платежа
Описание кодов ошибок и их значений
Схема рекуррентного платежа CIT
