Функционал Qostiq Wallet по подписке
Схема использования функционала Qostiq Wallet по подписке:
- Запрос /auth_token/request для создания подписки. В ответе на запрос создания подписки вернется URL адрес на который необходимо выполнить редирект клиента для подтверждения им подписки.
- После подтверждения подписки клиентом на указанный в настройках магазина URL будет выслан уникальный
tokenкоторый будет использоваться в дальнейших запросах. - Запрос на выполнения действия разрешенного для указаного
token(например запрос списания фиатных средств /bill/recurrent). - При необходимости отключения подписки подписки и деактивации токена - необхдимо выполнить запрос /auth_token/revoke.
На один Qostiq Wallet можно создать несколько подписок использовав разные значения external_id. Значения external_id видны клиентам.
Запрос на создание подписки [/auth_token/request]
URL: https://core.qostiq.com/auth_token/request
Метод: POST
Обязательные параметры: external_id, now, scopes, shop_id
Данный запрос создает сущность подписки которую необходимо подтвердить клиенту.
Внимание! Необходимо использовать уникальные значения external_id. При попытке создать подписку с уже существующим external_id, будет выполнено обновление ранее созданной подписки.
Пример запроса:
{
"external_id": "test_external_id",
"now": 1691584193,
"scopes": ["bill_recurrent"],
"shop_id": 6,
"sign": "912b985f18959620bb981485132016b58fc344361a51a24eda27687613141f7f"
}
Где,
| Параметр | Описание | Формат | Пример |
|---|---|---|---|
external_id | номер или название подписки (видны клиенту) | String | "test_external_id" |
now | время запроса | Integer | 1691584193 |
scopes | тип подписки | Array | ["bill_recurrent"] - значение для получения токена на платежи по подписке |
shop_id | идентификатор магазина в системе Qostiq | Integer | 6 |
sign | подпись | String | "912b985f18959620bb981485132016b58fc344361a51a24eda27687613141f7f" |
- Пример ответа:
{
"data": {
"redirect_url": "https://wallet.test-qostiq.com/subscription-request/27d5c54568e944abb2b5a64b845d13eb"
},
"error_code": 0,
"message": "Ok",
"result": true
}
Необходимо выполнить браузерный редирект клиента (HTTP GET)на адрес, указанный в параметре redirect_url, для подтверждения подписки пользователем.
После подтверждения будет прислано уведомление об активации подписки.
Важно:
redirect_urlоткрывается только методом GETredirect_urlне является API endpoint- Отправка POST-запросов на
redirect_urlне поддерживается
Пример запроса на создание подписки [POST]
- Request (application/json)
{
"external_id": "external_id",
"now": 1691584193,
"scopes": [
"bill_recurrent"
],
"shop_id": 6,
"sign": "912b985f18959620bb981485132016b58fc344361a51a24eda27687613141f7f"
}
- Response 201 (application/json)
{
"data": {
"redirect_url": "https://wallet.test-qostiq.com/subscription-request/27d5c54568e944abb2b5a64b845d13eb"
},
"error_code": 0,
"message": "Ok",
"result": true
}
Уведомление активации и отмене подписки [/auth_token/callback]
После активации подписки клиентом на URL-адрес будет отправлено уведомление с токеном который необходимо будет использовать для дальнейшего совершения платежа.
URL-адрес указывается в личном кабинете в настройках магазина - URL уведомлений по auth токенам.
Также уведомление будет выслано в случаее отмены подписки клиентом.
- Пример уведомления об активации подписки:
{
"callback_type": "auth_token",
"created": "2023-08-09 15:50:50",
"external_id": "external_id",
"scopes": [
"bill_recurrent"
],
"shop_id": 6,
"sign": "7dh39fkd7cf1b1db2175606447c60e6d9b5c84219471f7239329a4c9a29",
"status": 1,
"token": "44c6703d-9f98-434d-936f-9e6784976c98"
}
Где:
| Параметр | Описание |
|---|---|
callback_type | тип уведомления, значение auth_token при уведомлении о активации подписки |
created | время активации подписки |
external_id | идентификатор подписки |
scopes | тип подписки, значение ["bill_recurrent"] при активации подписки на платежи |
sign | подпись коллбека |
status | статус токена: 1 — токен активный (подписка активирована), 2 — токен неактивный (подписка отменена) |
token | токен подписки, используется для совершения последующих запросов, например совершении платежа без подтверждения |
Уведомление об отмене подписки [POST]
При корректном получении и обработке уведомления, необходимо вернуть в ответ http статус 200 и тело сообщения OK. В ином случае уведомления будут высылаться повторно, с увеличивающемся интервалом, всего 25 попыток, последнее по истечении суток.
- Request (application/json)
{
"callback_type": "auth_token",
"created": "2023-08-09 14:42:46",
"external_id": "external_id",
"scopes": [
"bill_recurrent"
],
"shop_id": 6,
"sign": "11d94f04959e153cd719ab7029f767d8e6ea853af4f26a4f0f77a7b238c1e78f",
"status": 2,
"token": "44c6703d-9f98-434d-936f-9e6784976c98"
}
-
Response 200 (application/json)
-
Body
OK
-
Создание фиатного платежа по подписке [/bill/recurrent]
URL: https://core.qostiq.com/bill/recurrent
Метод: POST
Обязательные параметры: amount, currency, now, shop_id, shop_order_id, token
Данный запрос создает списание с кошелька клиента в пользу магазина без подтверждения клиентом.
- Пример запроса:
{
"amount":"10",
"currency":840,
"now": 1691658477,
"shop_id": 6,
"shop_order_id":"test payment",
"token": "f1cebac7-e05b-4c94-bb26-a222b976cb2d",
"sign": "97a4dd349871cc80aef906cee468d8b942c0197848e3ed86a6f9f58a8725e180"
}
Где,
| Параметр | Описание | Формат | Пример |
|---|---|---|---|
amount | сумма платежа | Number (Не больше 2х знаков после точки) | 1, 1.0, 1.00 или "1.00" |
currency | валюта выставленного счета | Integer | 840 - Доллар США, 980 - Украинская гривна, 978 - Евро, 398 - Казахстанский тенге |
shop_id | идентификатор магазина в системе Qostiq | Integer | 6 |
now | время запроса | Integer | 1691584193 |
token | токен подписки полученый в ответе на запрос создания подписки. | String | "f1cebac7-e05b-4c94-bb26-a222b976cb2d" |
scopes | тип подписки | Array | ["bill_recurrent"] - значение для получения токена на платежи по подписке |
shop_order_id | номер счета на стороне Вашего сервиса | String | "123456789" |
sign | подпись | String | "912b985f18959620bb981485132016b58fc344361a51a24eda27687613141f7f" |
- Пример ответа:
{
"data": {
"id": 2177,
"status": 2
},
"error_code": 0,
"message": "Ok",
"result": true
}
Где параметры ответа:
| Параметр | Описание |
|---|---|
id | уникальный id платежа в рамках фиатных платежей с кошелька Qostiq |
status | статус платежа, где значение 2 — платеж успешен |
В случае получения таймаута, или другой ошибки на запрос списания по подписке - необходимо выполнить запрос статуса платежа по номеру операции на стороне магазина - параметр shop_order_id.
Создание фиатного платежа по подписке [POST]
- Request (application/json)
{
"amount":"10",
"currency":840,
"now": 1691658477,
"shop_id": 6,
"shop_order_id":"test payment",
"token": "f1cebac7-e05b-4c94-bb26-a222b976cb2d",
"sign": "97a4dd349871cc80aef906cee468d8b942c0197848e3ed86a6f9f58a8725e180"
}
- Response 200 (application/json)
{
"data": {
"id": 2177,
"status": 2
},
"error_code": 0,
"message": "Ok",
"result": true
}
Создание криптовалютного платежа по подписке [/crypto/bill/recurrent]
URL: https://core.qostiq.com/crypto/bill/recurrent
Метод: POST
Обязательные параметры: amount, currency, now, shop_id, shop_order_id, token
Данный запрос создает списание с кошелька клиента в пользу магазина без подтверждения клиентом.
- Пример запроса:
{
"amount":"10",
"currency":"USDT",
"now": 1691669000,
"shop_id": 6,
"shop_order_id":"test payment",
"token": "f1cebac7-e05b-4c94-bb26-a222b976cb2d",
"sign": "ac3503d0b2e21c4716c96fbd58f32da678cf0a179a34bdf60ce5f36016efa2a2"
}
Где,
| Параметр | Описание | Формат | Пример |
|---|---|---|---|
amount | сумма платежа | String или number, количество знаков после запятой смотрите детальней в пункте "Указание суммы операции" | "1.00000001" или 1.00000001, или "10" |
currency | валюта выставленного счета | String | "USDT" |
shop_id | идентификатор магазина в системе Qostiq | Integer | 6 |
now | время запроса | Integer | 1691669000 |
token | токен подписки полученый в ответе на запрос создания подписки. | String | "f1cebac7-e05b-4c94-bb26-a222b976cb2d" |
scopes | тип подписки | Array | ["bill_recurrent"] - значение для получения токена на платежи по подписке |
shop_order_id | номер счета на стороне Вашего сервиса | String | "test payment" |
sign | подпись | String | "ac3503d0b2e21c4716c96fbd58f32da678cf0a179a34bdf60ce5f36016efa2a2" |
- Пример ответа:
{
"data": {
"id": 1579,
"status": 2
},
"error_code": 0,
"message": "Ok",
"result": true
}
Где параметры ответа:
| Параметр | Описание |
|---|---|
id | уникальный id платежа в рамках криптовалютных платежей с кошелька Qostiq |
status | статус платежа, где значение 2 — платеж успешен |
В случае получения таймаута, или другой ошибки на запрос списания по подписке - необходимо выполнить запрос статуса платежа по номеру операции на стороне магазина - параметр shop_order_id.
Запрос на создание криптовалютного платежа по подписке [POST]
- Request (application/json)
{
"amount":"10",
"currency":"USDT",
"now": 1691669000,
"shop_id": 6,
"shop_order_id":"test payment",
"token": "f1cebac7-e05b-4c94-bb26-a222b976cb2d",
"sign": "ac3503d0b2e21c4716c96fbd58f32da678cf0a179a34bdf60ce5f36016efa2a2"
}
- Response 200 (application/json)
{
"data": {
"id": 1579,
"status": 2
},
"error_code": 0,
"message": "Ok",
"result": true
}
Запрос на отмену подписки [/auth_token/revoke]
URL: https://core.qostiq.com/auth_token/revoke
Метод: POST
Обязательные параметры: now, shop_id, token
Данный запрос позволяет закрыть активную подписку ().
- Пример запроса:
{
"shop_id": 6,
"token": "44c6703d-9f98-434d-936f-9e6784976c98",
"now": 1691671996,
"sign": "8f15f065b07f6a2150277d57e125f3133ae4f9cab31f3529aaa8d6daa97b0c1d"
}
Где:
| Параметр | Описание | Формат | Пример |
|---|---|---|---|
shop_id | идентификатор магазина в системе Qostiq | Integer | 6 |
now | время запроса | Integer | 1691671996 |
token | токен подписки полученый в ответе на запрос создания подписки. | String | "44c6703d-9f98-434d-936f-9e6784976c98" |
sign | подпись | String | "ac3503d0b2e21c4716c96fbd58f32da678cf0a179a34bdf60ce5f36016efa2a2" |
- Пример ответа, при успешном закрытии подписки в ответе вернется токен подписки:
{
"data": {
"token": "44c6703d-9f98-434d-936f-9e6784976c98"
},
"error_code": 0,
"message": "Ok",
"result": true
}
- Если подписка уже отменена будет получена ошибка:
{
"data": null,
"error_code": 10,
"message": "Auth token (44c6703d-9f98-434d-936f-9e6784976c98) not found",
"result": false
}
Запрос на отмену подписки [POST]
- Request (application/json)
{
"shop_id": 6,
"token": "44c6703d-9f98-434d-936f-9e6784976c98",
"now": 1691671996,
"sign": "8f15f065b07f6a2150277d57e125f3133ae4f9cab31f3529aaa8d6daa97b0c1d"
}
- Response 200 (application/json)
{
"data": {
"token": "44c6703d-9f98-434d-936f-9e6784976c98"
},
"error_code": 0,
"message": "Ok",
"result": true
}
Запрос статуса фиатного платежа по подписке [/bill/shop_order_status]
Этот метод позволяет узнать текущий статус фиатного платежа с кошелька Qostiq wallet.
URL: https://core.qostiq.com/bill/shop_order_status
Метод: POST
Обязательные параметры: now, shop_id, shop_order_id
Пример запроса:
{
"now": "2021-05-01 16:56:25.009469",
"shop_id": 1092,
"shop_order_id": "234234232323",
"sign": "b9b838e0b1baedcf7dd60711b1afab246c3496b5cc3433df0c5a2e2d07fea976"
}
| Параметр | Описание | Формат | Пример |
|---|---|---|---|
now | время запроса | String | "2021-05-01 16:56:25.009469" |
shop_id | идентификатор магазина в системе Qostiq | Integer | 1092 |
shop_order_id | номер счета на стороне Вашего сервиса | String | "234234232323" |
sign | подпись | String | "b9b838e0b1baedcf7dd60711b1afab246c3496b5cc3433df0c5a2e2d07fea976" |
Пример ответа:
{
"data": {
"client_price": 1.16,
"created": "2020-10-20 14:01:28",
"description": "",
"is_unique": true,
"payment_id": 852095,
"payway": "qostiq_usd",
"processed": "2020-10-20 14:01:33",
"ps_currency": 980,
"ps_data": {
"ps_payer_account": "201538122124"
},
"shop_amount": 1.1,
"shop_currency": 980,
"shop_id": 1092,
"shop_order_id": "234234232323",
"shop_refund": 1.1,
"status": 2
},
"error_code": 0,
"message": "Ok",
"result": true
}
Где,
| Параметр | Описание |
|---|---|
client_price | сумма платежа |
created | дата создания |
description | описание счета |
is_unique | уникальность номера платежа |
payment_id | идентификатор платежа на стороне Qostiq |
payway | платежное направление |
processed | дата проведения платежа |
ps_currency | валюта выставленного счета |
ps_data | дополнительная информация от платежной системы, например аккаунт плательщика |
shop_amount | сумма счета, переданная магазином |
shop_currency | валюта счета, зачисляемая в магазин |
shop_id | идентификатор магазина в системе Qostiq |
shop_order_id | номер счета на стороне магазина |
shop_refund | сумма зачисления на баланс магазина, в валюте счета |
status | статус счета |
Внимание! Запрос статуса необходимо делать не чаще чем раз в 10 секунд.
Если shop_order_id не уникален по операциям bill в рамках магазина, в ответе содержится "is_unique":false и метод возвращает информацию по последнему созданному фиатному платежу с кошелька Qostiq.
Запрос статуса фиатного платежа по подписке [POST]
- Request (application/json)
{
"now": "2021-05-01 16:56:25.009469",
"shop_id": "1092",
"shop_order_id": "234234232323",
"sign": "ad7fbe8df102bc70e28deddba8b45bb3f4e6cafdaa69ad1ecc0e8b1d4e770575"
}
- Response 200 ()
{
"data": {
"client_price": 1.16,
"created": "2020-10-20 14:01:28",
"description": "",
"is_unique": true,
"payment_id": 852095,
"payway": "qostiq_usd",
"processed": "2020-10-20 14:01:33",
"ps_currency": 980,
"ps_data": {
"ps_payer_account": "201538122124"
},
"shop_amount": 1.1,
"shop_currency": 980,
"shop_id": 1092,
"shop_order_id": "234234232323",
"shop_refund": 1.1,
"status": 2
},
"error_code": 0,
"message": "Ok",
"result": true
}
Запрос статуса криптовалютного платежа по подписке [/crypto/bill/shop_order_status]
URL: https://core.qostiq.com/crypto/bill/shop_order_status
Метод: POST
Обязательные параметры: now, shop_id, shop_order_id
Данный запрос не является обязательным. Запрос дает возможность узнать актуальный статус созданого платежа.
Пример запроса:
{
"now": 1691676646,
"shop_id": 6,
"shop_order_id": "test payment",
"sign": "97a8d477e41d7e61af1a65ac9c662d1b28064aa4248a4eebb641deb5524e37f1"
}
Где,
| Параметр | Описание | Формат | Пример |
|---|---|---|---|
now | время запроса, в формате unixtimestamp | Integer | 1691676646 |
shop_id | идентификатор магазина в системе Qostiq | Integer | 6 |
shop_order_id | идентификатор счета на стороне магазина | String | "test payment" |
sign | подпись, см. п. Правила формирования подписи для операций с криптовалютой (sign) | String | "97a8d477e41d7e61af1a65ac9c662d1b28064aa4248a4eebb641deb5524e37f1" |
Пример ответа:
{
"data": {
"created": "2023-08-10 12:03:20",
"description": "",
"is_unique": false,
"payer_currency": "USDT",
"payer_price": "1.0",
"payment_id": 1579,
"processed": "2023-08-10 12:03:20",
"ps_data": {
"ps_payer_account": 31645670435
},
"shop_amount": "1.0",
"shop_currency": "1.0",
"shop_id": "1.0",
"shop_order_id": "test payment",
"shop_refund": "0.97",
"status": 2
},
"error_code": 0,
"message": "Ok",
"result": true
}
Где,
| Параметр | Описание |
|---|---|
created | дата создания платежа |
description | описание выставленного платежа |
is_unique | уникальность номера платежа на стороне магазина (shop_order_id) |
payer_currency | валюта списания суммы платежа payer_price с кошелька клиента |
payer_price | сумма списания с кошелька клиента в валюте payer_currency |
payment_id | уникальный номер операции на стороне Qostiq, возвращается в параметре id на запрос создания платежа /crypto/bill/create |
processed | время получения финального статуса платежа |
ps_data.ps_payer_account | номер кошелька плательщика |
shop_amount | сумма выставленного платежа в валюте shop_currency |
shop_currency | валюта платежа |
shop_id | номер магазина |
shop_order_id | номер платежа на стороне магазина |
shop_refund | сумма зачисления платежа на магазин в валюте shop_currency |
status | статус счета, информацию о статусах можно посмотреть в пункте Статусы платежей |
Внимание! Запрос статуса необходимо делать не чаще чем раз в 10 секунд.
Если shop_order_id не уникален по операциям bill в рамках магазина, в ответе содержится "is_unique":false и метод возвращает информацию по последнему созданному Bill.
Уникальность shop_order_id проверяется в зависимости от настроек магазина, рекомендуем включить данную функцию и передавать уникальное значение для вашего магазина, для избежание дублированного выставления счетов на оплату.
Запрос статуса криптовалютного платежа по подписке [POST]
- Request
{
"now": 1691676646,
"shop_id": 6,
"shop_order_id": "test payment",
"sign": "97a8d477e41d7e61af1a65ac9c662d1b28064aa4248a4eebb641deb5524e37f1"
}
- Response 200 ()
{
"data": {
"created": "2023-08-10 12:03:20",
"description": "",
"is_unique": false,
"payer_currency": "USDT",
"payer_price": "1.0",
"payment_id": 1579,
"processed": "2023-08-10 12:03:20",
"ps_data": {
"ps_payer_account": "31645670435"
},
"shop_amount": "1.0",
"shop_currency": "USDT",
"shop_id": 6,
"shop_order_id": "test payment",
"shop_refund": "0.97",
"status": 2
},
"error_code": 0,
"message": "Ok",
"result": true
}
Статус платежей по подписке [/bill/status]
Значение status | Название | Описание | Финальный? |
|---|---|---|---|
1 | Waiting | Платеж находится в стадии ожидания действий пользователя | Нет |
2 | Paid | Платеж оплачен клиентом | Да |
3 | Canceled | Платеж отменен клиентом | Да |
4 | Expired | Истёк срок жизни счёта | Да |
Запрос статуса Bill при неуникальном shop_order_id [POST]
- Request (application/json)
{
"now": "2021-05-01 16:56:25.009469",
"shop_id": "112",
"shop_order_id": "123billtest",
"sign": "6fb934f7e00d205cb5ebb62117d9b74029d84c2ffc7c87fe5b38ac5196fecf02"
}
- Response 200 ()
{
"data": {
"client_price": 1.0,
"created": "2021-06-09 13:47:05",
"description": "",
"is_unique": false,
"payment_id": 19732961,
"payway": "qostiq_usd",
"processed": null,
"ps_currency": 980,
"ps_data": {
"ps_payer_account": "201538122124"
},
"shop_amount": 1.0,
"shop_currency": 980,
"shop_id": 1092,
"shop_order_id": "123billtest",
"shop_refund": 0.93,
"status": 4
},
"error_code": 0,
"message": "Ok",
"result": true
}
Ошибки при использовании функционала по подписке [/error]
| Запрос | error_code | message | Описание |
|---|---|---|---|
| /bill/recurrent /crypto/bill/recurrent /auth_token/revoke | 10 | Auth token ({token}) not found | Токен не существует или неактивный |
| /bill/recurrent /crypto/bill/recurrent | 9 | Insufficient payer (id=6) balance | Недостаточно средств для списания на кошельке клиента |
| /bill/recurrent /crypto/bill/recurrent | 44 | Limit exceeds | Превышен установленый клиентом лимит на оплату по подписке |
Запрос c ошибкой в ответе [POST]
- Request
{
"amount":"1",
"currency":840,
"shop_id": 6,
"token": "0b2808dc-3b6e-48d0-ac9b-64e31b756182",
"now": 1692098067,
"shop_order_id":"test payment",
"sign": "8a461f70b3a8d4f5e2668f9de4ad17c8d1759f891333caf03ae9f50d5015618d"
}
- Response 200 ()
{
"data": null,
"error_code": 44,
"message": "Limit exceeds",
"result": false
}