Обзор API
Протокол реализуется мерчантом при подключении к процессинговому центру ТЕКО.
- Запросы и ответы для передачи прикладной информации используют JSON.
- Запрос должен содержать тело с JSON-запросом.
- Не смотря на JSON, протокол является строго типизированным.
- Все ответы приходят в обертке { success: true/false, result: {...} }
Безопасность
Общение происходит только по протоколу HTTPS (не актуально для тестовой среды).
Каждый запрос к API должен содержать поле client и заголовок (HTTP header) Signature. Пример HTTP заголовка: "Signature: VgepHaYJBn9jwAg3N6wzFhi8UeQ="
Для вычисления подписи Signature используется алгоритм HMAC-SHA1.Подписи подлежит:
- В случае POST запроса (тело запроса)
- В случае GET запроса (GET параметры)
echo -n "REQUEST_BODY" | openssl dgst -binary -sha1 -hmac "SECRET_KEY" | openssl base64
Типы данных
Int
Целочисленный тип. ЭквивалентенBigInt
в ScalaFloat
Число с плавающей точкой. ЭквивалентенDouble
String
СтрокаList[type]
Список элементов определенного типа. В JSON представляется массивомEnum
Строка с фиксированным набором значенийJSON
JSON объект со свободной структуройClassName
JSON объект с фиксированной структурой (см. раздел Классы)Map
JSON объект вида { key: value, ... }, где key и value могут быть только строками
Классы
Классы бывают двух типов: простые, включающие в себя только примитивные типы (Int, String, Float и т.д.), и сложные, включающие в себя другие классы помимо примитивных типов
Payer
cls == "mc"
cls == "card"
idStringrequired
Hash карты, полученный от сервиса хэширования ДДК,
либо 'unknown' в случае неизвестных ДДК.payment_systemEnumoptional
Платежная система.
Возможные значения:plastic_card
- в случае, когда процессингу нужно будет вернуть форму для заполнения ДДКvisa
master_card
visa_electron
maestro
extraJSONoptional
Различные дополнительные сведения
cls == "cpa"
{ "cls": "mc", "phone_number": "79993332211" }
Product
{ "url": "https://teko.io", "id": "Teko", "name": "Тариф E-commerce", "redirectUrl": "https://teko.io" }
AmountOptions
{ "title": "Однократно", "amountOptions": [ 10000, 30000, 50000, 100000, 300000, 500000 ], "defaultAmountOption": 10000, "withYourAmountInput": true }
Order
cls == "item_list"
item_listList[item]required
Список покупок.
Подробнее в классе Item
{ "cls": "item_list", "item_list": [ { "id": 121, "name": "Gold", "count": 100500 } ] }
Status
{ "cls": "failed", "code": 1144, "description": "provider is unavailable" }
CatalogItem
idStringrequired
Идентификатор товараnameStringoptional
Название товараcatStringoptional
КатегорияsubcatStringoptional
ПодкатегорияinnerStringoptional
Выражение для заполнения поляdst.id
при платежеminIntoptional
Минимальная сумма платежаmaxIntoptional
Максимальная сумма платежаlogoStringoptional
Логотип (url)commentStringoptional
КомментарийisActiveBooleanoptional
Вкл/выклtoSaveBooleanoptional
historyTagsList[String]optional
CatalogItemField
field_nameStringrequired
Название поляtypeEnumoptional
Может принимать одно из значений:text
,amount
,number
,date
,phone
,enum
,address
requiredBooleanoptional
reg_exStringoptional
min_lengthIntoptional
max_lengthIntoptional
placeholderStringoptional
commentStringoptional
conditionStringoptional
visualVisualoptional
JSON из трех полей:size: Int
,offset: Int
,post: Int
toSaveBooleanoptional
itemsList[CatalogEnumValue]optional
CatalogEnumValue - JSON из 2-х полей:name: String
,value: String
Коды ошибок
42
Сервис временно недоступен201
Ошибка на стороне получателя средств300
Отказ клиента в процессе подтверждения платежа301
Не получено подтверждение клиента302
Техническая ошибка. Необходимо провести платёж снова. При повторении ошибки обратитесь техническую поддержку305
Услуга недоступна для данного источника средств306
Нарушен один из лимитов (сумма, количество попыток и т.п.) или у данного клиента существует незавершенный платёж307
Недостаточно денежных средств308
Для данной карты услуга не доступна. Истек срок действия или существуют ограничения со стороны эмитента309
При оплате была указана неверная сумма платежа или неверный номер счета310
Ошибка идентификации источника средств311
Указан неверный номер телефона или параметры товара312
Операция завершена399
Техническая ошибка на стороне источника денежных средств401
Некорректная подпись402
Некорректный запрос601
Некорректные параметры платежа602
Некорректная валюта603
Некорректный метод оплаты-1
Неизвестная ошибка
Протокол инициатора
Предназначен для инициализации платежа, отслеживания информации и проведения возврата по успешному платежу, а также отмены платежа через шлюз Teko.
Обзор протокола
- Протокол использует REST архитектуру
- В нем присутствуют 3 метода [
initPayment
,getPaymentStatus
, оповещение об изменении статуса платежа], после реализации они должны отправлять POST-запрос на шлюз Теко и отображать полученный ответ - Во время настройки и отладки протокола используется тестовая среда - playground
- URL для отправки тестовых запросов -
http://pg.teko.io/api/initiators/default/[Имя метода]
- Вместо
[Имя метода]
нужно подставить имя небходимого метода, например:http://pg.teko.io/api/initiators/default/initPayment
- Для передачи информации в запросах и ответах используется формат JSON
- Каждый запрос должен содержать заголовок (HTTP header) "Content-Type" со значением "application/json"
- Не смотря на JSON, протокол является строго типизированным
- Все ответы приходят в обертке
{ success: true/false, result: {...} }
В рамках стандартного флоу необходимо реализовать метод initPayment
. В случае, если в запросе initPayment
заполнен параметр callback, Вам придет оповещение об изменении статуса платежа по его завершению. Иначе Вам необходимо самостоятельно узнавать об успешности завершения платежа с помощью запроса getPaymentStatus
.
Также протокол предоставляет дополнительные методы:
- Инициализация платежа с возможностью перенаправления пользователя на платежную форму (
initRedirectPayment
) - Проведение возврата (
rollbackPayment
) - Получения подробной информации о совершенных транзакциях (
getPaymentById
,getPaymentsByTag
)
initPayment
Запрос на инициализацию платежа.
Является POST-запросом на шлюз.
В случае, если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
clientClientrequired
Идентификатор пользователя APIproductStringrequired
Наименование продукта (проекта)paymentPaymentrequired
Информация о сумме платежа и валютеsrcPayerrequired
Информация об аккаунте плательщика в платежной системеdstAccountrequired if (
order.cls == "item_list" || order.cls == "transfer"
)Информация об аккаунте в проектеorderOrderrequired
Информация о назначении платежаextraJSONoptional
json объект с дополнительной информациейcallbackStringoptional
URL, на который придет оповещение по завершению платежа. Указать, если такое оповещение нужно. Паттерн 'https://*'security_extraJSONoptional
Предназначено для антифрод системы (необходимость передачи параметра определяется индивидуально при согласовании подключения)tagStringoptional
Строковая метка для поиска платежей в системе Теко (Запрещено использование символа |). Например, после инициации платежей с полемtag == "Europe"
в будущем можно запросить список всех платежей с соответствующим полемtag
при помощи запросаgetPaymentsByTag
{ "client": { "id": "company_name", "showcase": "mobile_app" }, "product": "world_of_warcraft", "payment": { "amount": 10000, "currency": 643, "exponent": 2 }, "src": { "cls": "mc", "phone_number": "79163332211", "operator": "mts_ru" }, "dst": { "id": "Y6UBATOP9000", "extra": { "premium": true, "game_server": "Europe" } }, "order": { "transaction": { "id": "1122334455", "start_t": 1428430631504 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "extra": { "from": "mobile_app", "some_key": "some_value" }, "callback": "https://companydomain.com", "tag": "Europe" }
{ "success": true, "result": { "tx": { "id": "55d8fb900cf23b38021b7c65", "start_t": 1440283536655 } } }
{ "success": false, "result": { "code": 401, "description": "invalid signature" } }
initRedirectPayment
Запрос на инициализацию платежа с возможностью перенаправить пользователя напрямую на платежную форму.
clientClientrequired
Идентификатор пользователя APIproductStringrequired
Наименование продукта (проекта)paymentPaymentrequired
Информация о сумме платежа и валютеsrcPayerrequired
Информация об аккаунте плательщика в платежной системеdstAccountrequired
Информация об аккаунте в проектеorderOrderrequired
Информация о назначении платежаextraJSONoptional
json объект с дополнительной информациейcallbackStringoptional
URL, на который придет оповещение по завершению платежа. Указать, если такое оповещение нужно. Паттерн 'https://*'security_extraJSONoptional
Предназначено для антифрод системы (необходимость передачи параметра определяется индивидуально при согласовании подключения)tagStringoptional
Строковая метка для поиска платежей в системе Теко (Запрещено использование символа |). Например, после инициации платежей с полемtag == "Europe"
в будущем можно запросить список всех платежей с соответствующим полемtag
при помощи запросаgetPaymentsByTag
success == true
result.txTransactionrequired
Идентификатор транзакции процессингаresult.tx.start_tTransactionrequired
Время создания транзакции в процессингеresult.tx.finish_tTransactionoptional
Время окончания транзакции в процессингеresult.statusStatusoptional
Возвращается только в том случае, если у платежа есть все необходимые настройки для редиректаresult.status.clsStatusrequired
Статус транзакции в процессингеresult.status.redirect.methodStatusrequired
HTTP Метод, используемый при перенаправленииresult.status.redirect.urlStatusrequired
URL для перенаправления пользователяresult.status.redirect.paramsStatusrequired
Параметры запроса для перенаправления (это могут быть параметры дляPOST
запроса сmedia-type application/x-www-form-urlencoded
, например, параметры для прохождения 3DSecure)
success == false
Инициация оплаты по кнопке YandexPay
Данный метод также позволяет инициировать оплату по кнопке YandexPay, встроенной в Вашу платежную форму. Источником платежа служит банковская карта (Payer.cls == “card”)
. Для встраивания кнопки и дальнейшей обработки платежа шлюзом Теко необходимо:
- Подключить кнопку на сайте, руководствуясь следующей документацией: https://yandex.ru/dev/yandex-pay/doc/tutorial/index.html.
- После оформления заказа получить из кнопки PaymentToken (в нем в зашифрованном виде передаются платежные данные).
- PaymentToken передать в платежный шлюз Теко в виде строки в поле
order.extra.yandexPaymentToken
. - В поле
src.id
необходимо передать строку "yandexPaymentToken" (константа). - Результат платежа необходимо получить самостоятельно с помощью запроса на шлюз
getPaymentStatus
.
{ "client": { "id": "company_name", "showcase": "mobile_app" }, "product": "world_of_warcraft", "payment": { "amount": 10000, "currency": 643, "exponent": 2 }, "src": { "cls": "mc", "phone_number": "79163332211", "operator": "mts_ru" }, "dst": { "id": "Y6UBATOP9000", "extra": { "premium": true, "game_server": "Europe" } }, "order": { "transaction": { "id": "1122334455", "start_t": 1428430631504 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "extra": { "from": "mobile_app", "some_key": "some_value" }, "callback": "https://companydomain.com", "tag": "Europe" }
{ "success": true, "result": { "tx": { "id": "55241f34a7c82fc5f202ca21", "start_t": 1428430644807, "finish_t": 1428430647904 }, "status": { "cls": "redirect", "redirect": { "method": "POST", "url": "https://redirectPaymentSite.com", "params": { "token": "871199b37f207f0c4f725a37cdcc71dfcea880b4a4b65e3cf852c5dc1e99a8d6" } } } } }
{ "success": false, "result": { "code": 401, "description": "invalid signature" } }
{ "client": { "id": "company_name", "showcase": "mobile_app" }, "product": "world_of_warcraft", "payment": { "amount": 10000, "currency": 643, "exponent": 2 }, "src": { "cls": "card", "id": "yandexPaymentToken", "extra": { "key": "value" } }, "dst": { "id": "Y6UBATOP9000", "extra": { "premium": true, "game_server": "Europe" } }, "order": { "transaction": { "id": "1122334455", "start_t": 1428430631504 }, "cls": "transaction", "extra": { "yandexPaymentToken": "ewoidHlwZSI6ICJZYW5kZXgiLAoic2lnbmVkTWVzc2FnZSI6ICJ7XCJlbmNyeXB0ZWRNZXNzY Wdl XCI6XCIzRUlHSGhhUldsTEJZM0NRNCtoTVdmYmlFOHZETHkydndHNVZrWTVYZ0lMYXE1V mpoLwpN RUQ1WE8xdzZLd1duUWlUM1RKRFY1cmovaXhMSHpQanBONGVVd2thUVRnd1VjRkdZU0Ni d3U0cGFC aHVhT2xZS3Z4M1VoeGxHcworc1dmQ3hsSkhhd0ZXbEVjWDI1NHUvNHljNDVDbklBbWFKTEd SN1JM dkFYNjZWT2lDTy8KR3BlcVBaWHBjdFJ6ajA2OFRUaEVTbVJLdi8yVmI5UzU0Q1JJRDFaMCtR SWFt Wkl3b0toa0V0OTlGMEVYd25mS2RsemFrcEwKK040aTk5WDNFa2F2UUEySW0zbEZKNkM5T XZJS3Fh aG5ORjlFODlNSUFpZ3NuWVorL1p1N1F2dGZBZTFtVmJMRE1HSlJGcWs3TllGMFEvClhYcnd hakpD TUZjQ3ZUTmtTWGgwV215V0k3RmE5cjErRXlkSm1hb3UxWFRvL1JVdnZiZkozbDdhc2VwY3Z GY3M3 d2NLVWdpOXdXR0tlOXRkMG55NEVxelZpKytobS8KWmlKaGNTa25RQndzTkJTSE95N2FKWl ZveEk1 RFVMN2dFVjdYM0tBUzBRXCIsXCJ0YWdcIjpcIm5QQ2tCZFhnZHZiK1ZoVFNNNVJjOVFkdkV wUEZk MW1OdFN5RTBjV0N1WlU9XCIsClwiZXBoZW1lcmFsUHVibGljS2V5XCI6XCJCRmlnMnFxR0h zWC9M QTZHckZiSGNHODNlTGpUQWlCa1RUa0plNWxraTM3V01NWlVKamZUOHRUTE9kK3ZoUm1r SXJ1NGhj TVJmcHhmRVIxM1dJaE5heUU9ClwifSIsCiJwcm90b2NvbFZlcnNpb24iOiAiRUN2MiIsCiJzaWdu YXR1cmUiOiAiTUVVQ0lRRE9CU1NCMXlGbTNFOWdNMWtUcDNDSE1raEhNMWc0ZHNZS28 5L1RYaUVo bXdJZ1NNQ3AydDF0Q29yQmpoR3cxazlFdjl0dzRJeUtWVXJNQWJKbmZBZzBOZzA9IiwKImlu dGVy bWVkaWF0ZVNpZ25pbmdLZXkiOiB7CiJzaWduZWRLZXkiOiAie1wia2V5VmFsdWVcIjpcIk1Ga 3dF d1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXFZTmVQdDZCUGdDdjVKeGZPOW RGMnZyU3Ft bnA0TWhlL3ZGK1hPK0RldmJzNi8KS1ZwVlZvVEQ4TExjQW80VFpoNkl1T0RWblZwSHJUT2Jo ZzNI SlZKQT09XCIsXCJrZXlFeHBpcmF0aW9uXCI6XCIxNzY0OTUwODkyMDAwXCJ9IiwKInNpZ25 hdHVy ZXMiOiBbCiJNRVFDSURSc2xNVzd3TlpicHFWdy9kRDdoRFFoMzBoR2hxZmpmV1RCdmM3ek FZSlNB aUFHQXZqQXNsQTJBeHdkQUV1T2ZhY0ZyNkRhRTV5aWlVdVV0TTZEVXJlWllnPT0iCl0KfQp 9" } }, "extra": { "from": "mobile_app", "some_key": "some_value" }, "callback": "https://companydomain.com", "tag": "Europe" }
{ "success": true, "result": { "tx": { "id": "55d8fb900cf23b38021b7c65", "start_t": 1440283536655 } } }
{ "success": false, "result": { "code": 444, "description": "PaymentToken processing error" } }
getPaymentsByTag
Запрос на получение информации о всех платежах по указанному полю tag
В случае, если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
success == true
result.payments.tx.idTransactionrequired
Идентификатор транзакции процессингаresult.payments.tx.start_tTransactionrequired
Время создания транзакции в процессингеresult.payments.tx.finish_tTransactionoptional
Время окончания транзакции в процессингеresult.payments.status.clsStatusrequired
Статус транзакции в процессингеresult.payments.productStringrequired
Наименование продукта (проекта)result.payments.payment.amountPaymentrequired
Сумма в минорных единицах валютыresult.payments.payment.currencyPaymentrequired
Валюта (ISO код)result.payments.payment.exponentPaymentrequired
Количество знаков после запятойresult.payments.src.clsPayerrequired
Категория источника средств оплатыresult.payments.src.phone_numberPayerrequired
Номер телефонаresult.payments.src.operatorPayeroptional
Наименование оператораresult.payments.dst.idAccountrequired
Идентификатор пользователя в системе мерчантаresult.payments.dst.extraAccountoptional
Дополнительные поля для мерчантаresult.payments.extraJSONoptional
json объект с дополнительной ифнормациейresult.payments.order.clsOrderrequired
Назначение платежаresult.payments.order.transaction.idOrderrequired
Идентификатор транзакции, согласованный с мерчантомresult.payments.order.transaction.start_tOrderrequired
Время начала транзакцииresult.payments.order.extraOrderoptional
Дополнительная информация о платежеresult.payments.tagStringoptional
строковая метка, по которой возвращается список транзакций
{ "client": { "id": "test_client", "showcase": "showcases" }, "tag": "Europe" }
{ "success": true, "result": { "payments": [ { "tx": { "id": "55241f34a7c82fc5f202ca21", "start_t": 1428430644807, "finish_t": 1428430647904 }, "status": { "cls": "success" }, "product": "world_of_warcraft", "payment": { "amount": 10000, "currency": 643, "exponent": 2 }, "src": { "cls": "mc", "phone_number": "79163332211", "operator": "mts_ru" }, "dst": { "id": "Y6UBATOP9000", "extra": { "premium": true, "game_server": "Europe" } }, "extra": { "from": "mobile_app", "some_key": "some_value" }, "order": { "transaction": { "id": "1122334455", "start_t": 1428430631504, "finish_t": 1428430631907 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "tag": "Europe" }, { "tx": { "id": "6170372abf028f6e56db0116", "start_t": 1428530644807, "finish_t": 1428530647904 }, "status": { "cls": "success" }, "product": "world_of_warcraft", "payment": { "amount": 10000, "currency": 643, "exponent": 2 }, "src": { "cls": "mc", "phone_number": "79163332211", "operator": "mts_ru" }, "dst": { "id": "Y6UBATOP9000", "extra": { "premium": true, "game_server": "Europe" } }, "extra": { "from": "mobile_app", "some_key": "some_value" }, "order": { "transaction": { "id": "1122334466", "start_t": 1428430644908, "finish_t": 1428430651041 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "tag": "Europe" } ] } }
{ "success": false, "result": { "code": 401, "description": "invalid signature" } }
getPaymentById
Запрос для получения подробной информации о совершенной транзакциии по id.
В случае, если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
success == true
result.payments.tx.idTransactionrequired
Идентификатор транзакции процессингаresult.payments.tx.start_tTransactionrequired
Время создания транзакции в процессингеresult.payments.tx.finish_tTransactionoptional
Время окончания транзакции в процессингеresult.payments.status.clsStatusrequired
Статус транзакции в процессингеresult.payments.productStringrequired
Наименование продукта (проекта)result.payments.payment.amountPaymentrequired
Сумма в минорных единицах валютыresult.payments.payment.currencyPaymentrequired
Валюта (ISO код)result.payments.payment.exponentPaymentrequired
Количество знаков после запятойresult.payments.src.clsPayerrequired
Категория источника средств оплатыresult.payments.src.phone_numberPayerrequired
Номер телефонаresult.payments.src.operatorPayeroptional
Наименование оператораresult.payments.dst.idAccountrequired
Идентификатор пользователя в системе мерчантаresult.payments.dst.extraAccountoptional
Дополнительные поля для мерчантаresult.payments.extraJSONoptional
json объект с дополнительной ифнормациейresult.payments.order.clsOrderrequired
Назначение платежаresult.payments.order.transaction.idOrderrequired
Идентификатор транзакции, согласованный с мерчантомresult.payments.order.transaction.start_tOrderrequired
Время начала транзакцииresult.payments.order.extraOrderoptional
Дополнительная информация о платежеresult.payments.tagStringoptional
строковая метка, по которой возвращается список транзакций
{ "client": { "id": "test_client", "showcase": "showcases" }, "tx_id": "55241f34a7c82fc5f202ca21" }
{ "success": true, "result": { "payment": { "tx": { "id": "55241f34a7c82fc5f202ca21", "start_t": 1428430644807, "finish_t": 1428430647904 }, "status": { "cls": "success" }, "product": "world_of_warcraft", "payment": { "amount": 10000, "currency": 643, "exponent": 2 }, "src": { "cls": "mc", "phone_number": "79163332211", "operator": "mts_ru" }, "dst": { "id": "Y6UBATOP9000", "extra": { "premium": true, "game_server": "Europe" } }, "extra": { "from": "mobile_app", "some_key": "some_value" }, "order": { "transaction": { "id": "1122334455", "start_t": 1428430631504, "finish_t": 1428430631804 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "tag": "Europe" } } }
{ "success": false, "result": { "code": 401, "description": "invalid signature" } }
getPaymentStatus
Запрос на получение статуса платежа.
В случае, если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
{ "client": { "id": "test_client", "showcase": "showcases" }, "tx_id": "55241f34a7c82fc5f202ca21" }
{ "success": true, "result": { "tx": { "id": "55d8fb900cf23b38021b7c65", "start_t": 1440283536655, "finish_t": 1440283542127 }, "status": { "cls": "success" } } }
{ "success": false, "result": { "code": 401, "description": "invalid signature" } }
rollbackPayment
Запрос на возврат денежных средств после успешного проведения платежа.
В случае, если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
clientClientrequired
Идентификатор пользователя APIproductStringrequired
Наименование продукта (проекта)paymentPaymentrequired
Информация о сумме платежа и валютеdstAccountrequired
Информация об аккаунте в проектеorderOrderrequired
Информация о назначении платежаtxTransactionrequired
Транзакция в системе ТекоcodeIntrequired
Код причины возвратаdescriptionStringrequired
Описание причины возвратаpartner_txTransactionrequired
Транзакция в системе инициатораsecurity_extraJSONoptional
Предназначено для антифрод системы (необходимость передачи параметра определяется индивидуально при согласовании подключения)extraJSONoptional
json объект с дополнительной информацией
success == true
и по транзакции ранее уже был совершен возврат:success == true
и по транзакции ранее возвратов не проводилось:result.rollbackTypeStringrequired
Тип операции возврата (принимает значение "cancel", если день запроса операции возврата совпадает с днем окончания транзакции, иначе - "refund")result.tx.idTransactionrequired
Идентификатор транзакции процессингаresult.tx.start_tTransactionrequired
Время создания транзакции в процессингеresult.tx.finish_tTransactionoptional
Время окончания транзакции в процессинге
{ "client": { "id": "company_name", "showcase": "mobile_app" }, "product": "world_of_warcraft", "payment": { "amount": 10000, "currency": 643, "exponent": 2 }, "dst": { "id": "Y6UBATOP9000", "extra": { "premium": true, "game_server": "Europe" } }, "order": { "transaction": { "id": "1122334455", "start_t": 1428430631504, "finish_t": 1428430631905 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "tx": { "id": "55241f34a7c82fc5f202ca21", "start_t": 1428430644807 }, "code": 250, "description": "Неверный формат счета/телефона", "partner_tx": { "id": "13584192567", "start_t": 1428430644997 }, "extra": { "from": "mobile_app", "some_key": "some_value" } }
{ "success": true, "result": { "tx": { "id": "5152ba7fe4b08d2e1a903251", "start_t": 1428430644807, "finish_t": 1428430655917 } } }
{ "success": true, "result": { "rollbackType": "refund", "tx": { "id": "5152ba7fe4b08d2e1a903251", "start_t": 1428430644807, "finish_t": 1428430655917 } } }
{ "success": false, "result": { "code": 401, "description": "invalid signature" } }
Оповещение об изменении статуса платежа
Отправляется партнеру со стороны шлюза Теко, если в запросе initPayment заполнен параметр callback.
В случае, если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
{ "client": { "id": "company_name", "showcase": "mobile_app" }, "tx": { "id": "55241f34a7c82fc5f202ca21", "start_t": 1428430644807, "finish_t": 1428430655917 }, "partner_tx": { "id": "111122223333444", "start_t": 1428430642331 }, "status": { "cls": "success" } }
{ "success": false, "result": { "code": 401, "description": "invalid signature" } }
Протокол мерчанта
Предназначен для уточнения возможности проведения платежа на стороне Мерчанта (isPaymentPossible
) и для дальнейшего его проведения (resumePayment
) или отмены (cancelPayment
).
Обзор протокола
- Реализуется мерчантом при подключении к процессинговому центру ТЕКО
- Протокол использует REST архитектуру.
- В нем присутствуют 4 метода [
isPaymentPossible
,resumePayment
,cancelPayment
,rollbackPayment
], после реализации они должны, получив сообщение, отправлять соответствующий ответ - Запросы и ответы для передачи прикладной информации используют JSON
- Во время настройки и отладки протокола используется тестовая среда - playground
- Запрос должен содержать тело с JSON-запросом
- Не смотря на JSON, протокол является строго типизированным
- Все ответы приходят в обертке
{ success: true/false, result: {...} }
- Каждый запрос должен содержать заголовок (HTTP header) "Content-Type" со значением "application/json"
Взаимодействие начинается с запроса isPaymentPossible
со стороны шлюза Теко. После получения успешного ответа (success == true
) на запрос проверки платежа начинается процесс списания денежных средств с клиента. Если списание прошло успешно, то шлюз Теко отправляет Мерчанту запрос на исполнение платежа - resumePayment
, иначе будет отправлен запрос на отмену – cancelPayment
.
Если ответ на resumePayment
или cancelPayment
является НЕуспешным (success == false
), то шлюз Теко повторит запрос еще 10 раз с паузой в 30сек.
isPaymentPossible
Проверка возможности проведения платежа.
После получения данного запроса Вы должны проверить в своей системе возможность проведения платежа(наличие товара, средств и т.п.) и сформировать ответ в соответствии требованиями протокола.
В случае, если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
Запрос почти совпадает с методом initPayment из протокола Инициатора, за исключением того что в данном случае вы принимаете запрос, а не отправляете его, как было в протоколе Инициатора
clientClientrequired
Идентификатор пользователя APIproductStringrequired
Наименование продукта (проекта)paymentPaymentrequired
Информация о сумме платежа и валютеsrc_paymentPaymentoptional
Сумма и валюта, принятые от пользователяrateFloatoptional
Курс покупки.
Приsrc_payment == "100 RUB"
иpayment == "1 EUR"
,rate == 100
orderOrderrequired
Информация о назначении платежаtxTransactionrequired
Идентификатор транзакции в системе Текоsrc_clsStringrequired
Категория плательщикаsrcPayeroptional
Информация об аккаунте плательщика в платежной системе. Передается, если известен на этом этапеdstAccountrequired if (
order.cls == "item_list" || order.cls == "transfer"
)Информация об аккаунте в проектеsecurity_extraJSONoptional
Предназначено для антифрод системы (необходимость передачи параметра определяется индивидуально при согласовании подключения)
success == true
result.txTransactionrequired
Идентификатор транзакции процессингаresult.src_paymentPaymentoptional
Сумма и валюта, которые необходимо принять от пользователяresult.rateFloatoptional
Курс покупки.
Приsrc_payment == "100 RUB"
иpayment == "1 EUR"
,rate == 100
result.extraJSONoptional
Дополнительные параметры, которые нужно будет прокинуть в resumePayment
{ "client": { "id": "test_client", "showcase": "showcases" }, "product": "test_client_product", "payment": { "amount": 100, "currency": 643, "exponent": 2 }, "src_payment": { "amount": 110, "currency": 643, "exponent": 2 }, "rate": 110, "order": { "transaction": { "id": "1122334455", "start_t": 1508336966892, "finish_t": 1508336969354 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "tx": { "id": "59e765510cf26db591dbfb43", "start_t": 1508336977892 }, "src_cls": "tele2_ru", "src": { "phone_number": "79529612574", "operator": "tele2_ru", "cls": "mc" }, "dst": { "id": "login", "extra": { "premium": true, "game_server": "Europe" } } }
{ "success": true, "result": { "tx": { "id": "11223344556677", "start_t": 1537134068907 }, "src_payment": { "amount": 110, "currency": 643, "exponent": 2 }, "rate": 110, "extra": { "key": "important info" } } }
{ "success": false, "result": { "code": 320, "description": "Insufficient funds" } }
resumePayment
Используется только после isPaymentPossible для продолжения платежа. Отправляется полноценный запрос со всей информацией о транзакции. Т.е. поля, которые уже были отправлены в isPaymentPossible дублируются (т.е. их содержание идентично тому, что было в isPaymentPossible).
После получения данного запроса Вы должны выполнить платеж (отдать товар, средства) и сформировать ответ в соответствии требованиями протокола.
В случае если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
clientClientrequired
Идентификатор пользователя APIproductStringrequired
Наименование продукта (проекта)paymentPaymentrequired
Информация о сумме платежа и валютеsrc_paymentPaymentrequired
Сумма и валюта, принятые от пользователяrateFloatoptional
Курс покупки.
Приsrc_payment == "100 RUB"
иpayment == "1 EUR"
,rate == 100
srcPayerrequired
Информация об аккаунте плательщика в платежной системе. Передается, если известен на этом этапеdstAccountrequired if (
order.cls == "item_list" || order.cls == "transfer"
)Информация об аккаунте в проектеorderOrderrequired
Информация о назначении платежаtxTransactionrequired
Идентификатор транзакции в системе Текоpartner_txTransactionrequired
Идентификатор транзакции в системе мерчанта (из ответа наisPaymentPossible
)security_extraJSONoptional
Предназначено для антифрод системы (необходимость передачи параметра определяется индивидуально при согласовании подключения)extraJSONoptional
Если было в ответе наisPaymentPossible
{ "client": { "id": "test_client", "showcase": "showcases" }, "product": "test_client_product", "payment": { "amount": 100, "currency": 643, "exponent": 2 }, "src_payment": { "amount": 110, "currency": 643, "exponent": 2 }, "rate": 110, "src": { "phone_number": "79771234567", "operator": "tele2_ru", "cls": "mc" }, "dst": { "id": "login", "extra": { "premium": true, "game_server": "Europe" } }, "order": { "transaction": { "id": "qwerty", "start_t": 1508336966892, "finish_t": 1508336969354 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "tx": { "id": "59e765510cf26db591dbfb43", "start_t": 1508336977892 }, "partner_tx": { "id": "11223344556677", "start_t": 1537134068907 }, "extra": { "key": "important info" } }
{ "success": true, "result": { "tx": { "id": "11223344556677", "start_t": 1537134068907, "finish_t": 1537134069341 } } }
{ "success": false, "result": { "code": 305, "description": "Parsing error" } }
cancelPayment
Отмена платежа, для которого ранее производилась проверка с помощью метода isPaymentPossible.
После получения данного запроса Вы должны отменить платеж (не отдавать товар, средства) и сформировать ответ в соответствии требованиями протокола.
В случае если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
clientClientrequired
Идентификатор пользователя APIproductStringrequired
Наименование продукта (проекта)paymentPaymentrequired
Информация о сумме платежа и валютеdstAccountrequired if (
order.cls == "item_list" || order.cls == "transfer"
)Информация об аккаунте в проектеorderOrderrequired
Информация о назначении платежаtxTransactionrequired
Идентификатор транзакции в системе ТекоcodeIntrequired
Код ошибкиdescriptionStringrequired
Описание ошибкиpartner_txTransactionrequired
Идентификатор транзакции в системе мерчанта (из ответа наisPaymentPossible
)security_extraJSONoptional
Предназначено для антифрод системы (необходимость передачи параметра определяется индивидуально при согласовании подключения)extraJSONoptional
Если было в ответе наisPaymentPossible
{ "client": { "id": "test_client", "showcase": "showcases" }, "product": "test_client_product", "payment": { "amount": 100, "currency": 643, "exponent": 2 }, "dst": { "id": "login", "extra": { "premium": true, "game_server": "Europe" } }, "order": { "transaction": { "id": "qwerty", "start_t": 1508336966892, "finish_t": 1508336969354 }, "cls": "transaction", "extra": { "from": "mobile_app", "some_key": "some_value" } }, "tx": { "id": "59e765510cf26db591dbfb43", "start_t": 1508336977892 }, "code": 42, "description": "Unknown error", "partner_tx": { "id": "11223344556677", "start_t": 1537134068907 }, "extra": { "key": "important info" } }
{ "success": true, "result": { "tx": { "id": "11223344556677", "start_t": 1537134068907, "finish_t": 1537134069341 } } }
{ "success": false, "result": { "code": 230, "description": "Payment was cancelled earlier" } }
rollbackPayment
Возврат уже выполненного платежа.
После получения данного запроса Вы должны возвратить платеж (вернуть товар, средства) и сформировать ответ в соответствии требованиями протокола.
В случае если тип у поля не является примитивным, его структуру можно посмотреть по названию в разделе Классы
clientClientrequired
Идентификатор пользователя APIpaymentPaymentoptional
Информация о сумме платежа и валютеtxTransactionrequired
Идентификатор транзакции в системе Текоpartner_txTransactionrequired
Идентификатор транзакции в системе мерчанта (из ответа наisPaymentPossible
)commentStringoptional
Комментарий к возвратуsecurity_extraJSONoptional
Предназначено для антифрод системы (необходимость передачи параметра определяется индивидуально при согласовании подключения)extraJSONoptional
Если было в ответе наisPaymentPossible
{ "client": { "id": "test_client", "showcase": "showcases" }, "payment": { "amount": 100, "currency": 643, "exponent": 2 }, "tx": { "id": "59e765510cf26db591dbfb43", "start_t": 1508336977892 }, "partner_tx": { "id": "11223344556677", "start_t": 1537134068907 }, "comment": "rollback reason", "extra": { "key": "important info" } }
{ "success": true, "result": { "tx": { "id": "11223344556677", "start_t": 1537134068907, "finish_t": 1537134069341 } } }
{ "success": false, "result": { "code": 316, "description": "Rollback failed" } }
Описание формата реестра
Общее
- Базовая форма реестра представляется собой файл CSV, разделитель
;
- Период отправки реестра оговаривается с партнером при запуске
- Набор полей в реестре может изменяться в зависимости от требований партнера
- Суммы в реестре передаются в формате
100.12
(100 рублей 12 копеек) - Время передается в формате {
dd/MM/yy HH:mm:ss
}
Transaction id
Идентификатор операции на стороне процессингаPartner transaction id
Идентификатор операции со стороны партнераGood ID
Идентификатор товараStart time
Время старта операцииFinish time
Время завершения операции (дата учета операции)Payment method
Метод оплатыPayer id
Идентификатор плательщика в методе оплатыCurrency
ВалютаAmount
Базовая сумма платежа (база расчетов)Commission
Комиссия с физического лицаPayout
Сумма выплаты
Рекуррентные списания
Обзор протокола
Ключевым понятием в работе протокола рекуррентных списаний является понятие политики списания денежных средств. Под политикой понимается набор атрибутов:
- Стартовое списание
- Периодичность списания (в миллисекундах)
- Количество периодов (от 1 до бесконечности)
- “Пробный” (trial) период – количество периодов, за которые не будут списываться денежные средства
- Сумма списания или набор сумм списания:
- В случае, если сумма одна, то списывается каждый период одна и та же сумма
- В случае если сумм несколько, то система списывает денежные средства циклично, в порядке следования сумм. Пример: если периодов – 10, а сумм указано 3 (1 руб, 2 руб и 3 руб), то за полный цикл пройдет 4 платежа на 1 рубль, 3 платежа на 2 рубля и 3 платежа на 3 рубля.
Статусы подписки:
“Жизненный цикл” подписки состоит из нескольких статусов:
created
- подписка создана, находится в статусе ожидания инициации стартового списания.trial
- находится в пробном статусе. Следущее списание не будет произведено.active
- подписка активна и оплачена. Списания идут в соответствии с назначенной логикой.freezed
- последняя попытка списаний не прошла по какой-то причине: недостаточно средств, не получено подтверждение.to_be_canceled
- подписка, услуги которой продолжают действовать, но по истечении периода, подписка примет статус canceled.canceled
– подписка закончена или отменена
Безопасность
- Общение происходит только по HTTPS
- Каждый запрос к API должен содержать HTTP заголовки
login
иsignature
(login и secret для генерации подписи выдаются в процессе интеграции) - Для вычисления подписи
signature
используется алгоритм HMAC-SHA1 - В случае POST запросов подписывается все тело запроса, в случае GET-запросов - строка с параметрами.
Методы API
Все ответы приходят в обертке { success: true/false, result: {...} }
subscribe
Запрос на подписку
numberStringrequired
Номер телефона клиентаpolicyStringrequired
Наименование зарегистрированной политики списаний средствtagStringoptional
Идентификатор для поиска. Может быть использован в качестве привязки подписки к игровому аккаунту, аккаунту в системе лояльности и т.п.prepaidBooleanrequired
Была ли подписка активирована с помощью предоплаты. В случае значения true, первоначальный платеж взиматься не будет и подписка будет автоматически переведена в статус activeextraJSONoptional
subscriptionState
Получение информации о статусе подписки
idStringrequired
Идентификатор подпискиtNumberrequired
Время создания подпискиstatusStringrequired
Текущий статус подпискиnext_statusStringrequired
Планируемый следующий статус подпискиend_of_current_statusNumberrequired
Время окончания текущего статусаlast_charge_tNumberrequired
Планируемое время следующего списанияnext_charge_tNumberrequired
Планируемое время следующего списанияpolicyStringrequired
Идентификатор политики
Paycafe
Обзор протокола
- Боевое взаимодействие происходит только по протоколу HTTPS.
- Боевые параметры и ключи могут быть получены у менеджера по интеграции.
- Платежная форма может быть интегрирована несколькими способами: перенаправление на форму, встраивание в код веб-страницы, использование JavaScript виджета на веб-странице.
- Метод для перенаправления на платежную форму, сгенерированную с переданными параметрами:
GET https://paycafe.teko.io:3007/api/init-session - JavaScript Paycafe виджет доступен по следующему адресу:
https://paycafe.teko.io/paycafeWidget.js
initSession
Данный метод может быть использован в качестве src
атрибута в <iframe>
элементе веб-страницы или в качестве initSessionUrl
параметра в paycafeWidget.js. В случае успеха происходит перенаправление на платежную форму, иначе – на страницу с ошибкой. Следующие параметры запроса должны быть переданы в URL-encoded query string
:
initiatorClientrequired
Информация о магазине, использующем формуpaymentPaymentrequired
Идентификатор для поиска. Может быть использован в качестве привязки подписки к игровому аккаунту, аккаунту в системе лояльности и т.п.localeEnumrequired
Язык формы. Возможные значения:ru
– русскийen
– английскийtj
- таджикскийproductProductrequired
Информация о выбранном товареsignatureStringrequired
Base64-encoded HMAC-SHA1 подпись запросаorderOrderrequired
Информация о назначении платежаdstAccountoptional
Информация об аккаунте в проектеpaymentMethodsArray[Enum]optional
Список доступных методов оплаты.
Значения:"bank- card"
,"mobile-pay"
, и тд.themeThemeoptional
Параметры цветовой схемыselectAmountAmountOptionsoptional
Настройки выбора суммы платежа
Формирование подписи
- Следующие параметры должны быть использованы при формировании подписи:
locale
,initiator
,payment
,order
,product
,dst
. - Сложные параметры с вложенными объектами должны быть представлены в виде JSON. Пример:
initiator={"id":"test","showcase":"main_showcase"}
- Отсортируйте все параметры в алфавитном порядке и сформируйте строку следующего формата: "KEY1|VALUE1|KEY2|VALUE2"
- Подпись запроса формируется с помощью алгоритма HMAC-SHA1 от строки из пункта выше и секретного ключа. Строка с подписью должна быть Base64-encoded.
Протокол кассового ПО
isPaymentPossible
Проверка возможности проведения платежа.
Запрос совпадает с initPayment протокола инициатора, за исключением:
clientClientrequired
Идентификатор пользователя APIproductString
Наименование продукта (проекта)paymentPayment
Информация о сумме платежа и валютеsrc_paymentPayment
Сумма и валюта принятые от пользователяrateFloat
Курс покупки. При src_payment = 100 RUB и payment = 1 EUR, rate = 100srcPayerrequired
Информация об аккаунте плательщика в платежной системеdstAccountrequired if (
order.cls == "item_list" || order.cls == "transfer"
)Информация об аккаунте в проектеorderOrderrequired
Информация о назначении платежаtxTransactionrequired
Созданная транзакция, для которой производится проверкаsecurity_extraJSONoptional
Предназначено для антифрод системы
success == true
{ "success": true, "result": { "tx": { "id": "1661803727", "start_t": 1437134068907 } } }
resumePayment
Используется только после isPaymentPossible для продолжения платежа. Отправляется полноценный запрос со всей информацией о транзакции. Те поля, которые уже были отправлены в isPaymentPossible дублируются (т.е. их содержание идентично тому, что было в isPaymentPossible)
clientClient
Идентификатор пользователя APIproductString
Наименование продукта (проекта)paymentPayment
Сумма и валюта платежаsrc_paymentPaymentrequired
Сумма и валюта принятые от пользователяdstAccountrequired if (
order.cls == "item_list" || order.cls == "transfer"
)Информация об аккаунте в проектеorderOrder
Информация о назначении платежаtxTransaction
Созданная транзакция, для которой производится проверкаpartner_txTransaction
Транзакция из ответа наisPaymentPossible
rateFloat
Курс покупки. При src_payment = 100 RUB и payment = 1 EUR, rate = 100security_extraJSON
Предназначено для антифрод системы
success == true
result.merchant_txTransaction
Транзакция у мерчанта (системы денежных переводов)result.src_paymentPayment
Cумма и валюта, которые необходимо принять от пользователяresult.rateFloat
Курс покупки payment. При src_payment = 100 RUB и payment = 1 EUR, rate = 100result.dstAccount
Может дополнится информацией по отношению к запросу
{ "success": true, "result": { "tx": { "id": "1661803727", "start_t": 1437134068907, "finish_t": 1437134086421 } } }
cancelPayment
Отмена платежа, для которого ранее производилась проверка
clientClient
Идентификатор пользователя APIproductString
Наименование продукта (проекта)paymentPayment
Сумма и валюта платежаdstAccountrequired if (
order.cls == "item_list" || order.cls == "transfer"
)Информация об аккаунте в проектеorderOrder
Информация о назначении платежаtxTransaction
Созданная транзакция, для которой производится проверкаcodeIntrequired
Код ошибкиdescriptionString
Описание ошибкиextraJSON
Если было в ответе наisPaymentPossible
partner_txTransaction
Транзакция из ответа наisPaymentPossible
security_extraJSON
Предназначено для антифрод системы
{ "success": true, "result": { "tx": { "id": "1438730878", "start_t": 1437133818318, "finish_t": 1437141086421 } } }
calcCommission
Расчет комиссии для платежа без заведения полей
success == true
{ "success": true, "result": { "tx": { "id": "1438730878", "start_t": 1437133818318, "finish_t": 1437141086421 } } }
getCatalog
{ "success": true, "result": { "tx": { "id": "1438730878", "start_t": 1437133818318, "finish_t": 1437141086421 } } }