Ошибки
API использует HTTP статусы для возврата ошибок.
Статус | Описание |
---|---|
200 | запрос выполнен успешно |
304 | документ не изменился с указанного момента |
400 | плохо сформированный запрос (например невалидный JSON) |
401 | неверные учетные данные |
404 | запрошенный ресурс не существует (для запрашивающего) |
405 | не тот HTTP метод, например GET вместо POST |
415 | не тот content-type, мы поддерживаем только application/json |
422 | запрос сформирован нормально, но не прошел валидацию, например не хватает полей или поле не в нужном формате |
5XX | проблема с mserver, повторите запрос позже |
HTTP статус дублируется в поле meta.status
ответа mserver. В определенных случаях вместе со статусом возвращается уточненный код ошибки в поле meta.error
. Например для невалидного номера телефона при создании кошелка возвращается
{
"meta" : {
"code" : 422,
"error" : "invalid_phone",
"error_message": "Неверный телефон"
}
}
Получение ошибок API
Поля:
code
- идентификатор ошибкиtitle
- словарь с локализированными ошибками
Поле title
может быть с динамическими данными, например {{ object.meta.code }}
при получении реальной ошибки отдаст http код состояния
В ответе в meta присутствует параметр request_time со значением UNIX timestamp. Если делать запрос с параметром If-Modified-Since в котором будет указан timestamp предыдущего запроса, то ответ может быть с HTTP кодом 304
$ curl https://sandbox.wallet.best/v1/errors
{
"meta": {
"request_time": 1432652055,
"code": 200
},
"data": [
{
"code": "wallet_not_found",
"title": {
"ru_RU": "кошелек не существует"
}
},
{
"code": "invalid_phone",
"title": {
"ru_RU": "требуется номер телефона в международном формате",
"en_US": "invalid phone {{ object.meta.code }}"
}
}
]
}
Справочники возможных значений error для каждого вызова API описаны ниже.
Meta
Любой успешный запрос с кошельком будет возвращать в поле meta
следующие поля:
code
- код состояния HTTPurgent_data
- массив с оперативной информацией:amount
- текущее кол-во денег в кошелькеunseen_payments
- кол-во непросмотренных транзакций в логе
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 2370,
"unseen_payments": 15
}
}
}
Аутентификация
Используется OAuth аутентификация. В качестве логина используется номер телефона Кошелька в международном формате. В случае, если кошелек не прошел аутентификацию, сервер вернет HTTP статус 401.
Коды ошибок
wallet_not_active
- кошелек не активированwallet_disabled
- заблокирован администрацией
Настройки приложения
$ curl -u +79261111111:p@ssw0rD https://sandbox.wallet.best/v1/options
{
"meta": {
"code": 200
},
"data": {
"support_phone": "+380991032585",
"mobile_operators_category_ids": {
"ru": 3
}
}
}
Кошелек
Кошелек - учетная запись конечного пользователя в mserver. Позволяет получать информацию о доступном остатке на счете и персональных данных конечного пользователя.
Поля:
phone
- номер телефона в международном формате, уникальный идентификатор Кошелька (в пределах Проекта), также является логиномamount
- остаток на счете кошелька, в рубляхname
- имя конечного пользователя, возвращается в случае, если были заданы имя и/или фамилияverified
- true | false статус идентификации пользователяlevel
- anonymous | identified | personified уровень идентификации пользователяperson_status
- no_data | data_entered | data_verified статус персональных данных пользователяemail
- электронная почта пользователяemail_send_frequency
- never | after_payment | daily | monthly периодичность отправки на почту лога транзакций
Создание кошелька
Mserver: http://nebo15.github.io/mbank.docs/mserver.html#sozdanie-koshelka
Активация кошелька
Mserver: http://nebo15.github.io/mbank.docs/mserver.html#aktivatsiya-koshelka
Запрос повторной отправки кода активации
Mserver: http://nebo15.github.io/mbank.docs/mserver.html#zapros-povtornoy-otpravki-koda-aktivatsii
Запрос кода для смены пароля
Mserver: http://nebo15.github.io/mbank.docs/mserver.html#zapros-koda-dlya-smeny-parolya
Смена пароля
Mserver: http://nebo15.github.io/mbank.docs/mserver.html#smena-parolya
Загрузка кошелька
$ curl -u+79261111111:p@ssw0rD https://sandbox.wallet.best/v1/wallet
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 1237
},
"time": 0.363231
},
"data": {
"phone": "+79261111111",
"amount": 1237,
"level": "identified",
"name": "Петян",
"verified": true,
"person_status": "data_verified",
"picture_url": "http:\/\/sandbox.wallet.best\/img\/wallets\/7a\/91c\/54291c7a56c35f205da91f9d.jpg?1424445896",
"email": "test@wallet.best",
"can_use_autopayments": false,
"intercom_user_hash": "82bdad9a133b1efda3aeba7b3a78e00afd0d8f4dc5a604b06663a2d6f07fc9b2"
}
}
Удаление кошелька
Метод не работает на prod.
$ curl -u admin_level_login:password -X DELETE https://sandbox.wallet.best/v1/wallet/%2B79261111111
{
"meta" : {
"code" : 200
}
}
Внесение персональных данных пользователя
Проверяются на дубликат по passport_series_number
.
Параметры
family_name
- обязательный параметр - фамилияgiven_name
- обязательный параметр - имяpassport_series_number
- обязательный параметр - серия и номер паспорта, 10 цифрpassport_issued_at
- дата в формате гггг-мм-ддpatronymic_name
- отчествоbirth_date
- дата рождения в формате гггг-мм-ддitn
- ИНН, 12 цифрssn
- СНИЛС, 11 цифр
$ curl -u+79261111111:password -H 'Content-type:application/json'
-d '{"family_name": "Арсеньев", "given_name": "Алексей", "patronymic_name": "Александрович",
"passport_series_number": "2202655885", "passport_issued_at" : "2012-02-27",
"itn": "330500938709", "ssn": "11223344595"}'
https://sandbox.wallet.best/v1/wallet/person
{
"meta" : {
"code" : 200
},
"data" : {
"family_name" : "Арсеньев",
"given_name" : "Алексей",
"patronymic_name" : "Александрович",
"passport_series_number" : "2202655885",
"passport_issued_at" : "2012-02-27",
"itn" : "330500938709",
"ssn" : "11223344595",
"status" : "data_entered",
"changed_at" : "2014-11-14T13:15:42.213Z"
}
}
Коды ошибок
invalid_family_name
- фамилия длиннее 512 символовinvalid_given_name
- имя длиннее 512 символовinvalid_patronymic_name
- отчество длиннее 512 символовinvalid_passport_series_number
- серия/номер паспорта не соответствует форматуinvalid_itn
- ИНН не соответствует форматуinvalid_ssn
- СНИЛС не соответствует форматуperson_already_verified
- перcональные данные утверждены, изменение невозможно, обратитесь в поддержкуduplicate_person
- указанные персональные данные уже были использованы для идентификации другого кошелька
Загрузка персональных данных пользователя
$ curl -u+79261111111:p@ssw0rD https://sandbox.wallet.best/v1/wallet/person
{
"meta" : {
"code" : 200
},
"data" : {
"family_name" : "Арсеньев",
"given_name" : "Алексей",
"patronymic_name" : "Александрович",
"passport_series_number" : "2202655885",
"passport_issued_at" : "2012-02-27",
"itn" : "330500938709",
"ssn" : "11223344595",
"status" : "data_verified",
"verified_at" : "2014-05-29T17:06:20.066Z"
}
}
Загрузка картинки
Форматы: JPEG, PNG. На сервере делается auto-rotate. Размер файла до 10 мегабайт.
$ curl -u +79261111111:p@ssw0rD -X POST -F "file=@/path/to/image.jpg" https://sandbox.wallet.best/v1/wallet/picture
{
"meta" : {
"code" : 200
},
}
Удаление картинки
$ curl -u +79261111111:p@ssw0rD -X DELETE https://sandbox.wallet.best/v1/wallet/picture
{
"meta" : {
"code" : 200
},
}
Поиск кошельков
Параметры
contacts
- массив объектов с контактами{"name":" Daniel Higgins","phone":" +5554787672"}
или массив с номерами телефонов в формате{"phone": "+79990000000"}
Если искомый кошелек не активирован, то он не найдется.
$ curl -u +12345675578:password -H 'Content-type:application/json' -d '{"contacts": [ {"phone": "+79990000000"}, {"phone": "+79260000001"}, {"phone": "+79260000002"} ]}' https://sandbox.wallet.best/v1/wallet/find
{
"meta": {
"code": 200
},
"data": [
"+79990000000",
"+79260000002"
]
}
Получение списка точек пополненя
$ curl -u +12345675578:password https://sandbox.wallet.best/v1/wallet/replenishment_points
{
"meta": {
"code": 200
},
"data": [
{
"id": "54635060279871e2098b4567",
"type": "Банкомат: Инвестбанк ОАО АКБ",
"worktime": "пн-пт: 09:00-20:00, сб: 10:00-16:00",
"address": "Москва ул. Ворошилова 169-171",
"latitude": 55.616371,
"longitude": 37.211893
},
{
"id": "54635060279871e2098b4568",
"type": "Касса: СЛАВИНВЕСТБАНК ООО",
"worktime": "круглосуточно",
"address": "Москва ул. маршала Жукова 1",
"latitude": 55.676006,
"longitude": 37.252398
}
]
}
Настройка периодичности отправки на почту лога транзакций
Параметры
email
- электронная почта получателя выпискиemail_send_frequency
- never | after_payment | daily | monthly периодичность отправки на почту лога транзакций
$ curl -u +12345675578:password -d '{"email" : "test@wallet.best", "email_send_frequency" : "daily"}' https://sandbox.wallet.best/v1/wallet/settings
{
{
"meta": {
"code": 200
}
}
}
Webhook изменения статуса кошелька (verified/personified)
Параметры
webhook_client_id
- id клиента (обязательно)webhook_client_token
- токен клиента (обязательно)phone
- Номер телефона кошелька (обязательно)verified
- truepersonified
- true
$ curl -H 'Content-type:application/json' -d '{"phone": "+12345675578", "verified": true}' https://sandbox.wallet.best/v1/wallet/status?webhook_client_id=mserver&webhook_client_token=token
{
{
"meta": {
"code": 200
}
}
}
Сервисы
Сервис - это назначение платежа. Сервис содержит описание параметров, которые должны быть переданы в платежном запросе конечным пользователем.
Параметры сервисов мапятся в админке, потому могут отличаться от MServer. Когда пользователь заполняется данные для сервиса, они попадают в базу знаний, на основе которой можно выделить шаблоны для параметров.
Поля:
id
- идентификатор сервиса, передается в платежном запросе в полеservice
для указания назначения платежаname
- человекочитаемое имя сервисаkeywords
- подсказки для поиска (ключевые слова через запятую)minsum
,maxsum
- минимальная и максимальная сумма платежа, включительноstatus
- online | offline статус доступности сервиса для совершения платежейverification_required
- требуется ли идентификация плательщика для проведения платежа,parameters
- массив параметров для платежа, содержит в себе объекты со свойствами, которые описаны ниже.category
- объект со следующими свойствами (DEPRECATED):groups
- массив групп (категорий) к которым относится сервисrate
- комиссия в формате массива со значениями:fix
- фиксированнаяpercent
- процент от суммыmin
- минимальный размер комиссии, опциональноmax
- максимальный размер комиссии, опционально
Параметры:
id
- идентификатор параметра. Может дублироваться с другим параметром ТОЛЬКО в другом сервисеis_disabled
- состояние параметра. Неактивенis_hidden
- состояние параметра. Невидимыйis_required
- состояние параметра. Обязательныйmin_length
,max_length
- минимальная и максимальная длина значения параметра платежаpatterns
- массив объектов со следующими свойствами:pattern
- регулярное выражение, которому должно удовлетворять значение параметра платежаdescription
- человекочитаемый текст ошибки, если значение не попадает под выражениеpattern
pattern
- регулярное выражение, которому должно удовлетворять значение параметра платежаpattern_description
- человекочитаемый текст ошибки, если значение не попадает под выражениеpattern
type
- типы мапятся, могут добавлятся или изменятся. Существуют устоявшиеся:- string - строка
- phone - телефон
- email - почта
- number - число
- enum - выбор
title
- человекочитаемое имя параметраdefault_value
- человекочитаемое имя параметраsuggested_values
- человекочитаемое имя параметраitems
- возможные значения параметра платежа с типом enumrange_start
- Необязательно поле. Начало диапазона чиселrange_end
- Необязательно поле. Конец диапазона чисел
Поля range_start
и range_end
нужны для создания диапазона чисел.
Например нужно сделать выбор по годам начиная от 1901 и заканчивая 2000
Загрузка списка сервисов
Список отдается с постраничной навигацией. Если существует следующая страница с сервисами - в meta параметр has_next_page будет true, в ином случае - false.
В ответе в meta присутствует параметр request_time со значением UNIX timestamp. Если делать запрос с параметром If-Modified-Since в котором будет указан timestamp предыдущего запроса, то ответ может быть с HTTP кодом 304.
В meta возвращаются suggestions в количестве до 5 с учетом geo и project_id. Это сервисы отсортированные по количеству платежей за месяц в обратном порядке.
Параметры:
size
- кол-во элементов в списке (по-умолчанию 20)page
- страница (по-умолчанию 1)group_id
- id группы. Не обязательно.name
- подстрока, входящая (в любом месте) в название сервиса или в keywords. Не обязательно.geo_id
- Не обязательно.
$ curl -u+79261111111:p@ssw0rD https://sandbox.wallet.best/v1/services
{
"meta": {
"request_time": 1407428185,
"code": 200,
"has_next_page": true,
"urgent_data": {
"amount": 2370,
"unseen_payments": 1
},
"suggestions": [
{
"id": 1000,
"name": "Теле2",
"keywords": "",
"status": "online",
"icon_url": "http:\/\/api.mbank.dev\/img\/services\/53359fb2255c741a749f0c44.png?1432896868",
"limit": "Лимитов нет",
"rate": {
"fix": 0,
"percent": 0
},
"verification_required": false,
"group": {
"id": "53359fb2255c741a749f0c42",
"name": "Мобильная связь"
}
},
{
"id": 1161,
"name": "Steam",
"keywords": "",
"status": "online",
"icon_url": "http:\/\/api.mbank.dev\/img\/services\/53a6f8f456c35f166462c6c8.png?1432896868",
"limit": "",
"rate": {
"fix": 0,
"percent": 0
},
"verification_required": false,
"group": {
"id": "53359fb2255c741a749f0c47",
"name": "Игры и социальные сети"
}
},
{
"id": 834,
"name": "МегаФон",
"keywords": "",
"status": "online",
"icon_url": "http:\/\/api.mbank.dev\/img\/services\/542949a556c35f205de5a52d.png?1432896868",
"limit": "",
"rate": {
"fix": 0,
"percent": 0
},
"verification_required": false,
"group": {
"id": "53359fb2255c741a749f0c42",
"name": "Мобильная связь"
}
}
]
},
"data": [
{
"id": 1,
"name": "Мегафон",
"keywords": "",
"status": "online",
"icon_url": "https:\/\/api.mbank.ru\/img\/providers\/dev_834.png",
"limit": "",
"rate": {
"fix": 0,
"percent": 0
},
"verification_required": true,
"groups": [
{
"id": "53359fb2255c741a749f0c4b",
"name": "Интернет провайдеры"
}
],
"geo": [
[
"Москва",
"Центральный округ",
"Российская Федерация"
],
[
"Питер",
"Вохомский район",
"Костромская область",
"Центральный округ",
"Российская Федерация"
]
]
},
{
"id": 1000,
"name": "Tele2",
"keywords": "",
"status": "offline",
"icon_url": "https:\/\/api.mbank.ru\/img\/providers\/dev_1000.png",
"limit": "",
"rate": {
"fix": 0,
"percent": 0
},
"verification_required": false,
"groups": [
{
"id": "53359fb2255c741a749f0c59",
"name": "Мобильная связь зарубежья"
}
]
}
]
}
Загрузка списка групп
Поле amount
содержит количество включенных сервисов в группе. В ответе в meta присутствует параметр request_time со значением UNIX timestamp.
Если делать запрос с параметром If-Modified-Since в котором будет указан timestamp предыдущего запроса, то ответ может быть с HTTP кодом 304
$ curl -u +79261111111:p@ssw0rD https://sandbox.wallet.best/v1/groups
{
"meta": {
"request_time": 1423147436,
"code": 200,
"urgent_data": {
"amount": 2370,
"unseen_payments": 1
}
},
"data": [
{
"id": 3,
"name": "Мобильная связь",
"keywords": "",
"group": "cellular",
"type": "cellular",
"amount": 8
},
{
"id": 895,
"name": "Мобильная связь зарубежья",
"keywords": "",
"group": "",
"type": "",
"amount": 20
},
{
"id": 4,
"name": "Игры и социальные сети",
"keywords": "",
"group": "",
"type": "",
"amount": 4
}
]
}
Загрузка списка сервисов по группам
Это устаревший метод, который будет удален в будущих релизах
В ответе в meta присутствует параметр request_time со значением UNIX timestamp. Если делать запрос с параметром If-Modified-Since в котором будет указан timestamp предыдущего запроса, то ответ может быть с HTTP кодом 304.
В метаданных есть поле suggestion_rules
c массивом код оператора в международном формате : ID сервиса
$ curl -u+79261111111:p@ssw0rD https://sandbox.wallet.best/v1/services/groups
{
"meta": {
"request_time": 1407182553,
"suggestion_rules": {
"+7920": 1,
"+7939": 1,
"+7900": 3,
"+7968": 3,
"+7910": 2,
"+7911": 2,
"+7901": 5,
"+7953": 5
},
"code": 200
},
"data": {
{
"id": 3,
"name": "Мобильная связь",
"group": "Cellular",
"type": "Cellular",
"services": {
{
"id": 1000,
"name": "Tele2",
"status": "online",
"icon_url": "https:\/\/api.mbank.ru\/img\/providers\/dev_1000.png",
"limit": "",
"rate": {
"fix": 0,
"percent": 0
},
"verification_required": true
},
{
"id": 770,
"name": "Билайн",
"status": "online",
"icon_url": "https:\/\/api.mbank.ru\/img\/providers\/dev_770.png",
"limit": "",
"rate": {
"fix": 0,
"percent": 0
},
"verification_required": true
}
}
},
{
"id": 12,
"name": "Игры и социальные сети",
"group": "",
"type": "",
"services": {
{
"id": 1066,
"name": "Одноклассники",
"status": "online",
"icon_url": "https:\/\/api.mbank.ru\/img\/providers\/dev_1068.png",
"limit": ""
"rate": {
"fix": 0,
"percent": 0
},
"verification_required": true
}
}
}
}
}
Информация о сервисе по id
$ curl -u+79261111111:p@ssw0rD https://sandbox.wallet.best/v1/services/42
{
"meta": {
"code": 200
},
"data": {
"id": 770,
"name": "Билайн",
"keywords": "билайн, белайн, белаин, пчелайн",
"icon_url": "https:\/\/api.mbank.ru\/img\/providers\/dev_770.png",
"limit": "",
"rate": {
"fix": 0,
"percent": 0
},
"minsum": 2,
"maxsum": 15000,
"status": "online",
"verification_required": false,
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": false,
"min_length": 10,
"max_length": 10,
"range_start": 1,
"range_end": 12,
"patterns": [
{
"pattern": "^\\d{10}$a",
"description": "№ телефона не 10 цифр"
},
{
"pattern": "^\\d{16}$a",
"description": "№ карточки не 16 цифр"
}
],
"pattern": "^\\d{10}$a",
"pattern_desc": "10 цифр",
"type": "phone",
"title": "Номер телефона",
"default_value": "[phone:+79267101280]",
"suggested_values": [
"+79267101280",
"+79267101250"
],
"items": [
{
"code": "1",
"value": "Оплата по № Догoвора"
},
{
"code": "2",
"value": "Оплата по № Карты"
},
{
"code": "3",
"value": "Оплата по № Счета"
}
],
"service_param_pattern_id": null,
"is_changed": false
}
],
"category": {
"id": "549c92fb56c35f660ecd341f",
"name": "Мобильная связь",
"group": "Cellular",
"type": "Cellular",
"amount": 3
},
"groups": [
{
"id": "53359fb2255c741a749f0c42",
"name": "Мобильная связь",
"group": "cellular",
"type": "cellular",
"keywords": "",
"amount": 0,
"services_count": 9
}
]
}
}
Поиск сервиса по MNP
Параметры (все обязательны):
provider_id
provider_region_code
$ curl -u+79261111111:p@ssw0rD https://sandbox.wallet.best/v1/services/mnp?provider_id=beline&provider_region_code=ru
{
"meta": {
"code": 200
},
"data": {
"id": 770,
"name": "Билайн",
"keywords": "",
"icon_url": "http:\/\/api.mbank.dev\/img\/services\/53359fb2255c741a749f0c45.png?1433497473",
"limit": "",
"minsum": 2,
"maxsum": 15000,
"rate": {
"fix": 0,
"percent": 0
},
"status": "online",
"verification_required": false,
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": true,
"min_length": 12,
"max_length": 12,
"range_start": 0,
"range_end": 0,
"patterns": [
{
"pattern": "",
"description": ""
},
{
"pattern": "^\\+7[0-9]{10}$",
"description": {
"ru_RU": "Номер телефона РФ начиная с +7 (в международном формате). Например, +79261112233"
}
}
],
"pattern": "^\\+7[0-9]{10}$",
"pattern_desc": "Номер телефона РФ начиная с +7 (в международном формате). Например, +79261112233",
"type": "phone",
"title": "Номер телефона, начиная с +7",
"default_value": null,
"suggested_values": [],
"items": null
}
],
"category": {
"id": "53359fb2255c741a749f0c42",
"mserver_id": "53359fb2255c741a749f0c42",
"name": "Мобильная связь",
"group": "cellular",
"keywords": "",
"icon_url_32x32": "",
"amount": 0
}
}
}
Определение ОПСОСа по номеру телефона
$ curl https://sandbox.wallet.best/v1/services/mobile/79261111111
{
"meta": {
"code": 200
},
"data": {
"id": 834,
"name": "МегаФон",
"icon_url": "https://sandbox.wallet.best/img/providers/dev_834.png",
"limit": "",
"rate": {
"fix": 0,
"percent": 0
},
"minsum": 1,
"maxsum": 15000,
"parameters": [
{
"id": "phoneNumber",
"title": "Номер телефона",
"pattern": null,
"pattern_desc": "10 цифр",
"min_length": 10,
"max_length": 10,
"type": "phone"
}
]
}
}
Заявка на добавление нового сервиса
Создает в Intercom.io завку на добавление сервиса.
Параметры:
title
- наименование сервиса
$ curl -X POST -H 'Content-type:application/json'
-u+79261111111:p@ssw0rD -d '{"title" : "%SERVICE TITLE%" }'
https://sandbox.wallet.best/v1/services/order
{
"meta": {
"code": 200
},
"data": {
"created_at": 1407185953,
"updated_at": 1407185953,
"read": true,
"created_by_user": true,
"user": {
"email": "",
"user_id": "+79261111111",
"name": null,
"is_admin": false,
"avatar": {}
},
"message_type": "conversation",
"messages": [
{
"id": 2006929,
"created_at": 1407185953,
"url": null,
"html": "<p>User: {code:javascript}{}{code}\n<br>{quote}Просит добавить сервис: 'TEST_TEST_TEST'{quote}\n<\/p>",
"subject": "",
"from": {
"email": "",
"user_id": "+79261111111",
"name": null,
"is_admin": false,
"avatar": {}
},
"attachments": []
}
],
"message_id": 2006929,
"thread_id": 2006929,
"interrupt": true
}
}
Коды ошибок
missing_title
- не передан заголовок сервисаwallet_not_found
- кошелек с переданным номером телефона не найден
География, населенные пункты
Метод определяет населенный пункт пользователя по IP и возвращает список предустановленных (major) городов или результаты поиска по названию если параметры не переданы. Город, если определили автоматически, находится в meta.geo
.
Параметры:
filter_by
- использовать фильтр, поддерживается:title
. Не обязательно.title
- подстрока, входящая (в любом месте) в название населенного пункта, работает вместе сfilter_by=title
. Не обязательно.
$ curl -u +79261111111:p@ssw0rD https://sandbox.wallet.best/v1/geo?filter_by=title\&title=%D0%BC%D0%BE%D1%81%D0%BA%D0%B2
{
"meta": {
"geo": {
"id": "54be73b2b7f47bef910042b3",
"title": "Лобня",
"inside": [
{
"id": "54be73b2b7f47bef910041e4",
"title": "Московская область"
},
{
"id": "54be73b2b7f47bef910041a8",
"title": "Центральный округ"
},
{
"id": "54be73b2b7f47bef910041a7",
"title": "Российская Федерация"
}
]
},
"code": 200,
"urgent_data": {
"amount": 2370,
"unseen_payments": 1
}
},
"data": [
{
"id": "54be73b2b7f47bef910041ff",
"title": "Москва",
"inside": [
{
"id": "54be73b2b7f47bef910041a8",
"title": "Центральный округ"
},
{
"id": "54be73b2b7f47bef910041a7",
"title": "Российская Федерация"
}
]
},
{
"id": "54be73b6b7f47bef9100a49a",
"title": "Москвина",
"inside": [
{
"id": "54be73b6b7f47bef9100a493",
"title": "Кудымкарский район"
},
{
"id": "54be73b2b7f47bef910041fe",
"title": "Пермский край"
},
{
"id": "54be73b2b7f47bef910041ae",
"title": "Приволжский округ"
},
{
"id": "54be73b2b7f47bef910041a7",
"title": "Российская Федерация"
}
]
},
{
"id": "54be73b8b7f47bef9100be4a",
"title": "Москвитино",
"inside": [
{
"id": "54be73b8b7f47bef9100be3b",
"title": "Свободненский район"
},
{
"id": "54be73b2b7f47bef910041d1",
"title": "Амурская область"
},
{
"id": "54be73b2b7f47bef910041ab",
"title": "Дальневосточный округ"
},
{
"id": "54be73b2b7f47bef910041a7",
"title": "Российская Федерация"
}
]
},
{
"id": "54be73b2b7f47bef9100436e",
"title": "Москвич",
"inside": [
{
"id": "54be73b2b7f47bef91004365",
"title": "Домодедовский район"
},
{
"id": "54be73b2b7f47bef910041e4",
"title": "Московская область"
},
{
"id": "54be73b2b7f47bef910041a8",
"title": "Центральный округ"
},
{
"id": "54be73b2b7f47bef910041a7",
"title": "Российская Федерация"
}
]
}
]
}
Платежи
Платеж - это операция движения денежных средств между счетами mserver выполняемая по распоряжению пользователя. Платежи различаются по типу:
Тип платежа | Описание |
---|---|
out |
Вывод средств со счета кошелька пользователя в пользу провайдера (провайдер КредитПилот) |
p2p |
Перевод денег со счета кошелька пользователя на счет кошелька другого пользователя |
in |
Ввод средств на счет кошелька пользователя через провайдера (провайдеры КредитПилот, ИПСП, Рапида) |
inout |
Транзит средств от ИПСП в пользу КредитПилот |
Поля, общие для всех типов платежей
type
- in|out|p2p тип Платежаclient_payment_id
- клиентский идентификатор (UUID)amount
- сумма к зачислению в рубляхtotal
- полная сумма Платежа с учетом комиссии в рублях. НеобязательноеcreatedAt
- время созданияprocessedAt
- время завершения online обработкиstatus
- состояниеdecline_reason
- причина отказа в проведении
Поля для платежей типа out
/ inout
(вывод денег)
service
- назначение платежаoutbound
- провайдер, на счет которого были отправлены деньги со счете кошелькаparameters
- параметры платежа, например номер карты/телефона
Поля для типа in
/ inout
(ввод денег)
inbound
- провайдер, со счета которого деньги пришли на счет кошелькаcard
- карта с которой прошло пополнение
Поля для типа p2p
(перевод между кошельками)
destination
- кошелек назначения переводаmessage
- сообщение адресату перевода
Статусы платежа
Код статуса платежа | Описание |
---|---|
created |
Платеж создан (например вызовом POST /payments) и ожидает от клиента команды на исполнение |
processing |
Платеж был запущен в обработку (например вызовом POST /payments/{id}/pay и исполняется |
completed |
Платеж успешно исполнен |
declined |
Платеж отклонен, с уточнением причины в поле decline_reason |
Причины отказа в проведении платежа
Код причины отказа | Описание |
---|---|
invalid_data |
Неверные данные платежа (например неверный номер карты/номер телефона) |
insufficient_funds |
Недостаточно средств на счете кошелька |
internal_error |
Что-то пошло не так, обратитесь в поддержку |
Клиентский идентификатор платежа
Клиент обязан генерировать UUID для каждого отдельного платежа и передавать его в поле client_payment_id
платежного запроса. По спецификации UUID должен быть в нижнем регистре (33b958e5-042b-4fb2-bf9e-e4198125e050). Если в процессе создания платежа клиент получил ошибку I/O, он должен повторять запрос создания платежа с тем же самым client_payment_id
до получения ответа. Гарантируется, что платеж с данным client_payment_id
будет создан не более 1 раза.
Проведение платежа
Для передачи mserver платежа на исполнение клиент следует общепринятому в платежной индустрии двухфазному протоколу. В первой фазе, подготовительной, клиент создает в mserver Платеж с необходимыми параметрами.
По завершении подготовительной фазы клиент получает от mserver информацию о полной стоимости платежа (поле total
) и предъявляет полную стоимость платежа пользователю кошелька.
В случае согласия пользователя с условиями исполнения платежа клиент от имени пользователя инициирует исполнение подготовленного платежа (вторая фаза, платежная).
Платеж в пользу сервиса
Параметры:
type
= out - тип платежаclient_payment_id
- клиентский идентификатор платежаamount
- сумма к зачислениюservice
- назначение платежа, идентификатор Сервисаparameters
- параметры платежного запроса в соответствии с /services/{service}
$ curl -u+79261111111:password -H 'Content-type:application/json'
-d '{"type": "out", "client_payment_id": "e731a7e2-c553-4295-867e-1023359bee28",
"amount": 100, "service": 61, "parameters": {"phoneNumber": "9267101283",
"BIK": "044583151", "Name": "name", "SName": "sname", "Fam": "fam"}}'
https://sandbox.wallet.best/v1/payments
{
"meta": {
"code": 200,
"next_action": "update",
"time": 0.376464
},
"data": {
"id": 1401089240377,
"client_payment_id": "e731a7e2-c553-4295-867e-1023359bee28",
"amount": 100,
"created_at": "2014-08-05T15:09:37.832Z",
"status": "created",
"type": "out",
"service": {
"id": 61,
"name": "Мультибанк"
},
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": false,
"min_length": null,
"max_length": null,
"pattern": null,
"pattern_desc": null,
"type": null,
"title": "№ Телефона (10 цифр)",
"suggested_values": [
"9267101283",
"9267101283"
],
"items": null,
"service_param_pattern_id": null,
"is_changed": false
},
{
"id": "BIK",
"is_disabled": false,
"is_hidden": false,
"is_required": false,
"min_length": null,
"max_length": null,
"pattern": null,
"pattern_desc": null,
"type": null,
"title": "БИК",
"suggested_values": [
"044583151",
"044583151"
],
"items": null,
"service_param_pattern_id": null,
"is_changed": false
},
{
"id": "Name",
"is_disabled": false,
"is_hidden": false,
"is_required": false,
"min_length": null,
"max_length": null,
"pattern": null,
"pattern_desc": null,
"type": null,
"title": "Имя Отправителя",
"suggested_values": [
"name",
"name"
],
"items": null,
"service_param_pattern_id": null,
"is_changed": false
},
{
"id": "SName",
"is_disabled": false,
"is_hidden": false,
"is_required": false,
"min_length": null,
"max_length": null,
"pattern": null,
"pattern_desc": null,
"type": null,
"title": "Отчество Отправителя",
"suggested_values": [
"sname",
"sname"
],
"items": null,
"service_param_pattern_id": null,
"is_changed": false
},
{
"id": "Fam",
"is_disabled": false,
"is_hidden": false,
"is_required": false,
"min_length": null,
"max_length": null,
"pattern": null,
"pattern_desc": null,
"type": null,
"title": "Фамилия Отправителя",
"suggested_values": [
"fam",
"fam"
],
"items": null,
"service_param_pattern_id": null,
"is_changed": false
}
],
"outbound": {
"id": 35,
"code": "tpr_out",
"name": "ООО ТПР (провайдер)"
}
}
}
Коды ошибок
missing_type
- отсутствует обязательный параметр typemissing_client_payment_id
- отсутствует обязательный параметр client_payment_idmissing_amount
- отсутствует обязательный параметр amountinvalid_amount
- неверная сумма платежа, должно быть min <= amount <= max, где min и max - минимальная и максимальная сумма для Сервисаmissing_service
- отсутствует обязательный параметр serviceservice_not_found
- запрошенный сервис не найдетmissing_parameters
- не передан обязательный параметр parameters
Перевод между кошельками
Параметры:
type
= p2p - тип платежаclient_payment_id
- клиентский идентификатор платежаamount
- сумма переводаdestination
- кошелек назначения переводаmessage
- сообщение адресату перевода (опционально)
$ curl -u+79261111111:password -H 'Content-type:application/json'
-d '{"type": "p2p", "client_payment_id": "071c6d23-7508-4e35-ad92-852308a47677", "amont": 100,
"destination": "+79261111112", "message": "Съешь ещё этих мягких французских булок, да выпей чаю"}'
https://sandbox.wallet.best/v1/payments
{
"meta" : {
"code" : 200,
"next_action" : "pay"
},
"data" : {
"id" : 1401089237211,
"client_payment_id" : "071c6d23-7508-4e35-ad92-852308a47677",
"amount" : 100,
"total" : 100.00,
"created_at" : "2014-07-01T06:30:01.277Z",
"status" : "created",
"type" : "p2p",
"destination" : {
"phone" : "+79261111112"
},
"message" : "Съешь ещё этих мягких французских булок, да выпей чаю"
}
}
Коды ошибок
missing_type
- отсутствует обязательный параметр typemissing_client_payment_id
- отсутствует обязательный параметр client_payment_idmissing_amount
- отсутствует обязательный параметр amountinvalid_amount
- сумма перевода должна быть > 0missing_destination
- отсутствует обязательный параметр destinationdestination_not_found
- кошелек назначения платежа не найденinvalid_destination
- попытка отправить p2p перевод самому себеinsufficient_funds
- недостаточно средств для выполнения p2p перевода
Пополнение кошелька
Пополнение кошелька пользователя через запросы к API возможно с использованием пластиковых карт. Существуют 3 сценария пополнения кошелька с карты:
- однократное пополнение
- однократное пополнение с сохранением данных карты для последующего использования (“привязка карты”)
- пополнение с сохраненной ранее карты (“рекарринг”)
Параметры:
type
= in - тип платежаclient_payment_id
- клиентский идентификатор платежаamount
- сумма к зачислениюstore_card
- true|false - сохранить карту, чтобы использовать ее для платежей в дальнейшем (опциональный)card
- идентификатор сохраненной карты с которой будут списаны деньги (опциональный)
Пример однократного пополнения
Создаем платеж:
$ curl -u +79261111111:password -H 'Content-type:application/json' -d '{"type": "in", "client_payment_id": "071c6d23-7508-4e35-ad92-852308a47678", "amount": 100}' https://sandbox.wallet.best/v1/payments
{
"meta" : {
"code" : 200,
"next_action" : "pay"
},
"data" : {
"id" : 1401089237212,
"client_payment_id" : "071c6d23-7508-4e35-ad92-852308a47678",
"amount" : 100,
"total" : 100.00,
"created_at" : "2014-07-01T06:55:27.870Z",
"status" : "created",
"type" : "in",
"inbound" : {
"id" : 62,
"code" : "ipsp_in",
"name" : "ООО ИПСП (агент)"
},
"card" : {
"state" : "created"
}
}
}
Платим:
$curl -u +79261111111:password -H 'Content-type:application/json' -X POST https://sandbox.wallet.best/v1/payments/1401089237212/pay
{
"meta" : {
"code" : 200,
"next_action" : "get"
},
"data" : {
"id" : 1401089237212,
"client_payment_id" : "071c6d23-7508-4e35-ad92-852308a47678",
"amount" : 100,
"total" : 100,
"created_at" : "2014-07-01T06:55:27.870Z",
"status" : "processing",
"type" : "in",
"inbound" : {
"id" : 62,
"code" : "ipsp_in",
"name" : "ООО ИПСП (агент)"
},
"card" : {
"state" : "pending",
"payment_page_url" : "https://test1.ipsp.com/frontend/endpoint?product_id=1721&desc=mserver2&payment_type=S&amount=100.00¤cy=RUB&cf=1401089237212&locale=ru&hash=3d49fa2b7ceb67f8ad7ed7f2247dd2cad1c4acdc"
}
}
}
далее следует перенаправить пользователя на платежную страницу по ссылке из поля card.payment_page_url
.
Пример однократного пополнения с сохранением данных карты
Создаем платеж:
$ curl -u +79261111111:password -H 'Content-type:application/json' -d '{"type": "in", "client_payment_id": "071c6d23-7508-4e35-ad92-852308a47679", "amount": 100, "store_card": true}' https://sandbox.wallet.best/v1/payments
{
"meta" : {
"code" : 200,
"next_action" : "pay"
},
"data" : {
"id" : 1401089237231,
"client_payment_id" : "071c6d23-7508-4e35-ad92-852308a47679",
"amount" : 100,
"total" : 100.00,
"created_at" : "2014-07-01T08:31:24.058Z",
"status" : "created",
"type" : "in",
"inbound" : {
"id" : 62,
"code" : "ipsp_in",
"name" : "ООО ИПСП (агент)"
},
"card" : {
"id" : 21,
"state" : "created"
}
}
}
Платим:
$ curl -u +79261111111:password -H 'Content-type:application/json' -X POST https://sandbox.wallet.best/v1/payments/1401089237231/pay
{
"meta" : {
"code" : 200,
"next_action" : "get"
},
"data" : {
"id" : 1401089237231,
"client_payment_id" : "071c6d23-7508-4e35-ad92-852308a47679",
"amount" : 100,
"total" : 100,
"created_at" : "2014-07-01T08:31:24.058Z",
"status" : "processing",
"type" : "in",
"inbound" : {
"id" : 62,
"code" : "ipsp_in",
"name" : "ООО ИПСП (агент)"
},
"card" : {
"id" : 21,
"state" : "pending",
"payment_page_url" : "https://test1.ipsp.com/frontend/endpoint?product_id=1721&desc=mserver2&payment_type=S&amount=100.00¤cy=RUB&cf=1401089237231&locale=ru&biller_client_id=21&perspayee_expiry=0150&recur_freq=1&hash=5136f2cb7fd77f98b1df86d4644338e5a10dab98"
}
}
}
далее следует перенаправить пользователя на платежную страницу по ссылке из поля card.payment_page_url
.
Убедимся, что платеж успешен и карта сохранена:
$ curl -u +79261111111:password https://sandbox.wallet.best/v1/payments/1401089237231
{
"meta" : {
"code" : 200
},
"data" : {
"id" : 1401089237231,
"client_payment_id" : "071c6d23-7508-4e35-ad92-852308a47679",
"amount" : 100,
"total" : 100,
"created_at" : "2014-07-01T08:31:24.058Z",
"processed_at" : "2014-07-01T08:39:40.173Z",
"status" : "completed",
"type" : "in",
"inbound" : {
"id" : 62,
"code" : "ipsp_in",
"name" : "ООО ИПСП (агент)"
},
"card" : {
"id" : 21,
"state" : "active",
"title" : "541715******2399",
"type" : "MasterCard"
}
}
}
Пример пополнения с сохраненной карты
Используем карту #21 сохраненную в предыдущем примере.
Создаем платеж:
$ curl -u +79261111111:password -H 'Content-type:application/json' -d '{"type": "in", "client_payment_id": "071c6d23-7508-4e35-ad92-852308a47689", "amount": 100, "card": 21}' https://sandbox.wallet.best/v1/payments
{
"meta" : {
"code" : 200,
"next_action" : "pay"
},
"data" : {
"id" : 1401089237232,
"client_payment_id" : "071c6d23-7508-4e35-ad92-852308a47653",
"amount" : 100,
"total" : 100.00,
"created_at" : "2014-07-01T08:58:51.143Z",
"status" : "created",
"type" : "in",
"inbound" : {
"id" : 62,
"code" : "ipsp_in",
"name" : "ООО ИПСП (агент)"
},
"card" : {
"id" : 21,
"state" : "active",
"title" : "541715******2399",
"type" : "MasterCard"
}
}
}
Платим:
$ curl -u+79261111111:password -H 'Content-type:application/json' -X POST https://sandbox.wallet.best/v1/payments/1401089237232/pay
{
"meta" : {
"code" : 200,
"next_action" : "get"
},
"data" : {
"id" : 1401089237232,
"client_payment_id" : "071c6d23-7508-4e35-ad92-852308a47653",
"amount" : 100,
"total" : 100,
"created_at" : "2014-07-01T12:04:49.330Z",
"status" : "processing",
"type" : "in",
"inbound" : {
"id" : 62,
"code" : "ipsp_in",
"name" : "ООО ИПСП (агент)"
},
"card" : {
"id" : 25,
"state" : "active",
"title" : "541715******2399",
"type" : "MasterCard"
}
}
}
Транзитный платеж
Транзитный платеж соединяет в одном действии зачисление денег на кошелек через поставщика ввода средств (в настоящее время ИПСП) и списание денег со счета кошелька в пользу поставщика вывода средств (в настоящее время КредитПилот).
По аналогии с пополнением кошелька возможны следующие варианты транзитного платежа:
- однократное списание с карты
- однократное списание с карты с сохранением данных карты для последующего использования (“привязка карты”)
- списание средств с сохраненной ранее карты (“рекарринг”)
Параметры:
type
= inout - тип платежаclient_payment_id
- клиентский идентификатор платежаamount
- сумма к зачислениюservice
- назначение платежа, идентификатор Сервисаparameters
- параметры платежного запроса в соответствии с /services/{service_id}card
- идентификатор сохраненной карты с которой будут списаны деньги (опциональный)store_card
- true | false - сохранить карту, чтобы использовать ее для платежей в дальнейшем (опциональный)
Однократное списание с карты
Создаем платеж:
$ curl -u+79261111111:password -H 'Content-type:application/json'
-d '{"type": "inout", "client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689", "amount": 100, "service": 834,
"parameters": {"phoneNumber": "9267101283"}}'
https://sandbox.wallet.best/v1/payments
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 9999,
"unseen_payments": 1
},
"next_action": "pay",
"time": 0.418221
},
"data": {
"id": 25778,
"client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-17T13:49:13.394Z",
"status": "created",
"type": "inout",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": true,
"min_length": 12,
"max_length": 12,
"range_start": 0,
"range_end": 0,
"patterns": [],
"pattern": "^\\+7[0-9]{10}$",
"pattern_desc": "Номер телефона РФ начиная с +7 (в международном формате). Например, +79261112233",
"type": "phone",
"title": "Номер телефона, начиная с +7",
"default_value": null,
"suggested_values": [],
"items": null,
"localized_fields": [
"title",
"pattern_desc"
],
"value": "+79267101283"
}
],
"inbound": {
"id": 4,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"card": {
"state": "created"
},
"wallet": {
"phone": "+79261111111"
}
}
}
Платим:
shell
curl -u+79261111111:password -H 'Content-type:application/json' -X POST https://sandbox.wallet.best/v1/payments/25818/pay
{
"meta": {
"code": 200,
"next_action": "get",
"time": 0.317098
},
"data": {
"id": 25818,
"client_payment_id": "131c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-17T15:03:41.606Z",
"status": "processing",
"type": "inout",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"code": "phoneNumber",
"name": "№ Телефона",
"value": "9267101283"
}
],
"inbound": {
"id": 4,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"card": {
"state": "pending",
"payment_page_url": "https:\/\/test1.ipsp.com\/frontend\/endpoint?product_id=1721&desc=TestWallet&payment_type=S&amount=103.00¤cy=RUB&cf=25818&locale=ru&hash=afbe9967151306a3e69900d5e3bffd7b5ef8475c"
},
"wallet": {
"phone": "+79261111111"
}
}
}
Далее следует перенаправить пользователя на платежную страницу по ссылке из поля card.payment_page_url
С сохранением данных карты
Сценарий ничем не отличается от предыдущего, кроме передачи флага store_card
= true при создании платежа.
Идентификатор карты, возвращенный в data.card.id
можно впоследствии использовать для пополнения счета кошелька или выполнения транзитных платежей с сохраненной карты.
Создаем платеж:
shell
$ curl -u+79261111111:password -H 'Content-type:application/json'
-d '{"type": "inout", "client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689", "amount": 100, "store_card": true,
"service": 834, "parameters": {"phoneNumber": "9267101283"}}'
https://sandbox.wallet.best/v1/payments
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 9999,
"unseen_payments": 1
},
"next_action": "pay",
"time": 0.330981
},
"data": {
"id": 25778,
"client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-17T13:49:13.394Z",
"status": "created",
"type": "inout",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": true,
"min_length": 12,
"max_length": 12,
"range_start": 0,
"range_end": 0,
"patterns": [],
"pattern": "^\\+7[0-9]{10}$",
"pattern_desc": "Номер телефона РФ начиная с +7 (в международном формате). Например, +79261112233",
"type": "phone",
"title": "Номер телефона, начиная с +7",
"default_value": null,
"suggested_values": [],
"items": null,
"localized_fields": [
"title",
"pattern_desc"
],
"value": "+79267101283"
}
],
"inbound": {
"id": 4,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"card": {
"state": "created"
},
"wallet": {
"phone": "+79261111111"
}
}
}
Платим:
shell
curl -u+79261111111:password -H 'Content-type:application/json' -X POST https://sandbox.wallet.best/v1/payments/25818/pay
{
"meta": {
"code": 200,
"next_action": "get",
"time": 0.317098
},
"data": {
"id": 25818,
"client_payment_id": "131c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-17T15:03:41.606Z",
"status": "processing",
"type": "inout",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"code": "phoneNumber",
"name": "№ Телефона",
"value": "9267101283"
}
],
"inbound": {
"id": 4,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"card" : {
"id" : 7222,
"state" : "active",
"title" : "541715******6825",
"type" : "MasterCard"
},
"wallet": {
"phone": "+79261111111"
}
}
}
C сохраненной карты
Транзитный платеж с сохраненной карты отличается от платежа с однократным списанием только указанием идентификатора карты в поле card
при создании платежа.
Создаем платеж:
shell
$ curl -u+79261111111:password -H 'Content-type:application/json'
-d '{"type": "inout", "client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689", "amount": 100, "card": 21, "service": 834,
"parameters": {"phoneNumber": "9267101283"}}'
https://sandbox.wallet.best/v1/payments
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 9999,
"unseen_payments": 1
},
"next_action": "pay",
"time": 0.32556
},
"data": {
"id": 25778,
"client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-17T13:49:13.394Z",
"status": "created",
"type": "inout",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": true,
"min_length": 12,
"max_length": 12,
"range_start": 0,
"range_end": 0,
"patterns": [],
"pattern": "^\\+7[0-9]{10}$",
"pattern_desc": "Номер телефона РФ начиная с +7 (в международном формате). Например, +79261112233",
"type": "phone",
"title": "Номер телефона, начиная с +7",
"default_value": null,
"suggested_values": [],
"items": null,
"localized_fields": [
"title",
"pattern_desc"
],
"value": "+79267101283"
}
],
"inbound": {
"id": 4,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"card" : {
"id" : 21,
"state" : "active",
"title" : "541715******6825",
"type" : "MasterCard"
},
"wallet": {
"phone": "+79261111111"
}
}
}
Отложенный выбор типа платежа
Пользователь может отложить выбор типа платежа между out и inout до подтверждения платежа. Платеж может быть создан, как платеж со счета кошелька out, затем, если клиент передумал и решил заплатить картой, при подтверждении платежа вызовом
POST /payments/{:id}/pay
нужно передать в теле запроса следующие поля:
Поля запроса подтверждения платежа для смены типа in -> inout
type
= inout - тип платежаstore_card
- true | false - сохранить карту, чтобы использовать ее для платежей в дальнейшем (опциональный)card
- идентификатор сохраненной карты с которой будут списаны деньги (опциональный)
Создаем платеж используя кошелек как источник средств:
curl -u+79261111111:password -H 'Content-type:application/json'
-d '{"type": "out", "amount": 100, "client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689", "service": 834, "parameters": {"phoneNumber": "9267101283"}}'
https://sandbox.wallet.best/v1/payments
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 9999,
"unseen_payments": 1
},
"next_action": "pay",
"time": 0.468765
},
"data": {
"id": 25832,
"client_payment_id": "221c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-18T12:40:02.248Z",
"status": "created",
"type": "out",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": true,
"min_length": 12,
"max_length": 12,
"range_start": 0,
"range_end": 0,
"patterns": [],
"pattern": "^\\+7[0-9]{10}$",
"pattern_desc": "Номер телефона РФ начиная с +7 (в международном формате). Например, +79261112233",
"type": "phone",
"title": "Номер телефона, начиная с +7",
"default_value": null,
"suggested_values": [],
"items": null,
"localized_fields": [
"title",
"pattern_desc"
],
"value": "+79267101283"
}
],
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"wallet": {
"phone": "+79261111111"
}
}
}
Решаем заплатить сохраненной картой с ID 7222:
curl -u+79261111111:password -H 'Content-type:application/json'
-d '{"type": "inout", "card": 7222}'
https://sandbox.wallet.best/v1/payments/25832/pay
{
"meta": {
"code": 200,
"next_action": "get",
"time": 0.317098
},
"data": {
"id": 25818,
"client_payment_id": "131c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-17T15:03:41.606Z",
"status": "processing",
"type": "inout",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": true,
"min_length": 12,
"max_length": 12,
"range_start": 0,
"range_end": 0,
"patterns": [],
"pattern": "^\\+7[0-9]{10}$",
"pattern_desc": "Номер телефона РФ начиная с +7 (в международном формате). Например, +79261112233",
"type": "phone",
"title": "Номер телефона, начиная с +7",
"default_value": null,
"suggested_values": [],
"items": null,
"localized_fields": [
"title",
"pattern_desc"
],
"value": "+79267101283"
}
],
"inbound": {
"id": 4,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"card" : {
"id" : 7222,
"state" : "active",
"title" : "541715******6825",
"type" : "MasterCard"
},
"wallet": {
"phone": "+79261111111"
}
}
}
Анонимный платеж
Анонимный платеж соединяет в одном действии зачисление денег на кошелек через поставщика ввода средств (в настоящее время ИПСП) и списание денег со счета кошелька в пользу поставщика вывода средств (в настоящее время КредитПилот).
Анонимный платеж - аналог Транизитного, только без авторизации
Для того что бы провести такой платеж - клиенту необходимо получить токен доступа для приложения у MServer
Токен доступа приложения
curl -H "Accept: application/json" -u mbank_storefront:oklol https://www.synq.ru/mserver2-dev/oauth/token -d grant_type=client_credentials
{
"meta" : {
"code" : 200
},
"data" : {
"access_token" : "88357939-aa71-426b-9afc-a5a9769ce527",
"token_type" : "bearer",
"expires_in" : 599,
"scope" : "wallet.read person.read person.modify cards.read cards.modify payments.read payments.modify"
}
}
После - с этим токеном совершается обычный транзитный платеж, но с обязательной передачей заголовка X-Authorization-Type : application
Параметры:
type
= inout - тип платежаclient_payment_id
- клиентский идентификатор платежаamount
- сумма к зачислениюservice
- назначение платежа, идентификатор Сервисаparameters
- параметры платежного запроса в соответствии с /services/{service_id}card
- идентификатор сохраненной карты с которой будут списаны деньги (опциональный)store_card
- true | false - сохранить карту, чтобы использовать ее для платежей в дальнейшем (опциональный)
Создаем платеж:
$ curl -H 'Content-type:application/json' -H 'X-Authorization-Type:application' -H 'Authorization: bearer 88357939-aa71-426b-9afc-a5a9769ce527'
-d '{"type": "inout", "client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689", "amount": 100, "service": 834,
"parameters": {"phoneNumber": "9267101283"}}'
https://sandbox.wallet.best/v1/payments
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 9999,
"unseen_payments": 1
},
"next_action": "pay",
"time": 0.418221
},
"data": {
"id": 25778,
"client_payment_id": "021c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-17T13:49:13.394Z",
"status": "created",
"type": "inout",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"id": "phoneNumber",
"is_disabled": false,
"is_hidden": false,
"is_required": true,
"min_length": 12,
"max_length": 12,
"range_start": 0,
"range_end": 0,
"patterns": [],
"pattern": "^\\+7[0-9]{10}$",
"pattern_desc": "Номер телефона РФ начиная с +7 (в международном формате). Например, +79261112233",
"type": "phone",
"title": "Номер телефона, начиная с +7",
"default_value": null,
"suggested_values": [],
"items": null,
"localized_fields": [
"title",
"pattern_desc"
],
"value": "+79267101283"
}
],
"inbound": {
"id": 4,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"card": {
"state": "created"
},
"wallet": {
"phone": "+79261111111"
}
}
}
Платим:
curl -H 'X-Authorization-Type:application' -H 'Authorization: bearer 88357939-aa71-426b-9afc-a5a9769ce527' -H 'Content-type:application/json' -X POST https://sandbox.wallet.best/v1/payments/25818/pay
{
"meta": {
"code": 200,
"next_action": "get",
"time": 0.317098
},
"data": {
"id": 25818,
"client_payment_id": "131c6d23-7508-4e35-ad92-852308a47689",
"amount": 100,
"total": 103,
"created_at": "2015-03-17T15:03:41.606Z",
"status": "processing",
"type": "inout",
"service": {
"id": 834,
"name": "Мегафон"
},
"parameters": [
{
"code": "phoneNumber",
"name": "№ Телефона",
"value": "9267101283"
}
],
"inbound": {
"id": 4,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"outbound": {
"id": 1,
"code": "tpr_out",
"name": "Кредит Пилот"
},
"card": {
"state": "pending",
"payment_page_url": "https:\/\/test1.ipsp.com\/frontend\/endpoint?product_id=1721&desc=TestWallet&payment_type=S&amount=103.00¤cy=RUB&cf=25818&locale=ru&hash=afbe9967151306a3e69900d5e3bffd7b5ef8475c"
},
"wallet": {
"phone": "+79261111111"
}
}
}
Далее следует перенаправить пользователя на платежную страницу по ссылке из поля card.payment_page_url
Уведомление об анонимном платеже на почту
Для отправки чека на почту после процессинга анонимного платежа
Параметры:
id
- идентификатор платежаemail
- почта получателя
Для локализации использовать заголовк Accept-Language, по умолчанию ru_RU
$ curl -H 'Content-type:application/json' -H 'X-Authorization-Type:application' -H 'Authorization: bearer 88357939-aa71-426b-9afc-a5a9769ce527'
-d '{"id": 34123, "email": "vasya@petrov.xxx"}'
https://sandbox.wallet.best/v1/payments/bill
Получение истории платежей
Сервис может быть выключеным, но в момент проведения транзакции был активен. Такой сервис будет помечен флагом is_disabled
shell
$ curl -u +79261111111:password -H 'Content-type:application/json' https://sandbox.wallet.best/v1/payments?page=0&size=35
Параметры page
и size
в запросе позволяют задать номер (начиная с 0) и размер страницы, которую запрашивает клиент. По умолчанию номер страницы - 0 и размер страницы - 35 платежей. Опциона��ьные параметры type
и status
позволяют фильтровать платежи по типу и статусу. По умолчанию, платежи со статусом created
не попадают в список, чтобы их увидеть, необходимо задать этот статус явно. Статусы и типы можно перечислять через запятую, например: status=created,completed
.
Если платеж еще не был просмотрен, у него будет поле unseen
со зачением true
Просмотренным платеж считается, когда он вернулся в списке. Если же платеж присутствует на второй странице выписки, а она не была запрошена - платеж будет считаться непросмотренным
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 9971.34,
"unseen_payments": 1
},
"page": {
"total_elements": 4
}
},
"data": [
{
"id": 1401089244809,
"client_payment_id": "495e4210-18bc-4301-b388-5dda972865e6",
"amount": 5,
"total": 8.03,
"created_at": "2014-10-30T14:21:12.406Z",
"processed_at": "2014-10-30T14:21:20.309Z",
"status": "completed",
"type": "out",
"service": {
"id": 1,
"name": "Мегафон",
"is_disabled": true
},
"parameters": [
{
"code": "phoneNumber",
"name": "№ телефона (10 цифр)",
"value": "9263456782"
}
],
"outbound": {
"id": 35,
"code": "tpr_out",
"name": "ООО ТПР (провайдер)"
},
"wallet": {
"phone": "+380631345678"
},
"remote_check": "1414678875803",
"title": "",
"subtitle": "",
"description": "",
"unseen": true
},
{
"id": 1401089244494,
"client_payment_id": "df9180aa-a359-420d-8f3c-009a1bb8fac6",
"amount": 55,
"total": 55,
"created_at": "2014-10-27T16:09:26.058Z",
"processed_at": "2014-10-27T16:09:28.936Z",
"status": "completed",
"type": "in",
"inbound": {
"id": 62,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"card": {
"id": 2727,
"state": "active",
"title": "541715******9149",
"type": "MasterCard"
},
"wallet": {
"phone": "+380631345678"
}
},
{
"id": 1401089244492,
"client_payment_id": "087a9555-d25b-400c-af5b-ef1c5a99b145",
"amount": 1000,
"total": 1015,
"created_at": "2014-10-27T16:07:34.282Z",
"processed_at": "2014-10-27T16:07:47.922Z",
"status": "completed",
"type": "out",
"service": {
"id": 6,
"name": "Яндекс.Деньги",
"is_disabled": false
},
"parameters": [
{
"code": "phoneNumber",
"name": "№ счёта (1-32 цифры):",
"value": "55855555"
}
],
"outbound": {
"id": 35,
"code": "tpr_out",
"name": "ООО ТПР (провайдер)"
},
"wallet": {
"phone": "+380631345678"
},
"remote_check": "1414426063287",
"title": "",
"subtitle": "",
"description": ""
},
{
"id": 1401089244493,
"client_payment_id": "a0449e92-a853-4a80-bc47-11b453c54ab9",
"amount": 1015,
"total": 1015,
"created_at": "2014-10-27T16:07:37.952Z",
"processed_at": "2014-10-27T16:07:39.822Z",
"status": "completed",
"type": "in",
"inbound": {
"id": 62,
"code": "ipsp_in",
"name": "ООО ИПСП (агент)"
},
"card": {
"id": 2727,
"state": "active",
"title": "541715******9149",
"type": "MasterCard"
},
"wallet": {
"phone": "+380631345678"
}
},
{
"id": 1401089244491,
"client_payment_id": "54851a0b-4b60-4497-ab94-7f1b49eb9db0",
"amount": 1000,
"total": 1015,
"created_at": "2014-10-27T16:05:57.109Z",
"processed_at": "2014-10-27T16:05:57.264Z",
"status": "declined",
"decline_reason": "invalid_data",
"type": "out",
"service": {
"id": 17,
"name": "Триколор ТВ",
"is_disabled": false
},
"parameters": [
{
"code": "578",
"name": "Тип платежа",
"value": "588255585"
},
{
"code": "phoneNumber",
"name": "№ агент.договора или приёмного оборудования (1-14 цифр)",
"value": "588255585"
}
],
"outbound": {
"id": 35,
"code": "tpr_out",
"name": "ООО ТПР (провайдер)"
},
"wallet": {
"phone": "+380631345678"
},
"title": "",
"subtitle": "",
"description": ""
}
]
}
Сброс счетчика непросмотренных платежей
Возможно обнулить счетчик непросмотренных платежей
$ curl -u +79261111111:password -H 'Content-type:application/json' https://sandbox.wallet.best/v1/payments/reset_unseen
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 9862
}
},
"data": "ok"
}
Уведомления об изменении статуса платежа
Для уведомления внешней системы об изменениях статуса платежа mserver выполняет POST запрос на URL указанный в настройках проекта.
Для авторизации запрос должен содержать app_id
и access_token
( результат sha1( app_id + app_secret )
.
Уведомление передается в теле POST запроса в виде объекта платежной операции сериализованного в JSON. Например:
{
"created_at" : "2014-08-02T14:37:20.102Z",
"payment" : {
"id" : 1401089240253,
"client_payment_id" : "a02b1416-b9c1-4782-88c5-da4d78b32f8d",
"amount" : 1,
"total" : 1,
"created_at" : "2014-08-02T14:36:02.997Z",
"processed_at" : "2014-08-02T14:37:20.102Z",
"status" : "completed",
"type" : "in",
"inbound" : {
"id" : 62,
"code" : "ipsp_in",
"name" : "ООО ИПСП (агент)"
},
"card" : {
"state" : "used",
"title" : "541715******2399",
"type" : "MasterCard"
}
},
"from" : "processing",
"to" : "completed",
"type" : "complete"
}
Поля
created_at
- момент времени совершения платежной операцииpayment
- стандартное представление объекта платежа описанное вышеfrom
- начальный статус платежаto
- конечный статус платежаtype
- тип платежной операции, см. ниже
Типы платежных операций
Тип | Описание |
---|---|
complete |
Платеж проведен |
decline |
Платеж отклонен |
undo |
Отмена ранее успешного платежа (сторно) |
redo |
Ранее отмененный платеж сделан успешным (сторно сторно and we need to go deeper) |
Webhook для логирования переводов Бэст
$ curl 'https://sandbox.wallet.best/v1/payments/best/p2p' -X POST -H 'Content-type:application/json' -d '{"payment_id": 12345678, "sender": {"id":7777777, "phone": "+79250101212"}, "recipient": {"id":88888888, "phone": "+79110992233"}}'
{
"meta": {
"code": 200
}
}
Коды ошибок
empty_request
- в запросе отсутствуют данные для логирования
Получение переводов Бэст по кошельку
Платежей может не быть или они еще не сформированы. В таком слечае вернется пустое поле date
Каждый платеж имеет флаг unseen
со зачением true, аналогично платежам /payments
$ curl -u +79261111111:password -H 'Content-type:application/json' https://sandbox.wallet.best/v1/payments/best
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 3143.76,
"unseen_payments_best": 1
}
},
"data": [
{
"number": 413258621,
"amount": 30,
"currency_alpha": "RUR",
"note": "test pay",
"smstosender": 0,
"creating_date": "2014-12-24T21:00:00.000+0000",
"fee": 30,
"amount_charge": 30,
"currency_charge": "RUR",
"rate": 1,
"unseen": true,
"sender": {
"data": {
"country": {
"numeric": "643"
},
"lastname": "Александр",
"firstname": "Янышин",
"patronymic": "Сергеевич",
"isresident": 1
},
"address": {
"phone": "9267101280"
}
},
"receiver": {
"data": {
"country": {
"numeric": "643"
},
"lastname": "Александр",
"firstname": "Янышин",
"patronymic": "Сергеевич",
"isresident": 1
},
"address": []
}
}
]
}
Сброс счетчика непросмотренных платежей Бэст
Возможно обнулить счетчик непросмотренных платежей
$ curl -u +79261111111:password -H 'Content-type:application/json' https://sandbox.wallet.best/v1/payments/best/reset_unseen
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 9862
}
},
"data": "ok"
}
Карты
Карта - это сохраненный в mserver токен, с помощью которого пользователь кошелька может пополнять счет без ввода данных пластиковой карты.
Поля
id
- уникальный идентификатор картыstate
- состояние карты, см. нижеtitle
- название карты, в качестве названия сейчас используется маскированный номер картыtype
- бренд карты: Visa/MasterCard/…
Состояния карты
Код состояния карты | Описание |
---|---|
created |
Карта только что создана |
pending |
Карта сохраняется (ожидается уведомление от IPSP о успехе/неуспехе карточной транзакции |
active |
Карта сохранена, может быть использована для повторных платежей |
failed |
Карта не сохранена (и уже не будет) |
used |
Карта использована для однократного пополнения |
Создание карты
Параметры
card_success_url
- URL на который пользователь будет перенаправлен в случае успешного сохранения карты, опциональноcard_failure_url
- URL на который пользователь будет перенаправлен в случае неуспешного сохранения карты, опциональноiframe
- опциональный параметр [true|false], который будет передаваться в payment_page_url
$ curl -u+79261111111:p@ssw0rD -H 'Content-type:application/json' -d '{"card_success_url": "http://ya.ru", "card_failure_url": "http://google.com"}' https://sandbox.wallet.best/v1/cards
{
"meta" : {
"code" : 200
},
"data" : {
"id" : 62,
"state" : "pending",
"payment_page_url" : "https://test1.ipsp.com/frontend/endpoint?product_id=1721&desc=mserver2&payment_type=A&amount=1.00¤cy=RUB&biller_client_id=1f95c7b9-74e5-4fd7-983d-c8d03d90347e&perspayee_expiry=0150&recur_freq=1&locale=ru&hash=cace0d7de544a25d2aa685ef12263a10655d9058"
}
}
далее следует перенаправить пользователя на платежную страницу по ссылке из поля payment_page_url
. После ввода пользователем данных карты на платежной странице и получения mserver уведомления от IPSP об успехе или неуспехе карточной транзакции карта перейдет в состояние active
или failed
.
Коды ошибок
active_cards_limit
- превышено максимально возможное количество активных карт
Загрузка карты
$ curl -u+79261111111:p@ssw0rD -H 'Content-type:application/json' https://sandbox.wallet.best/v1/cards/62
{
"meta" : {
"code" : 200
},
"data" : {
"id" : 62,
"state" : "active",
"title" : "541715******2399",
"type" : "MasterCard"
}
}
Как видно, карта успешно сохранена и может быть использована для пополнения счета кошелька.
Получение списка карт
Опциональный параметр state
позволяет фильтровать карты по состоянию.
$ curl -u+79261111111:p@ssw0rD -H 'Content-type:application/json' https://sandbox.wallet.best/v1/cards?state=active,pending
{
"meta" : {
"code" : 200
},
"data" : [ {
"id" : 62,
"state" : "active",
"title" : "541715******2399",
"type" : "MasterCard"
} ]
}
Удаление карты
$ сurl -u+79261111111:p@ssw0rD -H 'Content-type:application/json'
-X DELETE https://sandbox.wallet.best/v1/cards/62
{
"meta" : {
"code" : 200
}
}
Данные тестовых карт
Номер карты | Срок действия | CVV2/CVC2 | 3D-Secure |
---|---|---|---|
5417150893587260 | 01/17 | 082 | ✓ |
4652060573334999 | 01/17 | 067 | ✓ |
Карты, без поддержки 3D-Secure не работают:
Номер карты | Срок действия | CVV2/CVC2 | 3D-Secure |
---|---|---|---|
4652060724922338 | 01/17 | 989 | ✗ |
5417150396276825 | 01/17 | 789 | ✗ |
Пароль 3D-Secure: 123456.
Получение списка геоточек
Список геоточек с возможностью фильтрации. Параметры запроса:
group
- фильтр по группеpoint
- координаты для получения точек в радиусе, формат: longitude,latitude. Пример:shell curl -u +12345675578:password https://sandbox.wallet.best/v1/locations?point=57.415033,51.446833
distance
- радиус площади в метрах, по-умолчанию 500. Работает только вместе с point.square
- получение точек в прямоугольном полигоне. Передать нужно две координаты - сначала левую верхнюю, затем правую нижнюю точки в формате: longitude,latitude,longitude,latitude. Пример:
shell curl -u +12345675578:password https://sandbox.wallet.best/v1/locations?square=57.279764,51.512689,57.415033,51.446833
Внимание! Всегда передавайте коориднаты в последовательности longitude,latitude, а не наоборот
Поля:
id
- уникальный идентификатор точкиname
- наименование точкиtype
- офис | терминал | кассаgroup
- replenishment | verification | money_transferworktime
- время работыaddress
- адрес точкиlatitude
- широта точкиlongitude
- долгота точки
Ошибки:
invalid_location_group
- неправильная группаmissed_location_point_comma
- нет разделительной запятой между долготой и широтой для точки координатmissed_location_square_comma
- нет разделительной запятой между долготой и широтой для координат в полигонеwrong_location_square_points_amount
- координат в полигоне должно быть ровно 4
$ curl -u +12345675578:password https://sandbox.wallet.best/v1/locations
{
"meta": {
"code": 200
},
"data": [
{
"id": "54635060279871e2098b4567",
"name": "Точка пополнения 'Денег нет'",
"type": "Банкомат: Инвестбанк ОАО АКБ",
"group": "replenishment",
"worktime": "пн-пт: 09:00-20:00, сб: 10:00-16:00",
"address": "Москва ул. Ворошилова 169-171",
"latitude": 55.616371,
"longitude": 37.211893
},
{
"id": "54635060279871e2098b4568",
"name": "За Казмадан!",
"type": "Касса: СЛАВИНВЕСТБАНК ООО",
"group": "verification",
"worktime": "круглосуточно",
"address": "Москва ул. маршала Жукова 1",
"latitude": 55.676006,
"longitude": 37.252398
}
]
}
Лимиты
Лимиты платежей
$ сurl -u+79261111111:p@ssw0rD -H 'Content-type:application/json' https://sandbox.wallet.best/v1/limits
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 581,
"unseen_payments": 1
}
},
"data": [
{
"title": "Максимальный остаток на счет",
"description": "Сумма сверх указанного лимита будет временно недоступна для любых операций",
"limits": [
{
"type": "bool",
"value": true,
"status": "anonymous"
},
{
"type": "string",
"value": "60000",
"status": "verified"
},
{
"type": "bool",
"value": false,
"status": "personified"
}
]
}
]
}
Инвойсы
Статусы инвойса
Код | Описание |
---|---|
created |
Инвойс создан |
canceled |
Инвойс отменен пользователем, который его создал |
processing |
Инвойс был запущен в обработку методом /pay |
completed |
Платеж по инвойсу успешно прошел |
declined |
Платеж по инвойсу отклонен мсервером |
Создание инвойса
Поля
payer
- номер телефона, кто будет платить, на кого выставляется инвойс, обязательное полеamount
- сумма к оплате, обязательное полеmessage
- произвольный текст, необязательное поле
$ curl -u +12345675578:password -H 'Content-type:application/json' -d '{"payer": "+12345678102", "amount": 350, "message": "Test invoice"}' https://sandbox.wallet.best/v1/invoices
{
"meta": {
"code": 200
},
}
Коды ошибок
missing_payer
- не указано, кто будет платитьpayer_not_exists
- нет такого пользователяinvalid_payer
- нельзя выставлять счет самому себеmissing_amount
- не указана сумма
Список инвойсов выставленных пользователю
$ curl -u +12345675578:password https://sandbox.wallet.best/v1/invoices
{
"meta": {
"code": 200
},
"data": [
{
"_id": "5422daccb7f47b52010041a7",
"payer": "+12345675578",
"amount": 200,
"recipient": "+12345678102",
"message": null,
"status": "processing",
"payment_id": null
},
{
"_id": "5422dc24b7f47b52010041a8",
"payer": "+12345675578",
"amount": 300,
"recipient": "+12345678102",
"message": "Test invoice",
"status": "completed",
"payment_id": 1401089242211
},
{
"_id": "5422dd02b7f47b52010041a9",
"payer": "+12345675578",
"amount": 300,
"recipient": "+12345678102",
"message": "Test invoice",
"status": null,
"payment_id": null
}
]
}
Список инвойсов, которые выставил пользователь
$ curl -u +12345675578:password https://sandbox.wallet.best/v1/invoices/created
{
"meta": {
"code": 200
},
"data": [
{
"_id": "5422cebeb7f47b53010041a7",
"payer": "+12345671157",
"amount": 100,
"recipient": "+12345675578",
"message": null,
"status": null,
"payment_id": null
},
{
"_id": "5422cf7cb7f47b54010041a7",
"payer": "+12345671157",
"amount": 1050,
"recipient": "+12345675578",
"message": null,
"status": "canceled",
"payment_id": null
}
]
}
Повторить (продублировать) инвойс
$ curl -u +12345675578:password https://sandbox.wallet.best/v1/invoices/5422cf7cb7f47b54010041a7/duplicate
{
"meta": {
"code": 200
},
"data": {
"_id": "542423c7b7f47b58010041a8",
"payer": "+12345671157",
"amount": 1050,
"recipient": "+12345675578",
"message": null,
"status": "canceled",
"payment_id": null
}
}
Коды ошибок
invalid_invoice
- нет такого инвойса
Отменить инвойс
$ curl -u +12345675578:password https://sandbox.wallet.best/v1/invoices/5422cebeb7f47b53010041a7/cancel
{
"meta": {
"code": 200
}
}
Коды ошибок
invoice_is_processing
- инвойс процессится, уже нельзя отменитьinvoice_is_completed
- инвойс выполнен, нет смысла отменятьinvoice_is_already_canceled
- инвойс был отменен ранееinvoice_cancelling_error
- что-то пошло не так, при отмене инвойсаinvoice_not_found
- нет такого инвойса
Оплатить инвойс
$ curl -u +12345675578:password -X POST https://sandbox.wallet.best/v1/invoices/5422dd02b7f47b52010041a9/pay
{
"meta": {
"code": 200
},
"data": {
"meta": {
"code": 200,
"next_action": "pay",
"time": 0.927491
},
"data": {
"id": 1401089242256,
"client_payment_id": "a0341db9-280f-4daa-ad09-7f10e1dce5a5",
"amount": 300,
"total": 300,
"created_at": "2014-09-25T14:26:47.406Z",
"status": "created",
"type": "p2p",
"wallet": {
"phone": "+12345675578"
},
"destination": {
"phone": "+12345678102"
},
"direction": "out",
"message": "Test invoice"
}
}
}
Коды ошибок
invoice_is_processing
- уже запущен процесс оплаты для инвойсаinvoice_is_completed
- инвойс уже оплаченinvoice_is_canceled
- инвойс был отменен пользователем, создавшим егоinvoice_is_declined
- оплата по инвойсу была отменена МСервером
Шаблоны платежей
Шаблоны платежей предназначены для платежей типа ‘out’ для сервисов. Потому для создания платежа обязательно поле service_id
Поля шаблона
name
- имя шаблонаtype
- ** public | private**amount
- сумма платежаservice_id
- id сервиса, обязательное поле при созданииparameters
- массив с параметрами и их значением в формате: {param_id : param_value}disabled
- массив с id параметров, которые в форме шаблона нельзя изменить {'phone’, 'name’}wallet
- объект кошелька
Создание шаблонов
$ curl -H "Authorization: Bearer b48a991e-e010-4329-9817-f8389a774c45" -H 'Content-type:application/json'
-d '{"name": "Template", "amount": 350, "type": "public", "service_id": 1000,
"parameters": {"phoneNumber": "+380509990088"}, "disabled": ["phoneNumber"]}'
https://sandbox.wallet.best/v1/payments/templates
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 2370,
"unseen_payments": 1
}
},
"data": {
"id": "54d23587a60ad674680041be"
}
}
Получения списка шаблонов
Список шаблонов с постраничной навигацией и возможностью фильтрации. Параметры запроса:
size
- кол-во элементов в списке (по-умолчанию 20)page
- страница спискаtype
- ** public | private**phone
- телефон кошелькаservice_id
- id сервиса
Важно!
Если type не передан или type = private, то вернутся шаблоны только для авторизированного кошелька, а переданный телефон в параметре phone будет проигнорирован
Если же нужно получить список по другим кошелькам - используйте тип public
$ curl -H "Authorization: Bearer b48a991e-e010-4329-9817-f8389a774c45" https://sandbox.wallet.best/v1/payments/templates
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 2370,
"unseen_payments": 1
}
},
"data": [
{
"id": "54d23418a60ad674680041bd",
"name": "aloha",
"type": "public",
"amount": {
"value": 1000,
"disabled": false
},
"service": {
"id": 1690,
"name": "ТСЖ Монолит-престиж",
"icon_url": null,
"limit": "",
"minsum": 1,
"maxsum": 15000,
"verification_required": false,
"params": [
{
"id": "address",
"is_disabled": false,
"is_hidden": false,
"is_required": true,
"min_length": 3,
"max_length": 255,
"range_start": 0,
"range_end": 0,
"patterns": [
{
"pattern": "",
"description": ""
}
],
"pattern": "",
"pattern_desc": "Введите ваш домашний адрес",
"type": "string",
"title": "Адрес",
"default_value": null,
"suggested_values": [],
"items": null,
"value": "Мухосранск, ул. Выбитых окон, дом 1"
},
...
],
"category": {
"id": "549c92fb56c35f660ecd341f",
"name": "Коммунальные услуги",
"group": "",
"icon_url_32x32": ""
"amount": 3
}
}
},
...
]
}
Получения шаблона по id
$ curl -H "Authorization: Bearer b48a991e-e010-4329-9817-f8389a774c45"
https://sandbox.wallet.best/v1/payments/templates/5422dd02b7f47b52010041a9
{
"meta": {
"code": 200,
"urgent_data": {
"amount": 2370,
"unseen_payments": 1
}
},
"data": {
"id": "54d23587a60ad674680041be",
"name": "",
"type": "",
"amount": {
"value": 0,
"disabled": false
},
"service": {
"id": 0,
"name": "ЖКУ Москва",
"icon_url": null,
"limit": "",
"minsum": 1,
"maxsum": 15000,
"verification_required": false,
"params": [
{
"id": "126",
"is_disabled": false,
"is_hidden": false,
"is_required": false,
"min_length": 3,
"max_length": 250,
"range_start": 0,
"range_end": 0,
"patterns": [
{
"pattern": "",
"description": ""
}
],
"pattern": "",
"pattern_desc": "от 3 до 250 символов",
"type": "string",
"title": "Адрес проживания",
"default_value": null,
"suggested_values": [],
"items": null,
"value": ""
},
...
]
}
}
}
Изменение шаблона
$ curl -H "Authorization: Bearer b48a991e-e010-4329-9817-f8389a774c45" -H 'Content-type:application/json'
-d '{"name": "Template", "amount": 350, "type": "public", "service_id": 1000,
"params": {"phoneNumber": "+380509990088"}, "disabled": ["phoneNumber"]}'
https://sandbox.wallet.best/v1/payments/templates/5422dd02b7f47b52010041a9
{
"meta": {
"code": 200
}
}
Удаление шаблона
Удалить можно только свои шаблоны
shell
$ curl -H "Authorization: Bearer b48a991e-e010-4329-9817-f8389a774c45" -X DELETE
https://sandbox.wallet.best/v1/payments/templates/5422dd02b7f47b52010041a9
{
"meta": {
"code": 200
}
}
CRON таски для прода
Описание |
---|
0 3 * * * /www/mbank.api/vendor/bin/pake -f /www/mbank.api/pakefile.php wallet_intersecting_contacts |
45 12 * * * /www/mbank.api/vendor/bin/pake -f /www/mbank.api/pakefile.php apns_feedback |
* * * * * /www/mbank.api/vendor/bin/drunken do –config=“/www/mbank.api/drunken.config.php” |
30 10-21 * * * /www/mbank.api/vendor/bin/pake -f /www/mbank.api/pakefile.php sync_mserver_services |
10 * * * * /www/mbank.api/vendor/bin/pake -f /www/mbank.api/pakefile.php aggregate_services_statistics |
2 * * * * /bin/bash /www/mbank.api/bin/image-optim.sh |
0 12 * * * /www/mbank.api/vendor/bin/pake -f /www/mbank.api/pakefile.php send_daily_transaction_log |
0 13 1 * * /www/mbank.api/vendor/bin/pake -f /www/mbank.api/pakefile.php send_monthly_transaction_log |