| Версия | Дата | Предмет изменений |
|---|---|---|
| 3.01 | 22-02-2018 | Первый выпуск документа |
| 3.02 | 19-03-2018 | Добавлена возможность прикреплять файлы к сделке и просматривать их |
| 3.03 | 27-03-2018 | Изменен текст ошибок,метод оплаты комиссии,запрос для выплаты продавцу, метод отмены, метод открытия претензии. Добавлена возможность оплаты доставки через сервис (Эквайринг за доставку). Добавлен метод расчета стоимости комиссии SafeCrow, стоимости доставки и отмены. |
| 3.04 | 11-04-2018 | Добавлена функция преавторизации платежей в разделе "Дополнительные возможности". |
| 3.05 | 13-02-2019 | Добавлена функция удаления банковской карты. |
| 3.06 | 26-02-2019 | Добавлена информация поиска пользователя по номеру телефона. |
| 3.07 | 18-06-2019 | Добавлена информация по работе с юридическими лицами. |
| 3.08 | 26-06-2019 | Добавлена информация по отправке уведомлений при работе с юридическими лицами. |
| 3.09 | 24-07-2019 | Добавлена информация по работе с нерезидентами РФ. |
- Введение
- Бизнес–процесс
- Авторизация
- Регистрация пользователя
- Посмотреть список пользователей
- Посмотреть данные пользователя
- Редактировать данные пользователя
- Расчет стоимости комиссии SafeCrow
- Создание сделки
- Просмотр сделок
- Аннулирование сделки
- Оплата сделки
- Оплата сделки (для юр.лиц)
- Привязать банковскую карточку к пользователю
- Посмотреть привязанные к пользователю карты
- Привязать карту к сделке
- Удалить карту
- Привязать банковский счет к пользователю (для юр.лиц)
- Привязать банковский счет в банке-респонденте к счету в банке-корреспонденте (или наоборот)
- Посмотреть привязанные к пользователю банковские счета
- Посмотреть список счетов респондентов/корреспондентов
- Привязать счет к сделке
- Удалить банковский счет
- Отменить сделку
- Закрыть сделку
- Эскалировать сделку/открыть претензию
- Добавить вложение (Attachments)
- Просмотреть вложения
- Подтверждение получения товара (для юр.лиц)
- Отправка закрывающих документов (для юр.лиц)
- Настройки
- Другие ошибки
API SafeCrow V3 – это набор инструментов, которые позволяют использовать сервис и технологии SafeCrow в ваших проектах. Документ состоит из двух частей:
- Основная часть
- Дополнительные возможности
В основной части документа описан функционал SafeCrow.
Для того, чтобы получить доступ к функционалу, который описан во второй части, необходимо обратиться к вашему менеджеру и заключить договор на дополнительные услуги.
Важная информация! При интеграции API SafeCrow ваши пользователи должны принять оферту SafeCrow, которая расположена по адресу: https://www.safecrow.ru/term . Оферта должна быть принята пользователями до момента оплаты.
Все суммы в коде указаны в копейках.
Последовательность шагов для создания и проведения сделки изображена на рис. 1.
Важно! Данный процесс изменился по сравнению с версий v1.
В API V3 авторизация сделана прозрачной, в основе нее http basic auth и hmac подписи.
В качестве логина надо использовать api-key, в качестве пароля hmac подпись тела запроса ключом api-secret.
Пример запроса на Python, PHP и Ruby содежатся в репозитории.
Для создания/регистрации пользователя следует использовать запрос POST /users и указать следующие переменные:
| Переменные | Данные | Примечание |
|---|---|---|
| Обязательные | ||
| name | Имя Фамилия | |
| phone | Номер мобильного телефона | Можно не указывать, если указан email |
| e-mail пользователя | Можно не указывать, если указан телефон | |
| inn | ИНН | Только для юр. лиц |
| ogrn | ОГРН | Только для юр. лиц резидентов РФ |
| legal_address | Юр. адрес | Только для юр. лиц |
| physical_address | Физ. адрес | Только для юр. лиц |
| Опциональные | ||
| business | Юр. лицо? | true || [false] |
| kpp | КПП | Только для юр. лиц |
| ceo_name | ФИО руководителя | Только для юр. лиц |
| ceo_position | Должность руководителя | Только для юр. лиц |
| warrant | Основание для действия | Только для юр. лиц |
| contact_name | ФИО контактного лица | Только для юр. лиц |
| contact_position | Должность контактного лица | Только для юр. лиц |
| origin | Страна, формат ISO 3166-2 | Только для юр. лиц, если не указано = 'RU' |
Пример запроса
POST /users
{
"email": "[email protected]",
"phone": "79998887777",
"name": "Иван Иванов"
}Пример запроса для юридического лица
POST /users
{
"email": "[email protected]",
"phone": "79998887777",
"name": "Иван Иванов",
"business": true,
"inn": "1234567890",
"ogrn": "12345677890123",
"legal_address": "г.Москва, ул. Международная, д.1",
"physical_address": "г.Москва, ул. Международная, д.1"
}Примечание: ИНН проверяется не только на наличие и длину поля, но и на то, корректно ли он сформирован.
Пример ответа
{
"id": 467,
"email": "[email protected]",
"phone": "79998887777",
"name": "Иван Иванов",
"registered_at": "2018-02-05T12:17:01+03:00",
"origin": "RU"
}Пример ответа для юридического лица
{
"id": 467,
"email": "[email protected]",
"phone": "79998887777",
"name": "Иван Иванов",
"props": {
"inn": "1234567890",
"ogrn": "12345677890123",
"legal_address": "г.Москва, ул. Международная, д.1",
"physical_address": "г.Москва, ул. Международная, д.1"
},
"registered_at": "2018-02-05T12:17:01+03:00",
"origin": "RU"
}Создан пользователь 467, 5 февраля 2018 в 12:17
Пример
{
"errors": [
{ "name": "required field" },
{ "email": "user with email [email protected] and/or phone 79251234567 already exists" }
]
}“required field” - ошибка в обязательном поле. Поле либо не было передано, либо содержит ошибку.
Для просмотра зарегистрированных пользователей достаточно ввести следующий запрос:
Пример запроса
GET /usersДля поиска пользователя по email к запросу нужно добавть параметр email
Пример запроса
GET /[email protected]Для поиска пользователя по телефону к запросу нужно добавть параметр phone
Пример запроса
GET /users?phone=79998887777Пример ответа
{
"id": 467,
"email": "[email protected]",
"phone": "79998887777",
"name": "Вася Васильев",
"registered_at": "2018-02-05T12:17:01+03:00",
"origin": "RU"
}Для просмотра данных пользователя, используйте запрос: GET /users/:user_id
Пример запроса
GET /users/467Пример ответа
{
"id": 467,
"email": "[email protected]",
"phone": "79998887777",
"name": "Вася Васильев",
"registered_at": "2018-02-05T12:17:01+03:00",
"origin": "RU"
}Редактировать и добавить данные пользователю можно используя запрос POST /users/:user_id. Можно изменить следующие переменные:
| Переменные | Данные |
|---|---|
| Обязательные | |
| e-mail пользователя | |
| name | Имя Фамилия |
| phone | номер мобильного телефона |
Пример запроса
POST /users/467
{
"phone": "79998887777",
"name": "Иван Васильев"
}Пример ответа
{
"id": 467,
"email": "[email protected]",
"phone": "79998887777",
"name": "Иван Васильев",
"registered_at": "2018-02-05T12:17:01+03:00",
"origin": "RU"
}У пользователя 467 были изменены телефон и имя.
Пример запроса для юр.лица
POST /users/467
{
"name": "Иван Васильев",
"inn": "3664069397"
}Пример ответа для юр.лица
{
"id": 468,
"email": "[email protected]",
"phone": "79998887777",
"name": "Иван Васильев",
"registered_at": "2018-02-05T12:17:01+03:00",
"props": {
"inn": "3664069397",
"ogrn": "1234215145134",
"legal_address": "Moscow",
"physical_address": "Moscow"
},
"origin": "RU"
}У пользователя 468 был изменен ИНН.
Примечание: нельзя обновить заполненное поле на пустое.
Для расчета стоимости комиссии SafeCrow используйте POST /calculate.
Поле consumer_cancellation_cost входит в разряд дополнительных возможностей и требует отдельного договора. Данное поле предоставляет возможность оштрафовать Покупателя за отмену, по вашему желанию. Например, если товар уже ушел от Продавца Покупателю, оштрафовать Покупателя на стоимость обратной доставки.
Поле with_foreign позволяется при расчете комиссии учитывать ставку партнера при работе с нерезидентами РФ.
| Переменные | Данные |
|---|---|
| price | стоимость сделки, в копейках |
| service_cost_payer | “50/50” или “consumer” или “supplier” |
| Второстепенные | |
| consumer_cancellation_cost | штраф покупателя за отмену. сумма в копейках |
| with_foreign | Как минимум одна из сторон сделки - нерезидент РФ [true\false] |
Пример запроса
POST /calculate
{
"price":100000,
"service_cost_payer":"50/50",
"consumer_cancellation_cost": 0
}Пример ответа
{
"price":100000,
"supplier_service_cost":2000,
"consumer_service_cost":2000,
"consumer_cancellation_cost": 0
}Для создания сделки следует использовать POST /orders и указать следующие переменные:
Поле with_foreign позволяется при расчете комиссии учитывать ставку партнера при работе с нерезидентами РФ.
| Переменные | Данные |
|---|---|
| Обязательные | |
| consumer_id | integer |
| supplier_id | integer |
| price | integer (в копейках, минимум 100 руб (10000)) |
| description | string |
| service_cost_payer | “50/50” или “consumer” или “supplier” |
| Второстепенные | |
| extra | ассоциативный массив - дополнительная информация |
| with_foreign | Как минимум одна из сторон сделки - нерезидент РФ (true\false) |
Пример запроса
POST /orders
{
"consumer_id": 467,
"supplier_id": 466,
"price": 10000,
"description":"something",
"service_cost_payer":"50/50"
}Пример ответа
{
"id": 37606,
"consumer_id": 467,
"supplier_id": 466,
"price": 10000,
"consumer_payment_method_type": "CreditCard",
"consumer_payout_method_id": null,
"supplier_payout_method_id": null,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"status": "pending",
"description": "something",
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T14:35:08+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}Примечание: для юр. лиц в ответе поля *_payment_method_type и *_payout_method_type будут иметь значение BankAccount
Была создана сделка 29, стоимость сделки 100 рублей, комиссия составляет 4 рубля и платится пользователями пополам. В этот момент статус сделки становится “pending”.
"extra": "Некорректный тип данных" - должен передаваться ассоциативный массив ключ-значение
Посмотреть данные всех сделок - GET /orders
Посмотреть сделку по id - GET /orders/:order_id
Посмотреть данные сделок конкретного пользователя по его id - GET /users/:user_id/orders
Пример запроса
GET /users/467/ordersПример ответа
[
{
"id": 30,
"description": "something",
"price": 10000,
"supplier_id": 467,
"consumer_id": 466,
"status": "preauthorized",
"consumer_payout_method_id": null,
"supplier_payout_method_id": 28198,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "CreditCard",
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T16:40:40+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}
]В ответ на запрос придет список всех сделок, в которых участвовал пользователь. В данном примере к пользователю привязана одна сделка.
Аннулирование возможно только до проведения оплаты по сделке.
Для аннулирования активной сделки используется запрос POST /orders/:order_id/annul и данные:
| Переменные | Данные |
|---|---|
| Обязательные | |
| reason | string |
Пример запроса
POST /orders/31/annul
{
"reason": "Some reason"
}Пример ответа
{
"id": 30,
"description": "something",
"price": 10000,
"supplier_id": 467,
"consumer_id": 466,
"status": "annulled",
"consumer_payout_method_id": null,
"supplier_payout_method_id": 28198,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "CreditCard",
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T16:40:40+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}Для оплаты сделки в запросе указывается номер (id) сделки, которая будет оплачена Покупателем (consumer) - POST /orders/:order_id/pay.
Также необходимым полем является переменная redirect_url - ссылка на страницу, куда будет направлен пользователь после оплаты.
| Переменные | Данные |
|---|---|
| Обязательные | |
| redirect_url | cсылка (String) |
Для проведения тестовых оплат используйте тестовые карточки шлюза “MandarinPay”:
| Параметры | Значение | Комментарий |
|---|---|---|
| Номер карты | 4929509947106878 | Для имитации успешных транзакций без 3DSecure |
| Номер карты | 4692065455989192 | Для имитации успешных транзакций с 3DSecure |
| Номер карты | 4485913187374384 | Для имитации неуспешных транзакций без 3DSecure |
| Номер карты | 4556058936309366 | Для имитации неуспешных транзакций с 3DSecure |
| Имя держателя карты | CARD HOLDER | |
| Срок действия | Любой валидный | Минимально - выбрать месяц, следующий за текущим |
| CVV | 123 |
Далее пример запроса на оплату ранее созданной сделки 29 и получения в ответ ссылки на оплату.
Пример запроса
POST /orders/29/pay
{
"redirect_url": "http://example.com/return/url"
}Пример ответа
{
"payment_url": "https://secure.mandarinpay.com/f/rcl1/?operationId=transaction_e0db10aecacc44ea9fbc1dd335a94a70&locale=en",
"consumer_pay": 102000
}В ответе по ссылке осуществляется оплата, после чего происходит редирект на указанный в запросе url, к которому добавляются параметры:
| Параметры | Данные |
|---|---|
| orderId | id сделки + _ + случайное число (11_a43234) |
| status | success или failed |
| type | pay |
Пример ссылки
http://example.com/return/url?orderId=29_a44298&status=success&type=pay
Cтатус сделки изменится на paid.
Для оплаты сделки в запросе указывается номер (id) сделки, которая будет оплачена Покупателем (consumer) - POST /orders/:order_id/pay.
Пример ответа
{
"pdf": "https://staging.safecrow.ru/static/payments/37610/order-37610.pdf",
"consumer_pay": 1050000
}В ответе по ссылке находится платежный документ в формате PDF.
При подтверждении оплаты партнеру по зарегистрированному callback_url уходит уведомление
Пример уведомления
{
"id": 468,
"status": "paid"
}Для привязки карты используйте запрос - POST /users/:user_id/cards
| Переменные | Данные |
|---|---|
| redirect_url | ссылка (String) |
Пример запроса
POST /users/467/cards
{
"redirect_url": "http://example.com/return/url"
}Пример ответа
{
"redirect_url": "https://safecrow.ru/finances/card_binding/467?jsOperationId
=binding_5ae972a2-e5bb-4913-83a1-ac7408e30f54&return_to="
}В ответ приходит ссылка на заполнение данных банковской карты.
Сообщения об ошибках:
"phone": [ "Can not be empty!" ] - к пользователю должен быть привязан телефонный номер (привязать, изменив данные пользователя)
После заполнения данных карты, она привязывается к пользователю, список всех привязанных карт, включая неудачные попытки можно узнать, используя GET /users/:user_id/cards?all=true
Для просмотра всех банковских карт, подтвержденных мандарином GET /users/:user_id/cards
Пример запроса
GET /users/467/cardsПример ответа
[
{
"id": 179,
"card_holder": "CARD HOLDER",
"card_number": "492950XXXXXX6878",
"expires": "10/20",
"bound_at": "2018-02-06T16:46:22+03:00",
}
]Если карта не была привязана - в ответ придет пустой список.
Для выплаты продавцу (supplier) будет использована одна из ранее привязанных к нему карт, к запросу POST /users/:user_id/orders/:order_id требуется добавить переменную id карты – узнать id.
Пример запроса
POST /users/466/orders/29
{
"supplier_payout_card_id": 467
}Пример ответа
{
"id": 467,
"description": "something",
"price": 10000,
"supplier_id": 98918,
"consumer_id": 98917,
"status": "paid",
"consumer_payout_method_id": null,
"supplier_payout_method_id": 28198,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "CreditCard",
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T16:40:40+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}Ответ - описание сделки, в полях supplier_payout_method_id и type указана информация соответственно об id карты и типе выплаты.
Для удаления карты необходимо обратиться к /users/:user_id/cards/:card_id/delete
Пример запроса
POST /users/466/cards/123/deleteПример ответа
{
"id": 467,
"result": "deleted"
}Для привязки счета используйте запрос - POST /users/:user_id/accounts
| Переменные | Данные | Примечание |
|---|---|---|
| account | Р/С | необязательно для счета банка корреспондента |
| corr_account | К/С | |
| bik | БИК | |
| bank_name | Название банка | |
| origin | Страна, формат ISO 3166-2 | если не указано = 'RU' |
Пример запроса
POST /users/467/accounts
{
"account": "XXXXXXXXXXXXXXXXXXXX",
"corr_account": "XXXXXXXXXXXXXXXXXXXX",
"bik": "XXXXXXXX",
"bank_name": "АО СБЕРБАНК"
}Пример ответа
{
"id": 456,
"account": "XXXXXXXXXXXXXXXXXXXX",
"corr_account": "XXXXXXXXXXXXXXXXXXXX",
"bik": "XXXXXXXX",
"bank_name": "АО СБЕРБАНК",
"origin": "RU"
}Примечание: Номера счетов банков РФ проверяются на правильность формирование по БИК
Для привязки используйте запрос - POST /users/:user_id/accounts/account_id
| Переменные | Данные |
|---|---|
| relation | Роль банка который привязывается, 'respondent' или 'correspondent' |
| account_id | ID счета который привязывается |
Пример запроса
POST /users/467/accounts/123
{
"relation": "respondent",
"account_id": 122
}Пример ответа
{
"id": 122,
"account": "XXXXXXXXXXXXXXXXXXXX",
"corr_account": "XXXXXXXXXXXXXXXXXXXX",
"bik": "XXXXXXXX",
"bank_name": "Нурбанк",
"origin": "KZ"
}К корреспонденту (id = 123) привязывается респондент (id = 122)
Для респондентов GET /users/:user_id/accounts/:account_id/respondents
Для корреспондентов GET /users/:user_id/accounts/:account_id/correspondents
Пример запроса
GET /users/467/accounts/122/correspondentsПример ответа
[
{
"id": 123,
"account": "XXXXXXXXXXXXXXXXXXXX",
"corr_account": "XXXXXXXXXXXXXXXXXXXX",
"bik": "XXXXXXXX",
"bank_name": "АО СБЕРБАНК",
"origin": "RU"
}
]Список всех привязанных счетов можно узнать, используя GET /users/:user_id/accounts
Пример запроса
GET /users/467/accountsПример ответа
[
{
"id": 456,
"account": "XXXXXXXXXXXXXXXXXXXX",
"corr_account": "XXXXXXXXXXXXXXXXXXXX",
"bik": "XXXXXXXX",
"bank_name": "АО СБЕРБАНК",
"origin": "RU"
}
]Если счетов не было привязано - в ответ придет пустой список.
Для привязки участнику сделки будет использован один из ранее привязанных к нему счетов, к запросу POST /users/:user_id/orders/:order_id требуется добавить переменную id счета – узнать id.
Примечание:
Перед привязкой счета в банке-нерезиденте РФ нужно предварительно привязать его в качестве респондента к соответствующему банку-корреспонденту РФ.
Пример запроса
POST /users/466/orders/29
{
"account_id": 2628
}Пример ответа
{
"id": 37610,
"description": "something",
"price": 1000000,
"supplier_id": 98921,
"consumer_id": 98920,
"status": "pending",
"created_at": "2019-06-18T14:16:56+03:00",
"updated_at": "2019-06-18T14:37:21+03:00",
"consumer_payout_method_id": 2628,
"supplier_payout_method_id": null,
"consumer_payout_method_type": "BankAccount",
"supplier_payout_method_type": "BankAccount",
"consumer_service_cost": 50000,
"supplier_service_cost": 50000,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "BankAccount",
"consumer_payment_method_id": null,
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
},
}Ответ - описание сделки, в полях consumer_payout_method_id и type указана информация соответственно об id счета и типе выплаты.
Если счет какой-либо стороны открыт в банке-нерезиденте РФ, то данные об оплате/выплате будут в соответсвующих полях foreign_*.
Пример ответа, если счет продавца открыт в банке-нерезиденте РФ
{
"id": 37610,
"description": "something",
"price": 1000000,
"supplier_id": 98921,
"consumer_id": 98920,
"status": "pending",
"created_at": "2019-06-18T14:16:56+03:00",
"updated_at": "2019-06-18T14:37:21+03:00",
"consumer_payout_method_id": 2628,
"supplier_payout_method_id": null,
"consumer_payout_method_type": "BankAccount",
"supplier_payout_method_type": null,
"consumer_service_cost": 50000,
"supplier_service_cost": 50000,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "BankAccount",
"consumer_payment_method_id": null,
"foreign_supplier_payout_method_id": 3739,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": "BankAccount",
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
},
}Для удаления счета необходимо обратиться к /users/:user_id/accounts/:account_id/delete
Пример запроса
POST /users/466/accounts/2628/deleteПример ответа
{
"id": "2628",
"result": "deleted"
}Отмена производится в том случае, если оплата по сделке уже прошла, в ином случае производится Аннулирование сделки.
Обратите внимание, что при отмене сделки вся комиссия сервиса списывается с покупателя (consumer).
Сделку можно отменить, используя следующий запрос:
POST /orders/:order_id/cancel
| Переменные | Данные |
|---|---|
| reason | String |
Пример запроса
POST /orders/51/cancel
{
"reason": "Some important reason"
}Пример ответа
{
"id": 467,
"description": "something",
"price": 10000,
"supplier_id": 98918,
"consumer_id": 98917,
"status": "cancelled",
"consumer_payout_method_id": null,
"supplier_payout_method_id": 28198,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "CreditCard",
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T16:40:40+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}Сделка переходит в статус - отмена (cancelled). Покупателю возвращается сумма оплаты - 100 рубля.
Партнеру по зарегистрированному callback_url уходит уведомление
Пример уведомления если сделка была в статусе paid
{
"id": 468,
"status": "cancelled"
}Пример уведомления если сделка была в статусе pending
{
"id": 468,
"status": "annulled"
}Успешное завершение сделки - POST /orders/:order_id/close
| Переменные | Данные |
|---|---|
| reason | String, причина закрытия |
| discount | размер скидки (в копейках) |
В случае, если пользователи договорились о скидке, то в поле Discount указывается размер скидки в копейках. Сумма из поля Discount будет вычтена из суммы выплаты Продавцу.
Пример запроса
POST /orders/30/closeПример ответа
{
"id": 467,
"description": "something",
"price": 10000,
"supplier_id": 98918,
"consumer_id": 98917,
"status": "closed",
"consumer_payout_method_id": null,
"supplier_payout_method_id": 28198,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "CreditCard",
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T16:40:40+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}Сделка завершена (status: closed). Затем на карту продавца (id 180) SafeCrow переведет сумму сделки.
Сообщения об ошибках: "errors":[ "discount is too big" ] - выплата Продавцу менее 100 рублей
По факту получения выписки о платеже в сторону Исполнителя, происходит закрытие сделки на стороне Safecrow.
При этом партнеру по зарегистрированному callback_url уходит уведомление
Пример уведомления
{
"id": 468,
"status": "closed"
}Если покупатель недоволен качеством товара, сделка передается специалистам SafeCrow - POST /orders/:order_id/escalate
Следует указать причину reason (String)
| Переменные | Данные |
|---|---|
| reason | string |
Пример запроса
POST /orders/32/escalate
{
"reason": "Some important reason"
}Пример ответа
{
"id": 467,
"description": "something",
"price": 10000,
"supplier_id": 98918,
"consumer_id": 98917,
"status": "escalated",
"consumer_payout_method_id": null,
"supplier_payout_method_id": 28198,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "CreditCard",
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T16:40:40+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}Сделка переходит в статус "escalated", специалисты сэйфкроу разрешают претензию, после чего сделка закрывается (status: closed) или отменяется (status: canceled)
Для добавления вложений используется POST /orders/:order_id/attachments, а также переменные:
| Переменные | Данные |
|---|---|
| type | “text”, “image” |
| body | ассоциативный массив 1. “text” (JSON) - текст вложения 2.“file”(формат base64) - зашифрованная картинка “file_name” - имя файла c расширением (.ico .jpg .png .pdf) |
| user_id | id пользователя, от имени которого прикрепляется вложение |
Пример запросов Запрос на создание текстового вложения
POST /orders/44/attachments
{
"type": "text",
"body": {"text": "there is some text"},
"user_id": 467
}Запрос на создание .jpg .png вложения
POST /orders/44/attachments
{
"type": "image",
"body": {
"file": "AAABAAEAE...A==",
"file_name": "File.png"
},
"user_id": 467
}Запрос на создание .pdf вложения
POST /orders/44/attachments
{
"type": "pdf",
"body": {
"file": "AAABAAEAE...A==",
"file_name": "doc.pdf"
},
"user_id": 467
}Пример ответов
{
"id": 2,
"user_id": 467,
"type": "text",
"body": "{\"text\":\"there is some text\"}",
"send_at": "2018-02-26T11:14:15+03:00"
},
{
"id": 3,
"user_id": 467,
"type": "image",
"body": "{\"file_path\":\"https://dev.safecrow.ru/static/trans_attachments/44/File.png\",\"file_name\":\"File.png\"}",
"send_at": "2018-02-26T12:01:14+03:00"
},
{
"id": 4,
"user_id": 467,
"type": "pdf",
"body": "{\"file_path\":\"https://dev.safecrow.ru/static/trans_attachments/44/doc.pdf\",\"file_name\":\"doc.pdf\"}",
"send_at": "2018-02-26T12:01:14+03:00"
}Для просмотра всех вложений конкретной сделки GET /orders/:order_id/attachments
Пример запроса
GET /orders/44/attachmentsПример ответа
{
"id": 2,
"user_id": 467,
"type": "text",
"body": "{\"text\":\"there is some text\"}",
"send_at": "2018-02-26T11:14:15+03:00"
},
{
"id": 3,
"user_id": 467,
"type": "image",
"body": "{\"file_path\":\"https://dev.safecrow.ru/static/trans_attachments/44/File.png\",\"file_name\" :\"File.png\"}",
"send_at": "2018-02-26T12:01:14+03:00"
},
{
"id": 4,
"user_id": 467,
"type": "pdf",
"body": "{\"file_path\":\"https://dev.safecrow.ru/static/trans_attachments/44/doc.pdf\",\"file_name\":\"doc.pdf\"}",
"send_at": "2018-02-26T12:01:14+03:00"
}Запрос для подтверждения получения товара - POST /orders/:id/approve
| Переменные | Данные |
|---|---|
| status | 'approved' |
Пример запроса
POST /orders/37610/approve
{
"status": "approved"
}Пример ответа
{
"id": 37610,
"description": "something",
"price": 1000000,
"supplier_id": 98921,
"consumer_id": 98920,
"status": "paid",
"created_at": "2019-06-18T14:16:56+03:00",
"updated_at": "2019-06-18T14:37:21+03:00",
"consumer_payout_method_id": 2628,
"supplier_payout_method_id": null,
"consumer_payout_method_type": "BankAccount",
"supplier_payout_method_type": "BankAccount",
"consumer_service_cost": 50000,
"supplier_service_cost": 50000,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "BankAccount",
"consumer_payment_method_id": null,
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
},
}Примечание: Статус сделки в ответе должен быть paid - "status": "paid".
Для выплаты продавцу, к сделке должны быть приложены закрывающие документы в формате base64
POST /orders/:id/closing_docs
| Переменные | Данные |
|---|---|
| deal-docs | Товаросопроводительные документы |
| delivery-docs | Товаротранспортные документы |
Пример запроса
POST /orders/42/closing_docs
{
"deal-docs": [
{"document": "base64", "name": "Товаросопроводительный документ 1"}
],
"delivery-docs": [
{"document": "base64", "name": "Товаротранспортный документ 1"}
]
}Пример ответа
[
{
"order_id": 37774,
"user_id": 99033,
"record_type": "zip",
"data": {"file_path":"https://staging.safecrow.ru/static/trans_attachments/37774/sdf.zip","file_name":"sdf.zip","doc_type":"deal-docs"},
"created_at": "2019-09-16T16:20:27+03:00"
},
{
"order_id": 37774,
"user_id": 99033,
"record_type": "pdf",
"data": {"file_path":"https://staging.safecrow.ru/static/trans_attachments/37774/sfg.pdf","file_name":"sfg.pdf","doc_type":"delivery-docs"},
"created_at": "2019-09-16T16:20:27+03:00"
}
]Настроить коллбек url POST /settings добавив переменную
| Переменные | Данные |
|---|---|
| callback_url | ссылка (String) |
Посмотреть настройки GET /settings
Пример запроса
POST /settings
{
"callback_url": "https://example.com/callback/url"
}По запросу коллбек приходит GET запросом, с параметрами status, orderId(id сделки + _ + случайное число (11_a43234) ) и price для аутентификации запроса используется хедер X-Auth
X-Auth содержит hmac, который считается следующим образом(callback_url - это полный request к серверу, его следует брать из переменных сервера):
hmac = OpenSSL::HMAC.hexdigest(‘SHA256’, api_secret, “#{api_key}-#{callback_url}“)
Пример на php:
$fullReqUrl = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"
$result = hash_hmac("SHA256", $apiKey . "-" . $fullReqUrl, $apiSecret);
“These aren't the droids you're looking for" - неправильный url
"Jim! She's gonna blow!\n id is a restricted primary key" - данные нельзя поменять
"Jim! She's gonna blow!\n Invalid filter expression: (message) - неправильный тип данных?
"Jim! She's gonna blow!\n undefined method '/' for \"11\":String" - тип данных
При создании сделки нужно дополнительно передать параметры:
| Переменные | Данные |
|---|---|
| delivery_cost | стоимость доставки |
| delivery_cost_payer | кто оплачивает доставку. consumer, supplier, 50/50. |
| user_id | id пользователя, от имени которого прикрепляется вложение |
После создания, в информации по сделке будут дополнительные поля
| Переменные | Данные |
|---|---|
| Обязательные | |
| supplier_delivery_cost | стоимость доставки для продавца.Будет вычтена из суммы сделки при выплате продавцу |
| consumer_delivery_cost | стоимость доставки для покупателя.Будет добавлена к сумме при оплате покупателем |
| Второстепенные | |
| consumer_cancellation_cost | штраф при отмене.Может вычитаться из суммы сделки, возвращаемой покупателю при отмене. Может использоваться как оплата обратной доставки при возврате товара, |
Для пользователя процесс преавторизации полностью аналогичен процессу оплаты.
При преавторизации у пользователя на карте блокируются денежные средства, необходимые для оплаты сделки, на срок - 3 дня.
В течение этого срока SafeCrow должен получить подтверждение или отмену преавторизации. На 4-ый день SafeCrow отменяет блокировку денежных средств на карте пользователя.
Для проведения преавторизации используйте запрос: POST /orders/:order_id/preauth
Пример запроса:
POST /orders/:order_id/preauth
{
"redirect_url": "http://example.com/redirect/url"
}Для проведения тестовых оплат используйте тестовые карточки шлюза “MandarinPay”.
При выполнении преавторизации сделка переходит в статус preauthorized
| Переменные | Данные |
|---|---|
| Обязательные | |
| order_id | Id сделки, которая будет оплачена Покупателем (consumer) |
| redirect_url | ссылка на страницу, куда будет направлен пользователь после оплаты. |
Для оплаты сделки и списания денег с карты покупателя, преавторизованый платеж необходимо подтвердить.
При подтверждении преавторизации происходит списание денег с карты покупателя и сделка переходит в статус paid.
Пример запроса
POST /orders/:order_id/preauth/confirm
{
"reason": "Some reason"
}Пример ответа:
{
"id": 30,
"description": "something",
"price": 10000,
"supplier_id": 98918,
"consumer_id": 98917,
"status": "preauthorized",
"consumer_payout_method_id": null,
"supplier_payout_method_id": 28198,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "CreditCard",
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T16:40:40+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}Если сделка не была подтверждена - необходимо произвести отмену преавторизации. Статус сделки при этом меняется на pending.
Пример запроса
POST /orders/:order_id/preauth/release
{
"reason": "Some reason"
}Пример ответа
{
"id": 30,
"description": "something",
"price": 10000,
"supplier_id": 98918,
"consumer_id": 98917,
"status": "pending",
"consumer_payout_method_id": null,
"supplier_payout_method_id": 28198,
"consumer_payout_method_type": "CreditCard",
"supplier_payout_method_type": "CreditCard",
"consumer_service_cost": 500,
"supplier_service_cost": 500,
"consumer_delivery_cost": 0,
"supplier_delivery_cost": 0,
"consumer_cancellation_cost": 0,
"discount": 0,
"consumer_payment_method_type": "CreditCard",
"consumer_payment_method_id": null,
"created_at": "2019-06-17T14:35:08+03:00",
"updated_at": "2019-06-17T16:40:40+03:00",
"foreign_supplier_payout_method_id": null,
"foreign_consumer_payout_method_id": null,
"foreign_supplier_payout_method_type": null,
"foreign_consumer_payout_method_type": null,
"foreign_consumer_payment_method_type": null,
"foreign_consumer_payment_method_id": null,
"extra": {
}
}