Токенизация банковских карт
Токенизация – это механизм, позволяющий Партнёру один раз запросить данные карты у пользователя и сохранить их в защищённой среде OCTO, обменяв на уникальный токен. Этот токен может быть сохранён на серверах Партнёра и связан с аккаунтом покупателя. Последующие покупки инициируются передачей токена в OCTO, запрашивая только код CVV2/CVC2.
Важно!
Отправка уведомления о финальном статусе токенизации карты, производится посредством POST
запроса со стороны ПС OCTO (callback
) на адрес, указанный Партнёром в параметре bind_notify_url
, в методе bind_card
Блокировка токена карты.
Для блокировки выпущенного токена банковской карты, необходимо с сервера Партнёра отправить запрос /block_card_token
Алгоритм токенизации Humo/Uzcard
- Клиент инициирует токенизацию карты.
- Партнёр вызывает метод привязки карт
bind_card
. - Наш BE отправляет запрос в Humo/Uzcard для проверки данных карты.
- Humo/Uzcard подтверждает данные.
- Наш BE подтверждает Партнёру.
- Партнёр вызывает метод получения срока действия OTP
verificationInfo
. - Наш BE подтверждает запрос Партнёра.
- Humo/Uzcard отправляет OTP код клиенту.
- Клиент передаёт OTP код Партнёру.
- Партнёр вызывает метод проверки кода
/bind_card/check_sms
. - Наш BE отправляет код в Humo/Uzcard.
- Humo/Uzcard подтверждает списание.
- Наш BE уведомляет Партнёра.
- Наш BE отправляет запрос на возврат средств в Humo/Uzcard.
- Humo/Uzcard подтверждает возврат.
- Наш BE отправляет
callback
о статусе Партнёру. - Наш BE отправляет токен Партнёру.
- Партнёр отправляет подтверждение получения.*
Примечание
Если Партнёр не отправит подтверждение получения, наш BE отправит повторные запросы до трёх раз. При отсутствии ответа токен аннулируется.
*BE
- Back End
Алгоритм токенизации Visa/MC
- Клиент инициирует токенизацию карты.
- Партнёр вызывает метод привязки карт
bind_card
. - Наш BE отправляет запрос в Visa/MC для проверки данных карты и тестового списания средств.
- Visa/MC подтверждает данные и отправляет ссылку на форму ввода OTP.
- Visa/MC отправляет OTP код клиенту.
- Клиент отправляет OTP код.
- Visa/MC подтверждает списание.
- Наш BE уведомляет Партнёра.
- Наш BE отправляет запрос на возврат средств в Visa/MC.
- Visa/MC подтверждает возврат.
- Наш BE отправляет callback о статусе Партнёру.
- Наш BE отправляет токен Партнёру.
- Партнёр отправляет подтверждение получения.
Примечание
Если Партнёр не отправит подтверждение получения, наш BE отправит повторные запросы до трёх раз. При отсутствии ответа токен аннулируется.
*BE
- Back End
Методы
/bind_card
- URL:
https://secure.octo.uz/bind_card
- Method:
POST
- Content-type:
application/json
Пример запроса
{
"octo_shop_id": "{{merchant_id}}",
"octo_secret": "{{merchant_secret}}",
"shop_transaction_id": "{{$randomUUID}}",
"pan": "9860240101226506",
"exp": "2805",
"phone": "998901234567",
"cardHolderName": "Card Holder Name",
"cvc2": "",
"method": "humo",
"return_url": "https://notify-url.uz",
"notify_url": "https://notify-url.uz",
"bind_notify_url": "https://notify-url.uz"
}
Параметры запроса
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
octo_shop_id | Integer | Да | Уникальный ID магазина, доступный в личном кабинете (ЛК). |
octo_secret | String | Да | Персональный секретный ключ магазина, генерируемый в ЛК. |
shop_transaction_id | String | Да | Уникальный идентификатор транзакции на стороне магазина. |
pan | String | Да | Номер карты клиента. |
exp | String | Да | Срок действия карты в формате ГГММ. |
phone | String | Да | Номер телефона клиента, связанный с картой. |
method | String | Да | Метод оплаты. Возможные значения: humo, uzcard, bank_card. |
cvc2 | String | Нет | Код безопасности карты (CVC2). |
return_url | String | Да | URL для перенаправления пользователя после завершения оплаты. |
notify_url | String | Нет | URL для уведомлений о статусе платежа. |
bind_notify_url | String | Нет | URL для уведомлений при успешной привязке карты. |
Пример успешного ответа
{
"error": 0,
"data": {
"shop_transaction_id": "123431321323334132333",
"octo_payment_UUID": "06000144-db56-47b6-9eba-021ad4ff246b",
"status": "created",
"octo_pay_url": "https://pay-dev.octo.uz/uzcard/sms/06000144-db56-47b6-9eba-021ad4ff246b",
"refunded_sum": 0,
"total_sum": 1000
},
"apiMessageForDevelopers": "Поле errorMessage устарело, просим перейти на errMessage для унификации ответов."
}
Параметры успешного ответа
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
error | Integer | Да | Код ошибки. 0 указывает на успешную операцию. |
data | Object | Да | Основной объект с информацией о транзакции. |
shop_transaction_id | String | Да | Уникальный идентификатор транзакции на стороне магазина. |
octo_payment_UUID | String | Да | Уникальный идентификатор платежа в системе Octo. |
status | String | Да | Статус платежа. Возможные значения: created, succeeded, failed и др. |
octo_pay_url | String | Да | Ссылка на платежную страницу для проведения оплаты. |
refunded_sum | Number | Да | Сумма возврата. По умолчанию 0 , если возврат не проводился. |
total_sum | Number | Да | Общая сумма транзакции. |
apiMessageForDevelopers | String | Нет | Сообщение для разработчиков о возможных изменениях в API. |
Пример неуспешного ответа
{
"error": 20,
"errMessage": "Active or pending token already exists",
"data": null,
"errorMessage": "Active or pending token already exists",
"apiMessageForDevelopers": "Поле errorMessage устарело, просим перейти на errMessage для унификации ответов."
}
verificationInfo
- URL:
https://secure.octo.uz/verificationInfo/{octo_payment_UUID}
- Method:
POST
- Content-type:
application/json
Примечание
Отправляется только octo_payment_UUID.
Пример успешного ответа
{
"error": 0,
"errMessage": "",
"data": {
"verifyId": 819,
"phone": "+998** *****33",
"secondsLeft": 221
}
}
Параметры успешного ответа
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
error | int | Да | Код ошибки: 0 означает отсутствие ошибок. |
errMessage | string | Нет | Сообщение об ошибке, пустое если ошибки нет. |
data | object | Да | Объект с деталями процесса верификации. |
verifyId | int | Да | Уникальный идентификатор процесса верификации. |
phone | string | Да | Номер телефона, к которому привязана верификация (частично скрыт для безопасности). |
secondsLeft | int | Да | Оставшееся время (в секундах) до истечения срока действия верификации. |
Пример неуспешного ответа
{
"error": 0,
"errMessage": "",
"data": {
"verifyId": 819,
"phone": "+998** *****33",
"secondsLeft": 0
}
}
Примечание
В случае неуспешного ответа verificationInfo
, будет такой же формат ответа, что и при успехе, но в параметре secondsLeft
будет значение 0
.
Параметры неуспешного ответа
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
error | int | Да | Код ошибки (0 означает отсутствие ошибок, но secondsLeft=0 говорит о том, что верификация неактивна или время истекло). |
errMessage | string | Нет | Сообщение об ошибке (может быть пустым). |
data | object | Да | Объект с деталями процесса верификации. |
verifyId | int | Да | Уникальный идентификатор процесса верификации. |
phone | string | Да | Номер телефона, к которому привязана верификация (частично скрыт). |
secondsLeft | int | Да | Оставшееся время (в секундах) до истечения срока действия верификации (равно 0 в случае неуспешного ответа). |
Важно!
Если secondsLeft=0
, значит время верификации истекло или процесс верификации неактивен. При возникновении вопросов по интеграции обращайтесь в техническую поддержку сервиса Octo.
/bind_card/check_sms_key
- URL:
https://secure.octo.uz/bind_card/check_sms_key
- Method:
POST
- Content-type:
application/json
Пример запроса
{
"octo_shop_id": "{{merchant_id}}",
"octo_secret": "{{merchant_secret}}",
"smsKey": "61135",
"paymentUUID": "{{bind_octo_payment_UUID}}",
"verifyId": "{{bind_verifyId}}"
}
Параметры запроса
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
octo_shop_id | Integer | Да | Уникальный ID магазина (доступен в личном кабинете). |
octo_secret | String | Да | Персональный секретный ключ магазина. |
smsKey | String | Да | SMS-код, отправленный на телефон клиента, связанный с картой. |
paymentUUID | String | Да | Уникальный идентификатор транзакции привязки карты. |
verifyId | Integer | Да | Идентификатор для подтверждения привязки карты. |
Пример успешного ответа
{
"error": 0,
"data": {
"shop_transaction_id": "123431321323334132333",
"octo_payment_UUID": "06000144-db56-47b6-9eba-021ad4ff246b",
"status": "succeeded",
"octo_pay_url": "https://pay-dev.octo.uz/status/06000144-db56-47b6-9eba-021ad4ff246b",
"processor_key": "023205044087",
"processing_reference": "1735210612392_71229",
"transfer_sum": 980.0000,
"refunded_sum": 1000.00,
"total_sum": 1000.00,
"payed_time": "2024-12-26 15:56:52",
"first6": "860050",
"last4": "2744"
},
"apiMessageForDevelopers": "Поле errorMessage устарело, просим перейти на errMessage для унификации ответов. Так же пожалуйста знайте, что в дальнейшем все поля кроме error и errMessage будут передаваться в data. Для более подробного ознакомление свяжитесь с технической поддержкой сервиса",
"shop_transaction_id": "123431321323334132333",
"octo_payment_UUID": "06000144-db56-47b6-9eba-021ad4ff246b",
"status": "succeeded",
"octo_pay_url": "https://pay-dev.octo.uz/status/06000144-db56-47b6-9eba-021ad4ff246b",
"processor_key": "023205044087",
"processing_reference": "1735210612392_71229",
"transfer_sum": 980.0000,
"refunded_sum": 1000.00,
"total_sum": 1000.00,
"payed_time": "2024-12-26 15:56:52"
}
Параметры успешного ответа
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
error | Integer | Да | Код ошибки. Значение 0 указывает на успешное выполнение операции. |
data | Object | Да | Данные ответа, содержащие детали платежа. |
shop_transaction_id | String | Да | Уникальный идентификатор транзакции на стороне магазина. |
octo_payment_UUID | String | Да | Уникальный идентификатор платежа, созданный системой OCTO. |
status | String | Да | Текущий статус платежа (succeeded , failed , created и т.д.). |
octo_pay_url | String | Да | URL для проверки или получения статуса платежа. |
processor_key | String | Нет | Уникальный ключ процессора для идентификации транзакции. |
processing_reference | String | Нет | Референс транзакции в системе обработки платежей. |
transfer_sum | Decimal | Нет | Сумма, перечисленная получателю после вычета комиссий. |
refunded_sum | Decimal | Нет | Сумма, которая была возвращена пользователю в результате возврата. |
total_sum | Decimal | Да | Полная сумма транзакции. |
payed_time | String | Нет | Дата и время завершения оплаты в формате YYYY-MM-DD HH:MM:SS . |
first6 | String | Нет | Первые 6 цифр номера карты, использованной для платежа. |
last4 | String | Нет | Последние 4 цифры номера карты, использованной для платежа. |
apiMessageForDevelopers | String | Нет | Сообщение для разработчиков, содержащее дополнительные детали или уведомления о будущем изменении API. |
Пример ошибки сервера
{
"title": "Internal Server Error",
"status": 500,
"detail": "Cannot invoke \"com.octo.uzcard.dto.CardInfo.getCardtype()\" because the return value of \"com.octo.uzcard.dto.CardNewVerifyResponse.getResult()\" is null"
}
callback
Пример запроса callback
{
"shop_transaction_id": "d87f4hd8d76f4h58d",
"pan": "4276380012341025",
"exp": "2006",
"cardHolderName": "BOB MARLEY",
"card_token": "sdf9g87sd6f9g876sdf9g876sdf98g",
"status": "active"
}
Параметров запроса callback
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
shop_transaction_id | String | Да | Уникальный идентификатор транзакции в магазине. |
pan | String | Да | Исходный PAN (номер карты). |
exp | String | Да | Дата истечения срока действия карты в формате YYMM . |
cardHolderName | String | Да | Имя держателя карты. |
card_token | String | Да | Токен карты, полученный после привязки. |
status | String | Да | Статус карты: active (успешно привязана) или failed (привязка не удалась). |
Ожидаемый ответ - HTTP статус: 200
Важно!
- Если ответ успешный, система OCTO считает, что запрос обработан.
- Если ответ неуспешный, система OCTO повторит запрос до трёх раз.
- Если после трёх попыток успешный ответ не будет получен, OCTO прекратит отправку запросов и аннулирует токен.
Пример успешного ответа - HTTP статус: 200
{
"status": "success",
"message": "Callback processed successfully"
}
Пример неуспешного ответа - HTTP статус: 400
и выше
{
"status": "error",
"message": "Invalid shop_transaction_id"
}
block_card_token
- URL:
https://secure.octo.uz/block_card_token
- Method:
POST
- Content-type:
application/json
Пример запроса
{
"octo_shop_id": 242,
"octo_secret": "1d45df74-bb95-47cf-a616-8d6dcee2e10d",
"card_token": "sdf9g87sd6f9g876sdf9g876sdf98g"
}
Описание параметров тела запроса:
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
octo_shop_id | Integer | Да | Уникальный идентификатор магазина в системе Octo. |
octo_secret | String | Да | Секретный ключ для аутентификации запросов. |
card_token | String | Да | Токен карты, используемый для проведения платежа. |
Пример успешного ответа
{
"error": 0,
"errMessage": null,
"status": "blocked"
}
Описание параметров ответа:
Параметр | Тип | Обязательность | Описание |
---|---|---|---|
error | Integer | Да | Код ошибки. 0 указывает на отсутствие ошибок. |
errMessage | String | Нет | Сообщение об ошибке, если таковая имеется. |
status | String | Да | Статус операции. Например, blocked . |
Возможные коды ошибок
Код | Описание |
---|---|
0 | Нет ошибок. |
1 | Ошибка формата данных. |
2 | Ошибка авторизации. |
4 | Внутренняя ошибка сервиса. |
5 | Токен не найден. |
6 | Токен был не в статусе active . |
Возможные статусы токена
Статус | Описание |
---|---|
active | Готов к оплате. |
blocked | Заблокирован. |
init | В стадии авторизации карты. |
failed | Неуспешная авторизация. |