Skip to content

Токенизация банковских карт

Токенизация – это механизм, позволяющий Партнёру один раз запросить данные карты у пользователя и сохранить их в защищённой среде OCTO, обменяв на уникальный токен. Этот токен может быть сохранён на серверах Партнёра и связан с аккаунтом покупателя. Последующие покупки инициируются передачей токена в OCTO, запрашивая только код CVV2/CVC2.

Важно!

Отправка уведомления о финальном статусе токенизации карты, производится посредством POST запроса со стороны ПС OCTO (callback) на адрес, указанный Партнёром в параметре bind_notify_url, в методе bind_card

Блокировка токена карты.

Для блокировки выпущенного токена банковской карты, необходимо с сервера Партнёра отправить запрос /block_card_token

Алгоритм токенизации Humo/Uzcard

  1. Клиент инициирует токенизацию карты.
  2. Партнёр вызывает метод привязки карт bind_card.
  3. Наш BE отправляет запрос в Humo/Uzcard для проверки данных карты.
  4. Humo/Uzcard подтверждает данные.
  5. Наш BE подтверждает Партнёру.
  6. Партнёр вызывает метод получения срока действия OTP verificationInfo.
  7. Наш BE подтверждает запрос Партнёра.
  8. Humo/Uzcard отправляет OTP код клиенту.
  9. Клиент передаёт OTP код Партнёру.
  10. Партнёр вызывает метод проверки кода /bind_card/check_sms.
  11. Наш BE отправляет код в Humo/Uzcard.
  12. Humo/Uzcard подтверждает списание.
  13. Наш BE уведомляет Партнёра.
  14. Наш BE отправляет запрос на возврат средств в Humo/Uzcard.
  15. Humo/Uzcard подтверждает возврат.
  16. Наш BE отправляет callback о статусе Партнёру.
  17. Наш BE отправляет токен Партнёру.
  18. Партнёр отправляет подтверждение получения.*

Примечание

Если Партнёр не отправит подтверждение получения, наш BE отправит повторные запросы до трёх раз. При отсутствии ответа токен аннулируется.

*BE - Back End


Логотип

Токенизация Humo/Uzcard

Алгоритм токенизации Visa/MC

  1. Клиент инициирует токенизацию карты.
  2. Партнёр вызывает метод привязки карт bind_card.
  3. Наш BE отправляет запрос в Visa/MC для проверки данных карты и тестового списания средств.
  4. Visa/MC подтверждает данные и отправляет ссылку на форму ввода OTP.
  5. Visa/MC отправляет OTP код клиенту.
  6. Клиент отправляет OTP код.
  7. Visa/MC подтверждает списание.
  8. Наш BE уведомляет Партнёра.
  9. Наш BE отправляет запрос на возврат средств в Visa/MC.
  10. Visa/MC подтверждает возврат.
  11. Наш BE отправляет callback о статусе Партнёру.
  12. Наш BE отправляет токен Партнёру.
  13. Партнёр отправляет подтверждение получения.

Примечание

Если Партнёр не отправит подтверждение получения, наш BE отправит повторные запросы до трёх раз. При отсутствии ответа токен аннулируется.

*BE - Back End


Логотип

Токенизация Visa/MC

Методы

/bind_card

  • URL: https://secure.octo.uz/bind_card
  • Method: POST
  • Content-type: application/json

Пример запроса

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_idIntegerДаУникальный ID магазина, доступный в личном кабинете (ЛК).
octo_secretStringДаПерсональный секретный ключ магазина, генерируемый в ЛК.
shop_transaction_idStringДаУникальный идентификатор транзакции на стороне магазина.
panStringДаНомер карты клиента.
expStringДаСрок действия карты в формате ГГММ.
phoneStringДаНомер телефона клиента, связанный с картой.
methodStringДаМетод оплаты. Возможные значения: humo, uzcard, bank_card.
cvc2StringНетКод безопасности карты (CVC2).
return_urlStringДаURL для перенаправления пользователя после завершения оплаты.
notify_urlStringНетURL для уведомлений о статусе платежа.
bind_notify_urlStringНетURL для уведомлений при успешной привязке карты.

Пример успешного ответа

json
{
    "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 для унификации ответов."
}

Параметры успешного ответа

ПараметрТипОбязательностьОписание
errorIntegerДаКод ошибки. 0 указывает на успешную операцию.
dataObjectДаОсновной объект с информацией о транзакции.
shop_transaction_idStringДаУникальный идентификатор транзакции на стороне магазина.
octo_payment_UUIDStringДаУникальный идентификатор платежа в системе Octo.
statusStringДаСтатус платежа. Возможные значения: created, succeeded, failed и др.
octo_pay_urlStringДаСсылка на платежную страницу для проведения оплаты.
refunded_sumNumberДаСумма возврата. По умолчанию 0, если возврат не проводился.
total_sumNumberДаОбщая сумма транзакции.
apiMessageForDevelopersStringНетСообщение для разработчиков о возможных изменениях в API.

Пример неуспешного ответа

json
{
    "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.

Пример успешного ответа

json
{
    "error": 0,
    "errMessage": "",
    "data": {
        "verifyId": 819,
        "phone": "+998** *****33",
        "secondsLeft": 221
    }
}

Параметры успешного ответа

ПараметрТипОбязательностьОписание
errorintДаКод ошибки: 0 означает отсутствие ошибок.
errMessagestringНетСообщение об ошибке, пустое если ошибки нет.
dataobjectДаОбъект с деталями процесса верификации.
verifyIdintДаУникальный идентификатор процесса верификации.
phonestringДаНомер телефона, к которому привязана верификация (частично скрыт для безопасности).
secondsLeftintДаОставшееся время (в секундах) до истечения срока действия верификации.

Пример неуспешного ответа

json
{
    "error": 0,
    "errMessage": "",
    "data": {
        "verifyId": 819,
        "phone": "+998** *****33",
        "secondsLeft": 0
    }
}

Примечание

В случае неуспешного ответа verificationInfo, будет такой же формат ответа, что и при успехе, но в параметре secondsLeft будет значение 0.

Параметры неуспешного ответа

ПараметрТипОбязательностьОписание
errorintДаКод ошибки (0 означает отсутствие ошибок, но secondsLeft=0 говорит о том, что верификация неактивна или время истекло).
errMessagestringНетСообщение об ошибке (может быть пустым).
dataobjectДаОбъект с деталями процесса верификации.
verifyIdintДаУникальный идентификатор процесса верификации.
phonestringДаНомер телефона, к которому привязана верификация (частично скрыт).
secondsLeftintДаОставшееся время (в секундах) до истечения срока действия верификации (равно 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

Пример запроса

json
{
    "octo_shop_id": "{{merchant_id}}",
    "octo_secret": "{{merchant_secret}}",
    "smsKey": "61135",
    "paymentUUID": "{{bind_octo_payment_UUID}}",
    "verifyId": "{{bind_verifyId}}"
}

Параметры запроса

ПараметрТипОбязательностьОписание
octo_shop_idIntegerДаУникальный ID магазина (доступен в личном кабинете).
octo_secretStringДаПерсональный секретный ключ магазина.
smsKeyStringДаSMS-код, отправленный на телефон клиента, связанный с картой.
paymentUUIDStringДаУникальный идентификатор транзакции привязки карты.
verifyIdIntegerДаИдентификатор для подтверждения привязки карты.

Пример успешного ответа

json
{
  "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"
}

Параметры успешного ответа

ПараметрТипОбязательностьОписание
errorIntegerДаКод ошибки. Значение 0 указывает на успешное выполнение операции.
dataObjectДаДанные ответа, содержащие детали платежа.
shop_transaction_idStringДаУникальный идентификатор транзакции на стороне магазина.
octo_payment_UUIDStringДаУникальный идентификатор платежа, созданный системой OCTO.
statusStringДаТекущий статус платежа (succeeded, failed, created и т.д.).
octo_pay_urlStringДаURL для проверки или получения статуса платежа.
processor_keyStringНетУникальный ключ процессора для идентификации транзакции.
processing_referenceStringНетРеференс транзакции в системе обработки платежей.
transfer_sumDecimalНетСумма, перечисленная получателю после вычета комиссий.
refunded_sumDecimalНетСумма, которая была возвращена пользователю в результате возврата.
total_sumDecimalДаПолная сумма транзакции.
payed_timeStringНетДата и время завершения оплаты в формате YYYY-MM-DD HH:MM:SS.
first6StringНетПервые 6 цифр номера карты, использованной для платежа.
last4StringНетПоследние 4 цифры номера карты, использованной для платежа.
apiMessageForDevelopersStringНетСообщение для разработчиков, содержащее дополнительные детали или уведомления о будущем изменении API.

Пример ошибки сервера

json
{
  "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

json
{
    "shop_transaction_id": "d87f4hd8d76f4h58d",
    "pan": "4276380012341025",
    "exp": "2006",
    "cardHolderName": "BOB MARLEY",
    "card_token": "sdf9g87sd6f9g876sdf9g876sdf98g",
    "status": "active"
}

Параметров запроса callback

ПараметрТипОбязательностьОписание
shop_transaction_idStringДаУникальный идентификатор транзакции в магазине.
panStringДаИсходный PAN (номер карты).
expStringДаДата истечения срока действия карты в формате YYMM.
cardHolderNameStringДаИмя держателя карты.
card_tokenStringДаТокен карты, полученный после привязки.
statusStringДаСтатус карты: active (успешно привязана) или failed (привязка не удалась).

Ожидаемый ответ - HTTP статус: 200

Важно!

  • Если ответ успешный, система OCTO считает, что запрос обработан.
  • Если ответ неуспешный, система OCTO повторит запрос до трёх раз.
  • Если после трёх попыток успешный ответ не будет получен, OCTO прекратит отправку запросов и аннулирует токен.

Пример успешного ответа - HTTP статус: 200

json
{
    "status": "success",
    "message": "Callback processed successfully"
}

Пример неуспешного ответа - HTTP статус: 400 и выше

json
{
    "status": "error",
    "message": "Invalid shop_transaction_id"
}

block_card_token

  • URL: https://secure.octo.uz/block_card_token
  • Method: POST
  • Content-type: application/json

Пример запроса

json
{
    "octo_shop_id": 242,
    "octo_secret": "1d45df74-bb95-47cf-a616-8d6dcee2e10d",
    "card_token": "sdf9g87sd6f9g876sdf9g876sdf98g"
}

Описание параметров тела запроса:

ПараметрТипОбязательностьОписание
octo_shop_idIntegerДаУникальный идентификатор магазина в системе Octo.
octo_secretStringДаСекретный ключ для аутентификации запросов.
card_tokenStringДаТокен карты, используемый для проведения платежа.

Пример успешного ответа

json
{
    "error": 0,
    "errMessage": null,
    "status": "blocked"
}

Описание параметров ответа:

ПараметрТипОбязательностьОписание
errorIntegerДаКод ошибки. 0 указывает на отсутствие ошибок.
errMessageStringНетСообщение об ошибке, если таковая имеется.
statusStringДаСтатус операции. Например, blocked.

Возможные коды ошибок

КодОписание
0Нет ошибок.
1Ошибка формата данных.
2Ошибка авторизации.
4Внутренняя ошибка сервиса.
5Токен не найден.
6Токен был не в статусе active.

Возможные статусы токена

СтатусОписание
activeГотов к оплате.
blockedЗаблокирован.
initВ стадии авторизации карты.
failedНеуспешная авторизация.