P2P-счета
Чтобы подключить на свой сайт сервис приема p2p-переводов для физических лиц, вам необходим QIWI Кошелек со статусом идентификации Основной или Профессиональный. Если у вашего кошелька статус Анонимный, пройдите идентификацию удобным для вас способом:
- Для получения статуса Основной достаточно указать паспортные данные.
- Для получения статуса Профессиональный необходимо пройти очную идентификацию.
Рекомендуем сразу получить статус Профессиональный. Такой статус имеет повышенные лимиты на остаток на балансе, сумму платежей и переводов в месяц, максимальную сумму одной операции. Подробнее про лимиты.
Рекомендуем ознакомиться с частыми вопросами по нашему сервису, а также с информацией о том, как избежать блокировки кошелька.
Активация доступа к сервису
- Авторизуйтесь на p2p.qiwi.com
- Убедитесь, что вам доступно выставление счетов – в форме Выставить счет заполните поле Сумма и нажмите кнопку. Ниже должна появиться ссылка на счет и кнопка Скопировать ссылку
Поздравляем! Вы можете приступить к интеграции.
Как работать с сервисом
- Создайте публичный и секретный ключи. Подробнее см. в разделе Методы авторизации.
- Реализуйте взаимодействие через API или через вызов формы оплаты счета. Вы можете воспользоваться SDK или готовыми решениями для CMS.
- Для получения уведомлений после перевода по счету активируйте их отправку.
- Начните принимать платежи с банковских карт или c QIWI Кошельков.
Сценарий платежа
sequenceDiagram participant user as Пользователь participant rec as Получатель participant p2p as QIWI P2P API opt Основной сценарий user->>rec:Оформление заказа activate user activate rec alt Использование API rec->>p2p:Выставление счета p2p->>rec:Ссылка на платежную форму rec->>user:Перенаправление на платежную форму
oplata.qiwi.com end alt Использование платежной формы rec->>user:Выставление счета через форму
oplata.qiwi.com end deactivate rec user->>p2p:Выбор способа оплаты и подтверждение платежа deactivate user p2p->>p2p:Оплата счета end opt Дополнительный сценарий opt Уведомления (callback) activate p2p activate rec p2p->>rec:Уведомление об успешной оплате rec->>p2p:Уведомление принято deactivate rec deactivate p2p end opt Проверка статуса activate p2p activate rec rec->>p2p:Проверка статуса счета p2p->>rec:Информация о счете deactivate rec deactivate p2p end end
- Пользователь формирует счет на вашей стороне.
- Вы перенаправляете пользователя на платежную форму для выставления и оплаты счета в сервисе. Или выставляете счет по API и также перенаправляете пользователя на созданную платежную форму (ссылка на форму придет в ответе).
- Пользователь выбирает способ перевода и подтверждает перевод. По умолчанию на форме отображается оптимальный для пользователя способ перевода.
- После перевода по счету вы получите уведомление, если активировали отправку уведомлений. Уведомления о переводе по счету содержат цифровую подпись, которую необходимо проверять на вашем сервере.
Также через API вы можете:
- запросить текущий статус перевода по счету,
- отменить неиспользуемый счет.
SDK и библиотеки
- NODE JS SDK — Готовое решение для разработки server2server интеграции c помощью Node.js.
- PHP SDK — Готовое решение для разработки server2server интеграции c помощью PHP.
- Java SDK — Готовое решение для разработки server2server интеграции c помощью Java.
- .Net SDK — Готовое решение для разработки server2server интеграции c помощью C# .NET.
С руководством по работе с SDK можно ознакомиться здесь.
Решения для CMS
- Онлайн Лейка — WordPress расширение для благотворительности.
- 1С-Битрикс — решение для работы с заказами.
- Opencart — решение для работы с заказами.
- PrestaShop — решение для работы с заказами.
Методы авторизации в сервисе
Мы остановили выпуск новых ключей для авторизации. Простите за доставленные неудобства.
const QiwiBillPaymentsAPI = require('@qiwi/bill-payments-node-js-sdk'); const SECRET_KEY = 'eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjUyNjgxMiwiYXBpX3VzZXJfaWQiOjcxNjI2MTk3LCJzZWNyZXQiOiJmZjBiZmJiM2UxYzc0MjY3YjIyZDIzOGYzMDBkNDhlYjhiNTnONPININONPN090MTg5Z**********************'; const qiwiApi = new QiwiBillPaymentsAPI(SECRET_KEY);
--header "Authorization: Bearer MjMyNDQxMjM6NDUzRmRnZDQ0M*******"
const SECRET_KEY = 'eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjUyNjgxMiwiYXBpX3VzZXJfaWQiOjcxNjI2MTk3LCJzZWNyZXQiOiJmZjBiZmJiM2UxYzc0MjY3YjIyZDIzOGYzMDBkNDhlYjhiNTnONPININONPN090MTg5Z**********************'; /** @var \Qiwi\Api\BillPayments $billPayments */ $billPayments = new Qiwi\Api\BillPayments(SECRET_KEY); ?>
String secretKey = "eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjUyNjgxMiwiYXBpX3VzZXJfaWQiOjcxNjI2MTk3LCJzZWNyZXQiOiJmZjBiZmJiM2UxYzc0MjY3YjIyZDIzOGYzMDBkNDhlYjhiNTnONPININONPN090MTg5Z**********************"; BillPaymentClient client = BillPaymentClientFactory.createDefault(secretKey);
var secretKey = "eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjUyNjgxMiwiYXBpX3VzZXJfaWQiOjcxNjI2MTk3LCJzZWNyZXQiOiJmZjBiZmJiM2UxYzc0MjY3YjIyZDIzOGYzMDBkNDhlYjhiNTnONPININONPN090MTg5Z**********************"; var client = BillPaymentClientFactory.createDefault(secretKey);
Для авторизации запросов вам понадобятся ключи:
- Секретный ключ — для авторизации запросов к API P2P-счетов по стандарту OAuth 2.0. Ключ указывается в заголовке HTTP-запроса Authorization: Bearer .
- Публичный ключ — для авторизации при выставлении счетов через форму.
Чтобы выпустить пару ключей и :
- Авторизуйтесь в личном кабинете https://p2p.qiwi.com/.
- Перейдите на вкладку API и нажмите кнопку Создать пару ключей и настроить. Если вы создаете пару ключей впервые, то нажмите кнопку Настроить.
- Укажите название для пары ключей и нажмите кнопку Создать.
- Сохраните секретный ключ в безопасном месте — в дальнейшем он не будет отображаться в интерфейсе. Публичный ключ вы всегда можете скопировать из Личного кабинета.
- Нажмите кнопку Дальше. Пара ключей будет активирована.
Не передавайте секретный ключ третьим лицам! При компрометации ключей необходимо перевыпустить их.
Вы можете использовать секретный ключ также для автоматизации платежных операций по QIWI Кошельку:
- выполнить перевод на кошелек;
- выполнить перевод на карту.
Мы остановили выпуск новых ключей. Простите за доставленные неудобства.
Выставление счета через форму
Этим способом доступно выставление счетов только в рублях. Для выставления счетов в тенге используйте API, SDK или решения для CMS. При открытии формы в webview на android обязательно включать settings.setDomStorageEnabled(true)
Простой способ для интеграции. При переходе на форму клиенту автоматически выставляется счет. Параметры счета передаются в открытом виде в ссылке. Далее клиенту отображается форма с выбором способа перевода.
При использовании этого способа нельзя гарантировать, что все счета выставлены вами, в отличие от выставления счета по API.
GET →
URL https://oplata.qiwi.com/create
const publicKey = 'Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******'; const params = publicKey, amount: 42.24, billId: 'cc961e8d-d4d6-4f02-b737-2297e51fb48e', email: 'mail@example.com' >; const link = qiwiApi.createPaymentForm(params);
curl https://oplata.qiwi.com/create?publicKey=Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******&amount=100&customFields[paySourcesFilter]=qw,card&lifetime=2020-12-01T0509
$publicKey = '2tbp1WQvsgQeziGY9vTLe9vDZNg7tmCymb4Lh6STQokqKrpCC6qrUUKEDZAJ7mvFnzr1yTebUiQaBLDnebLMMxL8nc6FF5zf******'; $params = [ 'publicKey' => $publicKey, 'amount' => 200, 'billId' => 'cc961e8d-d4d6-4f02-b737-2297e51fb48e' ]; /** @var \Qiwi\Api\BillPayments $billPayments */ $link = $billPayments->createPaymentForm($params); echo $link; ?>
String publicKey = "2tbp1WQvsgQeziGY9vTLe9vDZNg7tmCymb4Lh6STQokqKrpCC6qrUUKEDZAJ7mvFnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypdXCbQJqHEJW5RJmKfj8nvgc"; MoneyAmount amount = new MoneyAmount( BigDecimal.valueOf(499.90), Currency.getInstance("RUB") ); String billId = UUID.randomUUID().toString(); String paymentUrl = client.createPaymentForm(new PaymentInfo(key, amount, billId, ""));
var publicKey = "2tbp1WQvsgQeziGY9vTLe9vDZNg7tmCymb4Lh6STQokqKrpCC6qrUUKEDZAJ7mvFnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypdXCbQJqHEJW5RJmKfj8nvgc"; var amount = new MoneyAmount ValueDecimal = 499.9m, CurrencyEnum = CurrencyEnum.Rub >; var billId = Guid.NewGuid().ToString(); var paymentUrl = client.CreatePaymentForm(new PaymentInfo(key, amount, billId, ""));
Параметры
Параметр | Описание | Тип |
---|---|---|
publicKey | Обязательный параметр. Ваш публичный ключ для формы переводов, полученный на сайте p2p.qiwi.com | String |
billId | Идентификатор выставляемого счета в вашей системе. Он должен быть уникальным и генерироваться на вашей стороне любым способом. Идентификатором может быть любая уникальная последовательность букв или цифр. Также разрешено использование символа подчеркивания ( _ ) и дефиса ( — ). | String(200) |
amount | Сумма, на которую выставляется счет, округленная в меньшую сторону до 2 десятичных знаков | Number(6.2) |
phone | Номер телефона пользователя (в международном формате) | URL-Encoded String |
E-mail пользователя | URL-Encoded String | |
account | Идентификатор пользователя в вашей системе | URL-Encoded String |
comment | Комментарий к счету | URL-Encoded String(255) |
customFields[] | Дополнительные данные счета | URL-Encoded String(255) |
customFields[paySourcesFilter] | При открытии формы будут отображаться только указанные способы перевода, если они доступны. Возможные значения (можно указать все, через , ): qw — QIWI Кошелек, card — банковская карта, mobile — баланс телефона (телефон получателя будет виден отправителю). | URL-Encoded String |
customFields[themeCode] | Код персонализации вашей формы | String(255) |
lifetime | Дата, до которой счет будет доступен для перевода. Если перевод по счету не будет произведен до этой даты, ему присваивается финальный статус EXPIRED и последующий перевод станет невозможен. Внимание! По истечении 45 суток от даты выставления счет автоматически будет переведен в финальный статус | URL-Encoded String ГГГГ-ММ-ДДTччмм |
API P2P-счетов. Выставление счета
По оплаченным счетам возврат денежных средств не предусмотрен.
Доступно выставление счетов в рублях и тенге.
Надежный способ для интеграции. Параметры передаются server2server с использованием авторизации.
При успешном выполнении запроса в ответе вернется параметр payUrl — ссылка для перенаправления пользователя на форму оплаты. К ней вы можете добавить дополнительные параметры. Подробнее см. в разделе Форма для оплаты счета.
Рекомендуем воспользоваться SDK для интеграции.
Также существует более простой способ выставления счета — непосредственно через вызов платежной формы.
Для тестирования и отладки сервиса рекомендуем выставлять и оплачивать счета суммой 1 рубль.
Запрос → PUT
const billId = 'cc961e8d-d4d6-4f02-b737-2297e51fb48e'; const fields = amount: 1.00, currency: 'RUB', comment: 'Hello world', expirationDateTime: '2018-03-02T08:44:07+03:00' >; qiwiApi.createBill( billId, fields ).then( data => //do with data >);
curl --location \ --request PUT \ 'https://api.qiwi.com/partner/bill/v1/bills/cc961e8d-d4d6-4f02-b737-2297e51fb48e' \ --header 'content-type: application/json' \ --header 'accept: application/json' \ --header 'Authorization: Bearer ' \ --data-raw '< "amount": < "currency": "RUB", "value": "1.00" >, "comment": "Text comment", "expirationDateTime": "2025-12-10T09:02:00+03:00", "customer": < "phone": "78710009999", "email": "test@example.com", "account": "454678" >, "customFields" : < "paySourcesFilter":"qw", "themeCode": "Yvan-YKaSh", "yourParam1": "64728940", "yourParam2": "order 678" >>'
$billId = 'cc961e8d-d4d6-4f02-b737-2297e51fb48e'; $fields = [ 'amount' => 1.00, 'currency' => 'RUB', 'comment' => 'test', 'expirationDateTime' => '2018-03-02T08:44:07+03:00', 'email' => 'mail@example.org', 'account' => 'client4563' ]; /** @var \Qiwi\Api\BillPayments $billPayments */ $response = $billPayments->createBill($billId, $fields); print_r($response); ?>
CreateBillInfo billInfo = new CreateBillInfo( UUID.randomUUID().toString(), new MoneyAmount( BigDecimal.valueOf(199.90), Currency.getInstance("RUB") ), "comment", ZonedDateTime.now().plusDays(45), new Customer( "mail@example.org", UUID.randomUUID().toString(), "79123456789" ), "" ); BillResponse response = client.createBill(billInfo);
client.CreateBill( info: new CreateBillInfo BillId = Guid.NewGuid().ToString(), Amount = new MoneyAmount ValueDecimal = 199.9m, CurrencyEnum = CurrencyEnum.Rub >, Comment = "comment", ExpirationDateTime = DateTime.Now.AddDays(45), Customer = new Customer Email = "mail@example.org", Account = Guid.NewGuid().ToString(), Phone = "79123456789" >, CustomFields: new CustomFields ThemeCode = "кодСтиля" > > );
URL https://api.qiwi.com/partner/bill/v1/bills/
- billId — сгенерированный на вашей стороне любым способом идентификатор счета. Идентификатором может быть любая уникальная последовательность букв или цифр. Также разрешено использование символа подчеркивания (_) и дефиса (-).
HEADERS
- Authorization: Bearer SECRET_KEY
- Content-Type: application/json
- Accept: application/json
Параметр тела запроса | Описание | Тип |
---|---|---|
amount | Обязательный параметр. Информация о сумме счета | Object |
amount. value | Обязательный параметр. Сумма, на которую выставляется счет, округленная в меньшую сторону до 2 десятичных знаков | Number(6.2) |
amount. currency | Обязательный параметр. Валюта суммы счета. Возможные значения: RUB — рубли, KZT — тенге. | Alpha-3 ISO 4217 код |
expirationDateTime | Обязательный параметр. Дата, до которой счет будет доступен для оплаты. Если перевод не будет совершен до этой даты, ему присваивается финальный статус EXPIRED и последующий перевод станет невозможен. | ГГГГ-ММ-ДДTчч:мм:сс±чч:мм |
customer | Идентификаторы пользователя | Object |
customer. phone | Номер телефона пользователя (в международном формате) | String |
customer. | E-mail пользователя | String |
customer. account | Идентификатор пользователя в вашей системе | String |
comment | Комментарий к счету | String(255) |
customFields | Дополнительная информация о счете. Вы можете здесь передавать свои дополнительные поля с данными, например, SteamId | Object |
customFields. paySourcesFilter | Строка с разделителями-запятыми. При открытии формы будут отображаться только указанные способы перевода (один или несколько), если они доступны. Возможные значения: qw — QIWI Кошелек, card — банковская карта, mobile — баланс телефона (телефон получателя будет виден отправителю). | String |
customFields. themeCode | Код персонализации вашей формы | String(255) |
Ответ ←
"siteId": "9hh4jb-00", "billId": "cc961e8d-d4d6-4f02-b737-2297e51fb48e", "amount": "currency": "RUB", "value": "1.00" >, "status": "value": "WAITING", "changedDateTime": "2021-01-18T14:22:56.672+03:00" >, "customer": "phone": "78710009999", "email": "test@example.com", "account": "454678" >, "customFields": "paySourcesFilter": "qw", "themeCode": "Yvan-YKaSh", "yourParam1": "64728940", "yourParam2": "order 678" >, "comment": "Text comment", "creationDateTime": "2021-01-18T14:22:56.672+03:00", "expirationDateTime": "2025-12-10T09:02:00+03:00", "payUrl": "https://oplata.qiwi.com/form/?invoice_uid=aa0fa2bb-5452-47ca-9190-cd9c1a73718f" >
Пример тела ответа при ошибке
"serviceName": "invoicing-api", "errorCode": "http.message.conversion.failed", "description": "Bad request", "userMessage": "Bad request", "dateTime": "2021-01-18T14:29:51.984+03:00", "traceId": "8fa9cfe10c7f83d1" >
HEADERS
- Content-Type: application/json
Поле | Тип | Описание |
---|---|---|
siteId | String | Ваш идентификатор в сервисе приема платежей для физических лиц p2p.qiwi.com |
billId | String | Уникальный идентификатор счета в вашей системе, указанный при выставлении |
amount | Object | Информация о сумме счета |
amount. value | Number | Сумма счета, округленная до 2 знаков после запятой в меньшую сторону |
amount. currency | String | Валюта суммы счета (Alpha-3 ISO 4217 код) |
status | Object | Информация о статусе счета |
status. value | String | Текущий статус счета |
status. changedDateTime | String | Дата обновления статуса. Формат даты: ГГГГ-ММ-ДДTчч:мм:сс±чч:мм |
customFields | Object | Объект строковых дополнительных параметров. Возможные элементы: paySourcesFilter , themeCode |
customer | Object | Идентификаторы пользователя. Возможные элементы: email , phone , account |
comment | String | Комментарий к счету |
creationDateTime | String | Системная дата создания счета. Формат даты: ГГГГ-ММ-ДДTчч:мм:сс±чч:мм |
expirationDateTime | String | Срок действия созданной формы для перевода. Формат даты: ГГГГ-ММ-ДДTчч:мм:сс±чч:мм |
payUrl | String | Ссылка на созданную форму. Перенаправьте пользователя по этой ссылке для оплаты счета или используйте библиотеку Popup, чтобы открыть форму во всплывающем окне. |
API P2P-счетов. Проверка статуса перевода по счету
Рекомендуется использовать этот метод после получения уведомления о переводе.
Запрос → GET
const billId = 'cc961e8d-d4d6-4f02-b737-2297e51fb48e'; qiwiApi.getBillInfo(billId).then( data => //do smth with data >);
curl --location \ --request GET \ 'https://api.qiwi.com/partner/bill/v1/bills/cc961e8d-d4d6-4f02-b737-2297e51fb48e' \ --header 'accept: application/json' \ --header 'Authorization: Bearer '
$billId = 'cc961e8d-d4d6-4f02-b737-2297e51fb48e'; /** @var \Qiwi\Api\BillPayments $billPayments */ $response = $billPayments->getBillInfo($billId); print_r($response); ?>
String billId = "cc961e8d-d4d6-4f02-b737-2297e51fb48e"; BillResponse response = client.getBillInfo(billId);
var billId = "cc961e8d-d4d6-4f02-b737-2297e51fb48e"; var response = client.getBillInfo(billId);
URL https://api.qiwi.com/partner/bill/v1/bills/
- billId — уникальный идентификатор счета в вашей системе.
HEADERS
- Authorization: Bearer SECRET_KEY
- Accept: application/json
Ответ ←
"siteId": "9hh4jb-00", "billId": "cc961e8d-d4d6-4f02-b737-2297e51fb48e", "amount": "currency": "RUB", "value": "1.00" >, "status": "value": "WAITING", "changedDateTime": "2021-01-18T14:22:56.672+03:00" >, "customer": "email": "test@example.com", "phone": "78710009999", "account": "454678" >, "customFields": "paySourcesFilter": "qw", "themeCode": "Yvan-YKaSh", "yourParam1": "64728940", "yourParam2": "order 678" >, "comment": "Text comment", "creationDateTime": "2021-01-18T14:22:56.672+03:00", "expirationDateTime": "2025-12-10T09:02:00+03:00", "payUrl": "https://oplata.qiwi.com/form/?invoice_uid=aa0fa2bb-5452-47ca-9190-cd9c1a73718f" >
Пример тела ответа при ошибке
"serviceName": "invoicing-api", "errorCode": "api.invoice.not.found", "description": "Invoice not found", "userMessage": "Invoice not found", "dateTime": "2021-01-18T14:34:40.865+03:00", "traceId": "b3d41cafa0c6d088" >
HEADERS
- Content-Type: application/json
Поле | Тип | Описание |
---|---|---|
billId | String | Уникальный идентификатор счета в вашей системе, указанный при выставлении |
siteId | String | Ваш идентификатор в сервисе приема платежей для физических лиц p2p.qiwi.com |
amount | Object | Информация о сумме счета |
amount. value | Number | Сумма счета, округленная до 2 знаков после запятой в меньшую сторону. |
amount. currency | String | Идентификатор валюты суммы счета (Alpha-3 ISO 4217 код) |
status | Object | Информация о статусе счета |
status. value | String | Текущий статус счета |
status. changedDateTime | String | Дата обновления статуса |
customFields | Object | Объект строковых дополнительных параметров, переданных вами |
customer | Object | Идентификаторы пользователя |
customer. phone | String | Номер телефона (если был указан при выставлении счета) |
customer. | String | E-mail пользователя (если был указан при выставлении счета) |
customer. account | String | Идентификатор пользователя в вашей системе (если был указан при выставлении счета) |
comment | String | Комментарий к счету |
creationDateTime | String | Системная дата создания счета. Формат даты: ГГГГ-ММ-ДДTчч:мм:сс |
payUrl | String | Ссылка для переадресации пользователя на созданную форму |
expirationDateTime | String | Срок действия созданной формы для перевода. Формат даты: ГГГГ-ММ-ДДTчч:мм:сс±чч:мм |
API P2P-счетов. Отмена неоплаченного счета
Вы можете отменить счет, по которому не был выполнен перевод.
Запрос → POST
const bill_id = 'cc961e8d-d4d6-4f02-b737-2297e51fb48e'; qiwiApi.cancelBill(billId).then( data => //do with data >);
curl --location \ --request POST \ 'https://api.qiwi.com/partner/bill/v1/bills/cc961e8d-d4d6-4f02-b737-2297e51fb48e/reject' \ --header 'content-type: application/json' \ --header 'accept: application/json' \ --header 'Authorization: Bearer ' \ --data-raw ''
$billId = 'cc961e8d-d4d6-4f02-b737-2297e51fb48e'; /** @var \Qiwi\Api\BillPayments $billPayments */ $response = $billPayments->cancelBill($billId); print_r($response); ?>
String billId = "cc961e8d-d4d6-4f02-b737-2297e51fb48e"; BillResponse response = client.cancelBill(billId);
var billId = "cc961e8d-d4d6-4f02-b737-2297e51fb48e"; var response = client.cancelBill(billId);
URL https://api.qiwi.com/partner/bill/v1/bills//reject
- Параметры:
- billId — уникальный идентификатор счета в вашей системе.
HEADERS
- Authorization: Bearer SECRET_KEY
- Content-Type: application/json
- Accept: application/json
Ответ ←
"siteId": "9hh4jb-00", "billId": "cc961e8d-d4d6-4f02-b737-2297e51fb48e", "amount": "currency": "RUB", "value": "1.00" >, "status": "value": "REJECTED", "changedDateTime": "2021-01-18T14:36:17.65+03:00" >, "customer": "email": "test@example.com", "phone": "78710009999", "account": "454678" >, "customFields": "paySourcesFilter": "qw", "themeCode": "Yvan-YKaSh", "yourParam1": "64728940", "yourParam2": "order 678" >, "comment": "Text comment", "creationDateTime": "2021-01-18T14:22:56.672+03:00", "expirationDateTime": "2025-12-10T09:02:00+03:00", "payUrl": "https://oplata.qiwi.com/form/?invoice_uid=aa0fa2bb-5452-47ca-9190-cd9c1a73718f" >
Пример тела ответа при ошибке
"serviceName": "invoicing-api", "errorCode": "api.invoice.not.found", "description": "Invoice not found", "userMessage": "Invoice not found", "dateTime": "2021-01-18T14:39:54.265+03:00", "traceId": "bc6bb6e7c5cf5beb" >
HEADERS
- Content-Type: application/json
Поле | Тип | Описание |
---|---|---|
billId | String | Уникальный идентификатор счета в вашей системе, указанный при выставлении |
siteId | String | Ваш идентификатор в сервисе приема платежей для физических лиц p2p.qiwi.com |
amount | Object | Информация о сумме счета |
amount. value | Number | Сумма счета, округленная до 2 знаков после запятой в меньшую сторону |
amount. currency | String | Идентификатор валюты суммы счета (Alpha-3 ISO 4217 код) |
status | Object | Информация о статусе счета |
status. value | String | Текущий статус счета |
status. changedDateTime | String | Дата обновления статуса. Формат даты: ГГГГ-ММ-ДДTчч:мм:сс±чч:мм |
customFields | Object | Объект строковых дополнительных параметров. Возможные элементы: paySourcesFilter , themeCode |
customer | Object | Идентификаторы пользователя. Возможные элементы: email , phone , account |
comment | String | Комментарий к счету |
creationDateTime | String | Системная дата создания счета. Формат даты: ГГГГ-ММ-ДДTчч:мм:сс |
payUrl | String | Ссылка на созданную платежную форму |
expirationDateTime | String | Срок действия созданной формы для перевода. Формат даты: ГГГГ-ММ-ДДTчч:мм:сс±чч:мм |
API P2P-счетов. Статусы оплаты счетов
Статус | Описание | Финальный |
---|---|---|
WAITING | Счет выставлен, ожидает оплаты | — |
PAID | Счет оплачен | + |
REJECTED | Счет отклонен | + |
EXPIRED | Время жизни счета истекло. Счет не оплачен | + |
Уведомления о переводе по счету
Сервис не является обязательным для интеграции, вы можете реализовать более простой вариант с опросом статуса счета.
Перед началом работы с сервисом уведомлений прочитайте условия по интеграции API уведомлений.
Пулы IP-адресов, с которых сервисы QIWI отправляют уведомления:
- 79.142.16.0/20
- 195.189.100.0/22
- 91.232.230.0/23
- 91.213.51.0/24
Если ваш сервер обработки уведомлений работает за брандмауэром, необходимо добавить эти IP-адреса в список разрешенных адресов входящих TCP-пакетов.
Уведомление о переводе (callback) отправляется только по протоколу HTTPS и только на 443 порт. Сертификат должен быть выдан доверенным центром сертификации (например, Comodo, Verisign, Thawte и т.п.).
Уведомление представляет собой входящий HTTP POST-запрос.
Запрос ← POST
POST /qiwi-notify.php HTTP/1.1 Accept: application/json Content-type: application/json X-Api-Signature-SHA256: J4WNfNZd***V5mv2w= Host: example.com "bill": "siteId": "9hh4jb-00", "billId": "cc961e8d-d4d6-4f02-b737-2297e51fb48e", "amount": "value": "1.00", "currency": "RUB" >, "status": "value": "PAID", "changedDateTime": "2021-01-18T15:25:18+03" >, "customer": "phone": "78710009999", "email": "test@example.com", "account": "454678" >, "customFields": "paySourcesFilter": "qw", "themeCode": "Yvan-YKaSh", "yourParam1": "64728940", "yourParam2": "order 678" >, "comment": "Text comment", "creationDateTime": "2021-01-18T15:24:53+03", "expirationDateTime": "2025-12-10T09:02:00+03" >, "version": "1" >
Тело запроса содержит JSON-сериализованные данные счета (кодировка UTF-8).
HEADERS
- X-Api-Signature-SHA256: XXX
- Accept: application/json
- Content-type: application/json
Регистрация сервера уведомлений
Мы остановили выпуск новых ключей. Простите за доставленные неудобства.
Адрес сервера для уведомлений настраивается в Личном кабинете P2P. При этом выпускается новая пара ключей для авторизации. В каждый момент времени действует только одна пара ключей — старая пара ключей блокируется при выпуске новой пары ключей.
- Авторизуйтесь в Личном кабинете P2P.
- Перейдите на вкладку API и нажмите кнопку Создать пару ключей и настроить. Если вы настраиваете адрес сервера вместе с первичным созданием пары ключей впервые, то нажмите кнопку Настроить.
- Укажите название для новой пары ключей.
- Выделите поле Использовать эту пару ключей для серверных уведомлений об изменении статусов счетов.
- В поле URL сервера для уведомлений укажите адрес вашего сервера для обработки уведомлений об оплате. Внимание! Сервер должен быть доступен из интернета.
- Нажмите кнопку Создать.
- Замените в настройках ваших приложений ключи для сервиса QIWI P2P на вновь созданные.
Проверка подлинности уведомлений
После получения входящего уведомления необходимо проверить его подлинность. Для этого используется механизм цифровой подписи. Подпись уведомления отправляется в HTTP–заголовке X-Api-Signature-SHA256 . Для формирования подписи используется механизм проверки целостности HMAC с хеш-функцией SHA256.
Алгоритм проверки подписи:
- Объединить значения следующих параметров уведомления в одну строку с разделителем | : invoice_parameters = |||| где – значение параметра. Все значения при проверке подписи должны трактоваться как строки.
- Вычислить HMAC-хеш c алгоритмом хеширования SHA256: hash = HMAС(SHA256, invoice_parameters, ) Где:
- – секретный ключ, при помощи которого был выставлен счёт;
- invoice_parameters – строка из п.1.
- Сравнить значение заголовка X-Api-Signature-SHA256 с результатом из п.2.
const validSignatureFromNotificationServer = '07e0ebb10916d97760c196034105d010607a6c6b7d72bfa1c3451448ac484a3b'; const notificationData = bill: siteId: 'test', billId: 'test_bill', amount: value: 1, currency: 'RUB' >, status: value: 'PAID', datetime: '2018-03-01T11:16:12+03' >, customer: <>, customFields: <>, creationDateTime: '2018-03-01T11:15:39+03:', expirationDateTime: '2018-04-15T11:15:39+03' >, version: '1' >; const secretKey = 'eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjUyNjgxMiwiYXBpX3VzZXJfaWQiOjcxNjI2MTk3LCJzZWNyZXQiOiJmZjBiZmJiM2UxYzc0MjY3YjIyZDIzOGYzMDBkNDhlYjhiNTnONPININONPN090MTg5Z**********************'; qiwiApi.checkNotificationSignature( validSignatureFromNotificationServer, notificationData, secretKey ); // true
$validSignatureFromNotificationServer = '07e0ebb10916d97760c196034105d010607a6c6b7d72bfa1c3451448ac484a3b'; $notificationData = [ 'bill' => [ 'siteId' => 'test', 'billId' => 'test_bill', 'amount' => ['value' => 1, 'currency' => 'RUB'], 'status' => ['value' => 'PAID'] ], 'version' => '3' ]; $secretKey = 'eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjUyNjgxMiwiYXBpX3VzZXJfaWQiOjcxNjI2MTk3LCJzZWNyZXQiOiJmZjBiZmJiM2UxYzc0MjY3YjIyZDIzOGYzMDBkNDhlYjhiNTnONPININONPN090MTg5Z**********************'; /** @var \Qiwi\Api\BillPayments $billPayments */ $billPayments->checkNotificationSignature( $validSignatureFromNotificationServer, $notificationData, $secretKey ); // true ?>
String secretKey = "eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjUyNjgxMiwiYXBpX3VzZXJfaWQiOjcxNjI2MTk3LCJzZWNyZXQiOiJmZjBiZmJiM2UxYzc0MjY3YjIyZDIzOGYzMDBkNDhlYjhiNTnONPININONPN090MTg5Z**********************"; Notification notification = new Notification( new Bill( "test", "test_bill", new MoneyAmount( BigDecimal.ONE, Currency.getInstance("RUB") ), BillStatus.PAID ), "3" ); String validSignature = "07e0ebb10916d97760c196034105d010607a6c6b7d72bfa1c3451448ac484a3b"; BillPaymentsUtils.checkNotificationSignature(validSignature, notification, secretKey); //true
Строка и ключ подписи кодируются в UTF-8.
Параметры
Поле | Описание | Тип |
---|---|---|
bill | Информация о счете | Object |
billId | Уникальный идентификатор счета в вашей системе, указанный при выставлении | String(200) |
siteId | Ваш идентификатор в сервисе приема платежей для физических лиц p2p.qiwi.com | String |
amount | Информация о сумме счета | Object |
amount. value | Сумма счета, округленная до двух десятичных знаков в меньшую сторону | Number(6.2) |
amount. currency | Идентификатор валюты суммы счета (Alpha-3 ISO 4217 код) | String(3) |
status | Информация о статусе счета | Object |
status. value | Строковое значение статуса | String |
status. changedDateTime | Дата обновления статуса. Формат даты ГГГГ-ММ-ДДTЧЧ:ММ:СС+Z | String |
customer | Информация о пользователе | Object |
customer. phone | Номер телефона (если был указан при выставлении счета) | String |
customer. | E-mail пользователя (если был указан при выставлении счета) | String |
customer. account | Идентификатор пользователя в вашей системе (если был указан при выставлении счета) | String |
creationDateTime | Дата создания счета. Формат даты ГГГГ-ММ-ДДTЧЧ:ММ:СС+Z | String |
expirationDateTime | Срок оплаты счета. Формат даты ГГГГ-ММ-ДДTЧЧ:ММ:СС+Z | String |
comment | Комментарий к счету | String(255) |
customFields | Дополнительные данные счета (если были указаны при выставлении счета) | Object |
version | Версия уведомлений | String |
Ответ →
HTTP/1.1 200 OK Content-Type: application/json "error":"0" >
HEADERS
- Content-type: application/json
После того, как был получен входящий запрос-уведомление, необходимо проверить подлинность цифровой подписи и отправить ответ.
Форма для оплаты счета
При открытии формы в webview на android обязательно включать settings.setDomStorageEnabled(true)
При выставлении счета через API в ответе присутствует поле payUrl со ссылкой на платежную форму. При перенаправлении по ссылке для оплаты счета к ней можно добавить параметры:
https://oplata.qiwi.com/form?invoiceUid=a8437e7e-dc48-44f7-9bdb-4d46ca8ef2e4&paySource=qw
Параметр | Описание | Тип |
---|---|---|
paySource | При открытии формы сразу будет выбран указанный способ перевода. Возможные значения: qw — QIWI Кошелек, card — банковская карта, mobile — баланс телефона. Если способ перевода недоступен, выбирается рекомендуемый для пользователя способ | String |
Добавьте реферальные ссылки для платежей с сайта. Полная ссылка подтвердит реальность сайта и позволит избежать проблем с блокировкой кошелька. Платежи, проходящие со страницы без заголовка запроса Refer будут приводить к блокировке кошелька. Подробнее см. в статье Как передавать реферальные ссылки.
Пример передачи реферальной ссылки
header("Referrer-Policy: no-referrer-when-downgrade"); ?>
Для того, чтобы в новых версиях браузеров передавался полный referer при переходе, укажите в ответе сервера заголовок Referrer-Policy со значением no-referrer-when-downgrade . Это можно сделать для всего сайта или только для страницы со ссылкой на форму оплаты.
Персонализация
Вы можете настроить персонализированную форму оплаты: изменить свое имя на название магазина и настроить цвет фона и кнопок.
Пример персонализированной формы оплаты:
Чтобы настроить внешний вид формы оплаты:
- Авторизуйтесь в Личном кабинете P2P.
- Перейдите в раздел Форма приема переводов. Код вашего стиля для переменной themeCode (указывается в запросах API и вызовах SDK, см. далее) выделен жирным шрифтом в блоке серого цвета. Значение themeCode индивидуально для разных QIWI кошельков.
- Нажмите кнопку Настроить и выполните настройку формы.
- Нажмите кнопку Сохранить.
Пример передачи параметра при вызове платежной формы
curl https://oplata.qiwi.com/create?publicKey=Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******&amount=100&billId=cc961e8d-d4d6-4f02-b737-2297e51fb48e&customFields%5BthemeCode%5D=кодСтиля
Пример передачи параметра в запросе к API
curl --location \ --request PUT \ 'https://api.qiwi.com/partner/bill/v1/bills/cc961e8d-d4d6-4f02-b737-2297e51fb48e' \ --header 'content-type: application/json' \ --header 'accept: application/json' \ --header 'Authorization: Bearer ' \ --data-raw '< "amount": < "currency": "RUB", "value": 100.00 >, "comment": "Text comment", "expirationDateTime": "2025-04-13T14:30:00+03:00", "customer": <>, "customFields": >'
const billId = 'cc961e8d-d4d6-4f02-b737-2297e51fb48e'; const fields = amount: 1.00, currency: 'RUB', comment: 'Hello world', customFields: themeCode: 'кодСтиля'>, expirationDateTime: '2018-03-02T08:44:07+03:00' >; qiwiApi.createBill( billId, fields ).then( data => //do with data >);
$billId = 'cc961e8d-d4d6-4f02-b737-2297e51fb48e'; $customFields = ['themeCode' => 'кодСтиля']; $fields = [ 'amount' => 1.00, 'currency' => 'RUB', 'comment' => 'test', 'expirationDateTime' => '2018-03-02T08:44:07+03:00', 'email' => 'mail@example.org', 'account' => 'client4563', 'customFields' => $customFields ]; /** @var \Qiwi\Api\BillPayments $billPayments */ $response = $billPayments->createBill($billId, $fields); print_r($response); ?>
client.CreateBill( info: new CreateBillInfo BillId = Guid.NewGuid().ToString(), Amount = new MoneyAmount ValueDecimal = 199.9m, CurrencyEnum = CurrencyEnum.Rub >, Comment = "comment", ExpirationDateTime = DateTime.Now.AddDays(45), Customer = new Customer Email = "mail@example.org", Account = Guid.NewGuid().ToString(), Phone = "79123456789" >, CustomFields: new CustomFields ThemeCode = "кодСтиля" > > );
Для применения стиля к платежной форме:
- В запросе создания счета или при вызове метода создания счета в нужном модуле SDK добавьте в тело запроса объект customFields c полем themeCode и укажите в нем код вашего стиля. Например, «customFields»: < "themeCode":"кодСтиля">.
- При вызове платежной формы добавьте в запрос параметр customFields c полем themeCode и укажите в нем код вашего стиля. Например, customFields[themeCode]=кодСтиля .
Библиотека Checkout Popup
Пример работы popup
Методы библиотеки позволяют открыть форму перевода как всплывающее окно (popup) поверх вашего сайта.
Установка и подключение библиотеки:
В библиотеке доступно два метода:
- Открытие существующего счета.
- Открытие вашей формы приема переводов.
Открытие существующего счета
Пример открытия уже созданного счета в popup
params = < payUrl: 'https://oplata.qiwi.com/form?invoiceUid=06df838c-0f86-4be3-aced-a950c244b5b1' >QiwiCheckout.openInvoice(params) .then(data => < // . >) .catch(error => < // . >)
Параметр | Описание | Тип |
---|---|---|
payUrl | Обязательный параметр. URL счета | String |
Открытие персонализированной формы
Пример открытия персонализированной формы
params = < widgetAlias: 'https://my.qiwi.com/form/User-ABCDE1234-56' >QiwiCheckout.openPreorder(params) .then(data => < // . >) .catch(error => < // . >)
Параметр | Описание | Тип |
---|---|---|
widgetAlias | Обязательный параметр. Ссылка на форму приема переводов | String |
Общие сведения
API QIWI Кошелька позволяет автоматизировать получение информации о вашем счёте в сервисе QIWI Кошелек и проводить операции с его помощью.
Методы API доступны после регистрации пользователя в сервисе QIWI Кошелек.
Авторизация запросов
Авторизация
Параметр | Описание | Тип |
---|---|---|
Bearer token | Токен для доступа к вашему QIWI кошельку по API . Действие токен а заканчивается через 180 дней после выпуска. Одновременно может действовать только один токен . | String |
Доступ к API
Основной URL-адрес для вызова методов API (если не указано иное):
Для успешного вызова методов API необходимы:
- Корректные значения HTTP-заголовков Accept и Content-Type в запросе. API QIWI Кошелька поддерживает только один MIME-тип: application/json . Любое другое значение приведет к ошибке формата данных.
- URL, составленный согласно требованиям к нужному запросу.
- OAuth- токен , выданный вам для доступа к вашему QIWI кошельку. Для некоторых запросов его не потребуется.
Получение OAuth- токен а
Мы остановили выпуск OAuth- токен ов. Приносим извинения за доставленные неудобства.
API QIWI Кошелька использует открытый протокол OAuth 2.0. Согласно протоколу, пользователь авторизуется или регистрируется на сайте https://qiwi.com и запрашивает токен OAuth 2.0 Bearer с правом выполнения определённых действий. Выпуск токен а подтверждается одноразовым кодом из СМС.
Токен действует в течение 180 дней с момента выпуска. Вы можете заблокировать токен , не дожидаясь окончания срока его действия. Для этого удалите доступ к вашему кошельку для приложения QIWI API на этой странице.
Пример вызова API
curl "адрес сервера" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer "
Мы остановили выпуск OAuth- токен ов. Приносим извинения за доставленные неудобства.
Передавайте полученный токен в HTTP-заголовке Authorization при каждом вызове API , указывая тип токен а Bearer перед его значением. Пример получения такого заголовка:
- В результате авторизации на сайте QIWI Кошелек и выпуска токен а получен токен , представляющий собой строку:
- Токен добавляется в заголовок Authorization: Bearer
- Итоговый заголовок, добавляемый в каждый запрос к API QIWI Кошелька:
Authorization: Bearer U1QtOTkwMTAyLWNud3FpdWhmbzg3M
Профиль пользователя
Предложить правки на GitHub
Запрос возвращает информацию о вашем профиле — наборе пользовательских данных и настроек вашего QIWI кошелька.
Запрос → GET
curl "https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=false" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /person-profile/v1/profile/current HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # Профиль пользователя def get_profile(api_access_token): s7 = requests.Session() s7.headers['Accept']= 'application/json' s7.headers['authorization'] = 'Bearer ' + api_access_token p = s7.get('https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=true&contractInfoEnabled=true&userInfoEnabled=true') return p.json()
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' # Полная информация о профиле пользователя profile = get_profile(api_access_token) # Профиль пользователя # статус блокировки profile['contractInfo']['blocked'] # Профиль пользователя # уровень идентификации в Киви Банке profile['contractInfo']['identificationInfo'][0]['identificationLevel'] # привязанный email profile['authInfo']['boundEmail']
URL /person-profile/v1/profile/current?parameter=value
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Параметры
Название | Тип | Описание |
---|---|---|
authInfoEnabled | Boolean | Логический признак выгрузки настроек авторизации. По умолчанию true |
contractInfoEnabled | Boolean | Логический признак выгрузки данных о вашем QIWI кошельке. По умолчанию true |
userInfoEnabled | Boolean | Логический признак выгрузки прочих пользовательских данных. По умолчанию true |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "authInfo": "boundEmail": "m@ya.ru", "ip": "81.210.201.22", "lastLoginDate": "2017-07-27T06:51:06.099Z", "mobilePinInfo": "lastMobilePinChange": "2017-07-13T11:22:06.099Z", "mobilePinUsed": true, "nextMobilePinChange": "2017-11-27T06:51:06.099Z" >, "passInfo": "lastPassChange": "2017-07-21T09:25:06.099Z", "nextPassChange": "2017-08-21T09:25:06.099Z", "passwordUsed": true >, "personId": 79683851815, "pinInfo": "pinUsed": true >, "registrationDate": "2017-01-07T16:51:06.100Z" >, "contractInfo": "blocked": false, "contractId": 79683851815, "creationDate": "2017-01-07T16:51:06.100Z", "features": [ . ], "identificationInfo": [ "bankAlias": "QIWI", "identificationLevel": "SIMPLE", "passportExpired": false > ] >, "userInfo": "defaultPayCurrency": 643, "defaultPaySource": 7, "email": null, "firstTxnId": 10807097143, "language": "string", "operator": "Beeline", "phoneHash": "lgsco87234f0287", "promoEnabled": null > >
Успешный JSON-ответ содержит следующие данные:
Поле ответа | Тип | Описание |
---|---|---|
authInfo | Object | Текущие настройки авторизации. Объект может отсутствовать, в зависимости от признака authInfoEnabled в запросе. |
authInfo.personId | Number | Номер кошелька |
authInfo.registrationDate | String | Дата/время регистрации QIWI Кошелька (через сайт/мобильное приложение, либо другим способом) |
authInfo.boundEmail | String | E-mail, привязанный к кошельку. Если отсутствует, то null |
authInfo.ip | String | IP-адрес последней пользовательской сессии |
authInfo.lastLoginDate | String | Дата/время последней сессии в QIWI Кошельке |
authInfo.mobilePinInfo | Object | Данные о PIN-коде мобильного приложения QIWI Кошелька |
mobilePinInfo.mobilePinUsed | Boolean | Логический признак использования PIN-кода (фактически означает, что мобильное приложение используется) |
mobilePinInfo.lastMobilePinChange | String | Дата/время последнего изменения PIN-кода мобильного приложения QIWI Кошелька |
mobilePinInfo.nextMobilePinChange | String | Дата/время следующего (планового) изменения PIN-кода мобильного приложения QIWI Кошелька |
authInfo.passInfo | Object | Данные об использовании пароля к сайту qiwi.com |
passInfo.passwordUsed | Boolean | Логический признак использования пароля (фактически означает использование сайта qiwi.com) |
passInfo.lastPassChange | String | Дата/время последнего изменения пароля сайта qiwi.com |
passInfo.nextPassChange | String | Дата/время следующего (планового) изменения пароля сайта qiwi.com |
authInfo.pinInfo | Object | Данные об использовании PIN-кода к приложению QIWI Кошелька на QIWI терминалах самообслуживания |
pinInfo.pinUsed | Boolean | Логический признак использования PIN-кода для терминала (фактически означает факт использования приложения QIWI Кошелька на терминале) |
contractInfo | Object | Информация о кошельке. Объект может отсутствовать, в зависимости от признака contractInfoEnabled в запросе. |
contractInfo.blocked | Boolean | Логический признак блокировки кошелька |
contractInfo.contractId | Number | Номер кошелька |
contractInfo.creationDate | String | Дата/время создания QIWI Кошелька (через сайт/мобильное приложение, либо при первом пополнении, либо другим способом) |
contractInfo.features | Array[Object] | Служебная информация |
contractInfo.identificationInfo | Array[Object] | Данные об идентификации пользователя. |
identificationInfo[].bankAlias | String | Акроним системы, в которой пользователь получил идентификацию: QIWI — QIWI Кошелек. |
identificationInfo[].identificationLevel | String | Текущий уровень идентификации кошелька. Возможные значения: ANONYMOUS — без идентификации; SIMPLE , VERIFIED — упрощенная идентификация; FULL — полная идентификация. |
identificationInfo[].passportExpired | Boolean | Информация об актуальности паспортных данных владельца кошелька ( true означает, что паспортные данные недействительны). |
userInfo | Object | Прочие пользовательские данные. Объект может отсутствовать, в зависимости от признака userInfoEnabled в запросе. |
userInfo.defaultPayCurrency | Number(3) | Код валюты баланса кошелька по умолчанию (ISO-4217) |
userInfo.defaultPaySource | Number | Служебная информация |
userInfo.email | String | E-mail пользователя |
userInfo.firstTxnId | Number | Номер первой транзакции после регистрации |
userInfo.language | String | Служебная информация |
userInfo.operator | String | Название мобильного оператора номера пользователя |
userInfo.phoneHash | String | Служебная информация |
userInfo.promoEnabled | String | Служебная информация |
Идентификация
Идентификация пользователя
Запрос позволяет отправить данные для идентификации вашего QIWI кошелька.
Допускается идентифицировать не более 5 кошельков на одного владельца. См. п. 3.1.1 ч. III Оферты сервиса «QIWI Wallet»
Для получения статуса «Основной» необходимо предоставить следующие данные о пользователе-владельце кошелька:
- ФИО
- Серия / Номер паспорта
- Дата рождения
- ИНН, СНИЛС или номер полиса ОМС — необязательно.
Для идентификации кошелька вы обязательно должны отправить ФИО, серию/номер паспорта и дату рождения. Если данные прошли проверку, то в ответе будет отображен ваш ИНН и упрощенная идентификация кошелька будет установлена. В случае если данные не прошли проверку, кошелек остается в статусе «Минимальный».
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer " \ -d '< "birthDate": "1998-02-11", "firstName": "Иван", "inn": "", "lastName": "Иванов", "middleName": "Иванович", "oms": "", "passport": "4400111222", "snils": "" >'
POST /identification/v1/persons/79111234567/identification HTTP/1.1 Accept: application/json Authorization: Bearer Content-type: application/json Host: edge.qiwi.com "birthDate": "1998-02-11", "firstName": "Иван", "inn": "", "lastName": "Иванов", "middleName": "Иванович", "oms": "", "passport": "4400111222", "snils": "" >
import requests # идентификация def get_identification(api_access_token, my_login): s = requests.Session() s.headers['authorization'] = 'Bearer ' + api_access_token res = s.get('https://edge.qiwi.com/identification/v1/persons/'+my_login+'/identification') return res.json()
URL /identification/v1/persons/wallet/identification
- wallet — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
Название | Тип | Описание |
---|---|---|
birthDate | String | Дата рождения пользователя (в формате «ГГГГ-ММ-ДД») |
firstName | String | Имя пользователя |
middleName | String | Отчество пользователя |
lastName | String | Фамилия пользователя |
passport | String | Серия и номер паспорта пользователя (только цифры) |
inn | String | ИНН пользователя |
snils | String | Номер СНИЛС пользователя |
oms | String | Номер полиса ОМС пользователя |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "birthDate": "1996-03-18", "firstName": "Иван", "id": 79111234567, "inn": "7710000001", "lastName": "Иванов", "middleName": "Иванович", "oms": "", "passport": "1122333000", "snils": "", "type": "VERIFIED" >
mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' print(get_identification(api_access_token, mylogin)) 'birthDate': '1984-01-09', 'firstName': 'Иванов', 'id': 79262111317, 'inn': 'xxxxxxx', 'lastName': 'Иванов', 'middleName': 'Иванович', 'oms': None, 'passport': 'xxxx xxxxxx', 'snils': None, 'type': 'FULL'>
Успешный ответ в формате JSON содержит подтверждение идентификации кошелька:
Поле ответа | Тип | Описание |
---|---|---|
id | Number | Номер кошелька пользователя |
type | String | Текущий статус кошелька: SIMPLE — «Минимальный». VERIFIED — «Основной» (данные для идентификации успешно прошли проверку). FULL – «Профессиональный», если кошелек уже ранее получал полную идентификацию по данным ФИО, номеру паспорта и дате рождения. |
birthDate | String | Дата рождения пользователя |
firstName | String | Имя пользователя |
middleName | String | Отчество пользователя |
lastName | String | Фамилия пользователя |
passport | String | Серия и номер паспорта пользователя |
inn | String | ИНН пользователя. Если в запросе параметр не заполнен, но присутствует в ответе, то идентификация кошелька выполнена. |
snils | String | Номер СНИЛС пользователя |
oms | String | Номер полиса ОМС пользователя |
Данные идентификации
Запрос позволяет выгрузить маскированные данные и статус идентификации своего QIWI кошелька.
Запрос → GET
curl -X GET \ "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /identification/v1/persons/79111234567/identification HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
URL /identification/v1/persons/wallet/identification
- wallet — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "birthDate": "1996-03-18", "firstName": "Иван", "id": 79111234567, "inn": "77***01", "lastName": "Иванов", "middleName": "Иванович", "oms": "", "passport": "43***11", "snils": "", "type": "VERIFIED" >
Успешный ответ в формате JSON содержит маскированные данные идентификации кошелька:
Поле ответа | Тип | Описание |
---|---|---|
id | Number | Номер кошелька пользователя |
type | String | Текущий статус кошелька: SIMPLE — «Минимальный». VERIFIED — «Основной» (данные для идентификации успешно прошли проверку). FULL – «Профессиональный», если кошелек уже ранее получал полную идентификацию по данным ФИО, номеру паспорта и дате рождения. |
birthDate | String | Дата рождения пользователя |
firstName | String | Имя пользователя |
middleName | String | Отчество пользователя |
lastName | String | Фамилия пользователя |
passport | String | Серия и номер паспорта пользователя (первые и последние 2 цифры) |
inn | String | ИНН пользователя (первые и последние 2 цифры) |
snils | String | Номер СНИЛС пользователя (первые и последние 2 цифры) |
oms | String | Номер полиса ОМС пользователя (первые и последние 2 цифры) |
Понижение уровня идентификации
Вы можете понизить уровень идентификации вашего QIWI кошелька. На данный момент понижение доступно только с уровня «Профессиональный» до уровня «Основной».
Для понижения уровня необходимо сделать 2 запроса:
- Создание заявки на понижение уровня идентификации.
- Подтверждение заявки на понижение уровня идентификации.
Создание заявки на понижение уровня идентификации
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer " \ -d '< "identificationLevel": "VERIFIED" >'
POST /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations HTTP/1.1 Accept: application/json Authorization: Bearer Content-type: application/json Host: edge.qiwi.com "identificationLevel": "VERIFIED" >
URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations
- wallet — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
Название | Тип | Описание |
---|---|---|
identificationLevel | String | Уровень, до которого требуется понизить идентификацию (на данный момент понижение возможно только до статуса «Основной» — VERIFIED ) |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4" >
Успешный ответ в формате JSON содержит ID заявки на понижение уровня идентификации:
Поле ответа | Тип | Описание |
---|---|---|
downgradeOperationId | String | ID заявки на понижение уровня идентификации |
Подтверждение заявки на понижение уровня идентификации
Запрос → PUT
curl -X PUT \ https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4/confirm \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer " \ -d '<>'
PUT /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4/confirm HTTP/1.1 Accept: application/json Authorization: Bearer Content-type: application/json Host: edge.qiwi.com <>
URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations/downgradeOperationId/confirm
- wallet — номер вашего кошелька без знака «+»
- downgradeOperationId — ID вашей заявки на понижение уровня идентификации
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "downgradeOperation": "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4", "status": "type": "IN_PROGRESS" > > >
Успешный ответ в формате JSON содержит информацию о заявке на понижение уровня идентификации:
Поле ответа | Тип | Описание |
---|---|---|
downgradeOperation.downgradeOperationId | String | ID заявки на понижение уровня идентификации |
downgradeOperation.status.type | String | Статус заявки на понижение уровня идентификации. IN_PROGRESS — Заявка на понижение уровня идентификации в обработке. Вы можете проверять текущий статус заявки отдельным запросом (см. ниже). SUCCESS — Заявка на понижение уровня идентификации успешно обработана. FAIL – Понижение уровня идентификации невозможно. |
Запрос статуса заявки на понижение уровня идентификации
Запрос → GET
curl -X GET \ https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4 \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4 HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations/downgradeOperationId
- wallet — номер вашего кошелька без знака «+»
- downgradeOperationId — ID вашей заявки на понижение уровня идентификации
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "downgradeOperation": "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4", "status": "type": "SUCCESS" > > >
Успешный ответ в формате JSON содержит информацию о заявке на понижение уровня идентификации:
Поле ответа | Тип | Описание |
---|---|---|
downgradeOperation.downgradeOperationId | String | ID заявки на понижение уровня идентификации |
downgradeOperation.status.type | String | Статус заявки на понижение уровня идентификации. IN_PROGRESS — Заявка на понижение уровня идентификации в обработке. SUCCESS — Заявка на понижение уровня идентификации успешно обработана. FAIL – Понижение уровня идентификации невозможно. |
Лимиты QIWI Кошелька
Уровни лимитов
Запрос возвращает текущие уровни лимитов по операциям в вашем QIWI кошельке. Лимиты действуют как ограничения на сумму определенных операций.
Запрос → GET
curl "https://edge.qiwi.com/qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # Все лимиты QIWI Кошелька def limits(login, api_access_token): types = [ 'TURNOVER', 'REFILL', 'PAYMENTS_P2P', 'PAYMENTS_PROVIDER_INTERNATIONALS', 'PAYMENTS_PROVIDER_PAYOUT', 'WITHDRAW_CASH'] s = requests.Session() s.headers['Accept']= 'application/json' s.headers['Content-Type']= 'application/json' s.headers['authorization'] = 'Bearer ' + api_access_token parameters = <> for i, type in enumerate(types): parameters['types[' + str(i) + ']'] = type b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/actual-limits', params = parameters) return b.json()
URL /qw-limits/v1/persons/personId/actual-limits?parameter=value
- personId — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Параметры
Название | Тип | Описание |
---|---|---|
types | Array[String] | Список типов операций, по которым запрашиваются лимиты. Каждый тип нумеруется элементом массива, начиная с нуля ( types[0] , types[1] и т.д.). Допустимые типы операций: REFILL — максимальный допустимый остаток на счёте TURNOVER — оборот в месяц PAYMENTS_P2P — переводы на другие кошельки в месяц PAYMENTS_PROVIDER_INTERNATIONALS — платежи в адрес иностранных компаний в месяц PAYMENTS_PROVIDER_PAYOUT — Переводы на банковские счета и карты, кошельки других систем WITHDRAW_CASH — снятие наличных в месяц. Должен быть указан хотя бы один тип операций. |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "limits": "RU" :[ "type": "TURNOVER", "currency": "RUB", "rest": 200.00, "max": 40000.00, "spent": 39800.00, "interval": "dateFrom": "2019-11-01T:00:00", "dateTill": "2019-12-01T00:00" > >, . ] > >
# номер кошелька в формате 79992223344 mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' # все лимиты (список) limits = limits(mylogin,api_access_token)['limits']['RU'] # лимит оборота turnoverInfo = [x for x in limits if x['type'] == 'TURNOVER'] turnoverLimit = turnoverInfo[0]['rest']
Успешный ответ содержит JSON-массив лимитов по операциям вашего QIWI Кошелька:
Поле ответа | Тип | Описание |
---|---|---|
limits | Object | Описание лимитов |
limits[].’RU’ | Array[Object] | Массив лимитов на операции |
type | String | Тип операций, на которые действует этот лимит |
currency | String | Валюта операций |
max | String | Значение лимита |
spent | String | Сумма, потраченная по данным операциям |
rest | Boolean | Остаток лимита, который можно потратить в указанный период (период задается в параметре interval ) |
interval | Object | Сведения о периоде действия лимита |
interval.dateFrom, interval.dateTill | String | Начало и конец периода, формат даты ГГГГ-ММ-ДДТЧЧ:ММ:ССtmz |
Лимит по операциям с физлицами
Запрос возвращает значение количества операций с физлицами за текущий месяц в вашем QIWI кошельке.
Запрос → GET
curl "https://edge.qiwi.com/qw-limits/v1/persons/79999999999/p2p-payment-count-limit" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /qw-limits/v1/persons/79999999999/p2p-payment-count-limit HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # Количество операций с физлицами def get_p2p_payment_count(login, api_access_token): s = requests.Session() s.headers['Accept']= 'application/json' s.headers['Content-Type']= 'application/json' s.headers['authorization'] = 'Bearer ' + api_access_token b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/p2p-payment-count-limit') return b.json()
URL /qw-limits/v1/persons/personId/p2p-payment-count-limit
- personId — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "p2pPaymentCountLimit": 1 >
mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' # Количество операций с физлицами за текущий месяц print(get_p2p_payment_count(api_access_token, mylogin)) 'p2pPaymentCountLimit': 1>
Успешный ответ в формате JSON содержит информацию по операциям вашего QIWI Кошелька:
Поле ответа | Тип | Описание |
---|---|---|
p2pPaymentCountLimit | Number | Kоличество операций с физлицами в месяце |
Проверка ограничений исходящих платежей с QIWI Кошелька
Следующий запрос проверяет, есть ли ограничение на исходящие платежи с QIWI Кошелька.
Запрос → GET
curl "https://edge.qiwi.com/person-profile/v1/persons/79115221133/status/restrictions" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /person-profile/v1/persons/79115221133/status/restrictions HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # Блокировки def get_restrictions(api_access_token, mylogin): s7 = requests.Session() s7.headers['Accept']= 'application/json' s7.headers['authorization'] = 'Bearer ' + api_access_token p = s7.get('https://edge.qiwi.com/person-profile/v1/persons/' + mylogin + '/status/restrictions') return p.json()
URL /person-profile/v1/persons/personId/status/restrictions
- personId — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json [ "restrictionCode": "OUTGOING_PAYMENTS", "restrictionDescription": "Исходящие платежи заблокированы" > ]
mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' print(get_restrictions(api_access_token, mylogin)) [ "restrictionCode": "OUTGOING_PAYMENTS", "restrictionDescription": "Исходящие платежи заблокированы" > ]
Успешный ответ содержит JSON-массив ограничений кошелька с их описанием:
Поле ответа | Тип | Описание |
---|---|---|
restrictionCode | String | Код блокировки |
restrictionDescription | String | Описание блокировки |
restrictionCode | restrictionDescription |
---|---|
OUTGOING_PAYMENTS | Исходящие платежи заблокированы |
Если ограничений нет, возвращается пустой массив.
История платежей
Предложить правки на GitHub
Список платежей
Запрос выгружает список платежей и пополнений вашего кошелька. Можно использовать фильтр по количеству, ID и дате (интервалу дат) транзакций.
Максимальная частота запросов истории платежей — не более 100 запросов в минуту для одного и того же номера кошелька. При превышении доступ к API блокируется на 5 минут.
Запрос → GET
Пример 1. Последние 10 платежей
curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=10" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=50&startDate=2017-05-10T00%3A00%3A00%2B03%3A00&endDate=2017-05-10T23%3A59%3A59%2B03%3A00" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
Пример 3. Продолжение списка платежей (в предыдущем запросе истории возвращены параметры nextTxnId=9103121 и nextTxnDate=2017-05-11T12:35:23+03:00)
curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
Пример 4. Последние 10 платежей с рублевого баланса и с привязанной карты
GET /payment-history/v2/persons//payments?rows=10&operation=OUT&sources%5B0%5D=QW_RUB&sources%5B1%5D=CARD HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
Пример 5. Платежи за 10.05.2017 с рублевого счета
GET /payment-history/v2/persons//payments?rows=50&sources%5B0%5D=QW_RUB&startDate=2017-05-10T00%3A00%3A00%2B03%3A00&endDate=2017-05-10T23%3A59%3A59%2B03%3A00 HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
Пример 6. Продолжение списка платежей за 10.05.2017 (в Примере 2 возвращены параметры nextTxnId=9103121 и nextTxnDate=2017-05-11T12:35:23+03:00)
GET /payment-history/v2/persons//payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00 HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # История платежей - последние и следующие n платежей def payment_history_last(my_login, api_access_token, rows_num, next_TxnId, next_TxnDate): s = requests.Session() s.headers['authorization'] = 'Bearer ' + api_access_token parameters = 'rows': rows_num, 'nextTxnId': next_TxnId, 'nextTxnDate': next_TxnDate> h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + my_login + '/payments', params = parameters) return h.json()
URL /payment-history/v2/persons/wallet/payments?parameter=value
- wallet — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Параметры
Название | Тип | Описание |
---|---|---|
rows | Integer | Число платежей в ответе, для разбивки отчета на страницы. Целое число от 1 до 50. Запрос возвращает указанное число платежей в обратном хронологическом порядке, начиная от текущей даты или даты в параметре startDate . Обязательный параметр |
operation | String | Тип операций в отчете, для отбора. Допустимые значения: ALL — все операции, IN — только пополнения, OUT — только платежи, QIWI_CARD — только платежи по картам QIWI (QVC, QVP). По умолчанию ALL |
sources | Array[String] | Список источников платежа, для фильтра. Каждый источник нумеруется, начиная с нуля ( sources[0] , sources[1] и т.д.). Допустимые значения: QW_RUB — рублевый счет кошелька, QW_USD — счет кошелька в долларах, QW_EUR — счет кошелька в евро, CARD — привязанные и непривязанные к кошельку банковские карты, MK — счет мобильного оператора. Если не указан, учитываются все источники |
startDate | DateTime URL-encoded | Начальная дата поиска платежей. Используется только вместе с endDate . Максимальный допустимый интервал между startDate и endDate — 90 календарных дней. По умолчанию, равна суточному сдвигу от текущей даты по московскому времени. Дату можно указать в любой временной зоне TZD (формат ГГГГ-ММ-ДД’T’чч:мм:ссTZD ), однако она должна совпадать с временной зоной в параметре endDate . Обозначение временной зоны TZD : +чч:мм или — чч:мм (временной сдвиг от GMT). |
endDate | DateTime URL-encoded | Конечная дата поиска платежей. Используется только вместе со startDate . Максимальный допустимый интервал между startDate и endDate — 90 календарных дней. По умолчанию, равна текущим дате/времени по московскому времени. Дату можно указать в любой временной зоне TZD (формат ГГГГ-ММ-ДД’T’чч:мм:ссTZD ), однако она должна совпадать с временной зоной в параметре startDate . Обозначение временной зоны TZD : +чч:мм или — чч:мм (временной сдвиг от GMT). |
nextTxnDate | DateTime URL-encoded | Дата транзакции для начала отчета (должна быть равна параметру nextTxnDate в предыдущем списке). Используется для продолжения списка, разбитого на страницы. Используется только вместе с nextTxnId |
nextTxnId | Long | Номер транзакции для начала отчета (должен быть равен параметру nextTxnId в предыдущем списке). Используется для продолжения списка, разбитого на страницы. Используется только вместе с nextTxnDate |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json
"data": [ "txnId":9309, "personId":79112223344, "date":"2017-01-21T11:41:07+03:00", "errorCode":0, "error":null, "status":"SUCCESS", "type":"OUT", "statusText":"Успешно", "trmTxnId":"1489826461807", "account":"0003***", "sum": "amount":70, "currency":643 >, "commission": "amount":0, "currency":643 >, "total": "amount":70, "currency":643 >, "provider": . >, "source": <>, "comment":"", "currencyRate":1 ], "nextTxnId":9001, "nextTxnDate":"2017-01-31T15:24:10+03:00" >
mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' # последние 20 платежей lastPayments = payment_history_last(mylogin, api_access_token, '5','','') # дата и время следующего платежа nextTxnDate = lastPayments['nextTxnDate'] # id транзакции следующего платежа nextTxnId = lastPayments['nextTxnId'] # История платежей - последние и следующие n платежей orderedPayments = payment_history_last(mylogin, api_access_token, '5', nextTxnId, nextTxnDate)
Успешный JSON-ответ содержит список платежей из истории кошелька, соответствующих заданному фильтру:
Поле ответа | Тип | Описание |
---|---|---|
data | Array[Object] | Список объектов PaymentHistoryItem. Число объектов в списке меньше или равно параметру rows из запроса |
nextTxnId | Number(Integer) | ID следующего платежа в полном списке |
nextTxnDate | DateTime | Дата/время следующего платежа в полном списке, время московское (в формате ГГГГ-ММ-ДД’T’чч:мм:сс+03:00 ) |
Статистика платежей
Запрос используется для получения сводной статистики по суммам платежей за указанный период.
Максимальный период для выгрузки статистики — 90 календарных дней.
Запрос → GET
curl "https://edge.qiwi.com/payment-history/v2/persons//payments/total?startDate=2017-03-01T00%3A00%3A00%2B03%3A00&endDate=2017-03-31T11%3A44%3A15%2B03%3A00" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /payment-history/v2/persons//payments/total?startDate=2017-03-01T00%3A00%3A00%2B03%3A00&endDate=2017-03-31T11%3A44%3A15%2B03%3A00 HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # История платежей - сумма за диапазон дат def payment_history_summ_dates(my_login, api_access_token, start_Date, end_Date): s = requests.Session() s.headers['authorization'] = 'Bearer ' + api_access_token parameters = 'startDate': start_Date,'endDate': end_Date> h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + my_login + '/payments/total', params = parameters) return h.json()
URL /payment-history/v2/persons/wallet/payments/total?parameter=value
- wallet — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Параметры
Название | Тип | Описание |
---|---|---|
startDate | DateTime URL-encoded | Начальная дата периода статистики. Дату можно указать в любой временной зоне TZD (формат ГГГГ-ММ-ДД’T’чч:мм:ссTZD ), однако она должна совпадать с временной зоной в параметре endDate . Обозначение временной зоны TZD : +чч:мм или — чч:мм (временной сдвиг от GMT). Обязательный параметр |
endDate | DateTime URL-encoded | Конечная дата периода статистики. Дату можно указать в любой временной зоне TZD (формат ГГГГ-ММ-ДД’T’чч:мм:ссTZD ), однако она должна совпадать с временной зоной в параметре startDate . Обозначение временной зоны TZD : +чч:мм или — чч:мм (временной сдвиг от GMT). Обязательный параметр |
operation | String | Тип операций, учитываемых при подсчете статистики. Допустимые значения: ALL — все операции, IN — только пополнения, OUT — только платежи, QIWI_CARD — только платежи по картам QIWI (QVC, QVP). По умолчанию ALL . |
sources | Array[String] | Источники платежа, по которым вернутся данные. Каждый источник нумеруется, начиная с нуля ( sources[0] , sources[1] и т.д.). Допустимые значения: QW_RUB — рублевый счет кошелька, QW_USD — счет кошелька в долларах, QW_EUR — счет кошелька в евро, CARD — привязанные и непривязанные к кошельку банковские карты, MK — счет мобильного оператора. Если не указан, учитываются все источники платежа. |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json
"incomingTotal":[ "amount":3500, "currency":643 > ], "outgoingTotal":[ "amount":3497.5, "currency":643 > ] >
mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' # История платежей - сумма за диапазон # не более 90 дней с 12 апреля по 11 июля 2019 года print(payment_history_summ_dates(mylogin, api_access_token, '2019-04-12T00:00:00Z','2019-07-11T23:59:59Z')) 'incomingTotal': ['amount': 3.33, 'currency': 840>, 'amount': 3481, 'currency': 643>], 'outgoingTotal': ['amount': 3989.98, 'currency': 643>, 'amount': 3.33, 'currency': 840>]>
Успешный JSON-ответ содержит статистику платежей за выбранный период:
Поле ответа | Тип | Описание |
---|---|---|
incomingTotal | Array[Object] | Массив данных о суммах входящих платежей (пополнениях) по каждой валюте |
incomingTotal[].amount | Number(Decimal) | Сумма пополнений за период |
incomingTotal[].currency | Number(3) | Код валюты пополнений (ISO-4217) |
outgoingTotal | Array[Object] | Массив данных о суммах исходящих платежей по каждой валюте |
outgoingTotal[].amount | Number(Decimal) | Сумма платежей за период |
outgoingTotal[].currency | Number(3) | Код валюты платежей (ISO-4217) |
Информация о транзакции
Запрос используется для получения информации по определенной транзакции из вашей истории платежей.
Запрос → GET
curl "https://edge.qiwi.com/payment-history/v2/transactions/9112223344" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /payment-history/v2/transactions/9112223344 HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # История платежей - информация по транзакции def payment_history_transaction(api_access_token, transaction_id, transaction_type): s = requests.Session() s.headers['authorization'] = 'Bearer ' + api_access_token parameters = 'type': transaction_type> # transaction_type 'IN' 'OUT' h = s.get('https://edge.qiwi.com/payment-history/v1/transactions/'+transaction_id, params = parameters) return h.json()
URL /payment-history/v2/transactions/transactionId?type=value
- transactionId — номер транзакции из истории платежей (параметр data[].txnId в ответе)
- type — тип транзакции из истории платежей (параметр data[].type в ответе). Параметр является необязательным
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json
"txnId": 11233344692, "personId": 79161122331, "date": "2017-08-30T14:38:09+03:00", "errorCode": 0, "error": null, "status": "WAITING", "type": "OUT", "statusText": "Запрос обрабатывается", "trmTxnId": "11233344691", "account": "15040930424823121081", "sum": "amount": 1, "currency": 643 >, "commission": "amount": 0, "currency": 643 >, "total": "amount": 1, "currency": 643 >, "provider": "id": 1, "shortName": "MTS", "longName": "MTS", "logoUrl": null, "description": null, "keys": null, "siteUrl": null, "extras": [] >, "source": "id": 7, "shortName": "QIWI Wallet", "longName": "QIWI Wallet", "logoUrl": null, "description": null, "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями", "siteUrl": null, "extras": [] >, "comment": "", "currencyRate": 1, "extras": [], "features": "chequeReady": false, "bankDocumentAvailable": false, "bankDocumentReady": false, "repeatPaymentEnabled": false, "favoritePaymentEnabled": false, "regularPaymentEnabled": false > >
# номер кошелька в формате 79992223344 mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' # История платежей - информация по транзакции transactionInfo = payment_history_transaction(api_access_token, '11181101215', 'OUT') # История платежей - информация по транзакции из истории платежей lastPayments = payment_history_last(mylogin, api_access_token, '20','','') last_txn_id = lastPayments['data'][5]['txnId'] last_txn_type = lastPayments['data'][5]['type'] transactionInfo = payment_history_transaction(api_access_token, str(last_txn_id), last_txn_type)
Успешный JSON-ответ содержит объект Transaction с данными о транзакции.
Квитанция платежа
Запрос используется для получения электронной квитанции (чека) по определенной транзакции из вашей истории платежей в формате PDF/JPEG в виде файла или почтовым сообщением на указанный e-mail.
Файл квитанции
Запрос → GET
curl "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # История платежей - получение текста чека в файле def payment_history_cheque_file(transaction_id, transaction_type, filename, api_access_token): s = requests.Session() s.headers['Accept'] ='application/json' s.headers['authorization'] = 'Bearer ' + api_access_token parameters = 'type': transaction_type,'format': 'PDF'> h = s.get('https://edge.qiwi.com/payment-history/v1/transactions/'+transaction_id+'/cheque/file', params=parameters) h.status_code with open(filename + '.pdf', 'wb') as f: f.write(h.content)
URL /payment-history/v1/transactions/transactionId/cheque/file?type=value&format=value
- transactionId — номер транзакции из истории платежей (параметр data[].txnId в ответе)
- type — тип транзакции из истории платежей (параметр data[].type в ответе)
- format — тип файла, в который сохраняется квитанция. Допустимые значения: JPEG, PDF
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json [ "" ]
Успешный JSON-ответ содержит файл выбранного формата в бинарном виде.
Отправка квитанции
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/send?type=IN" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer " \ -d ''
POST /payment-history/v1/transactions/9112223344/cheque/send?type=IN HTTP/1.1 Accept: application/json Authorization: Bearer Content-type: application/json Host: edge.qiwi.com "email": "my@example.com">
import requests # История платежей - отправить чек на email def payment_history_cheque_send(transaction_id, transaction_type, email, api_access_token): s = requests.Session() s.headers['content-type'] ='application/json' s.headers['Accept'] ='application/json' s.headers['authorization'] = 'Bearer ' + api_access_token postjson = 'email':email> h = s.post('https://edge.qiwi.com/payment-history/v1/transactions/' + transaction_id + '/cheque/send?type=' + transaction_type, json = postjson) h.status_code
URL /payment-history/v1/transactions/transactionId/cheque/send?type=value
- transactionId — номер транзакции из истории платежей (параметр data[].txnId в ответе)
- type — тип транзакции из истории платежей (параметр data[].type в ответе)
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметр
Название | Тип | Описание |
---|---|---|
String | Адрес для отправки электронной квитанции |
Ответ ←
HTTP/1.1 201 Created
# номер кошелька в формате 79992223344 mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' lastPayments = payment_history_last(mylogin, api_access_token, '20','','') last_txn_id = lastPayments['data'][5]['txnId'] last_txn_type = lastPayments['data'][5]['type'] # История платежей - отправить чек на email payment_history_cheque_send(str(last_txn_id), last_txn_type, 'mmd@yandex.ru', api_access_token)
Успешный JSON-ответ содержит HTTP-код результата операции отправки файла.
Модели данных API
Класс PaymentHistoryItem
"txnId": 11233344692, "personId": 79161122331, "date": "2017-08-30T14:38:09+03:00", "errorCode": 0, "error": null, "status": "WAITING", "type": "OUT", "statusText": "Запрос обрабатывается", "trmTxnId": "11233344691", "account": "15040930424823121081", "sum": "amount": 1, "currency": 643 >, "commission": "amount": 0, "currency": 643 >, "total": "amount": 1, "currency": 643 >, "provider": "id": 1, "shortName": "MTS", "longName": "MTS", "logoUrl": "", "description": "", "keys": "", "siteUrl": "", "extras": [] >, "source": "id": 7, "shortName": "QIWI Wallet", "longName": "QIWI Wallet", "logoUrl": "", "description": "", "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями", "siteUrl": "", "extras": [] >, "comment": "", "currencyRate": 1 >
Объект, описывающий существующую транзакцию в сервисе QIWI Кошелек.
Элемент | Тип | Описание |
---|---|---|
txnId | Integer | ID транзакции в сервисе QIWI Кошелек |
personId | Integer | Номер кошелька |
date | DateTime | Для запросов истории платежей — Дата/время платежа, во временной зоне запроса (см. параметр startDate ). Формат даты ГГГГ-ММ-ДД’T’чч:мм:сс+03:00 Для запросов данных о транзакции — Дата/время платежа, время московское (в формате ГГГГ-ММ-ДД’T’чч:мм:сс+03:00 ) |
errorCode | Number(Integer) | Код ошибки платежа |
error | String | Описание ошибки |
type | String | Тип платежа. Возможные значения: IN — пополнение, OUT — платеж, QIWI_CARD — платеж с карты QIWI (QVC, QVP). |
status | String | Статус платежа. Возможные значения: WAITING — платеж проводится, SUCCESS — успешный платеж, ERROR — ошибка платежа. |
statusText | String | Текстовое описание статуса платежа |
trmTxnId | String | Клиентский ID транзакции |
account | String | Для платежей — идентификатор получателя (номер счета, телефона, маскированный номер карты и т.д.). Для пополнений — идентификатор отправителя, терминала или название агента пополнения кошелька |
sum | Object | Данные о сумме платежа или пополнения. |
sum.amount | Number(Decimal) | сумма платежа |
sum.currency | Number(3) | валюта платежа (код по ISO-4217) |
commission | Object | Данные о комиссии платежа |
commission.amount | Number(Decimal) | сумма |
commission.currency | Number(3) | валюта (код по ISO-4217) |
total | Object | Данные о фактической сумме платежа или пополнения. |
total.amount | Number(Decimal) | сумма (равна сумме платежа sum.amount и комиссии commission.amount ) |
total.currency | Number(3) | валюта (код по ISO-4217) |
provider | Object | Данные о провайдере. |
provider.id | Integer | ID провайдера в QIWI Wallet |
provider.shortName | String | краткое наименование провайдера |
provider.longName | String | развернутое наименование провайдера |
provider.logoUrl | String | ссылка на логотип провайдера |
provider.description | String | описание провайдера (HTML) |
provider.keys | String | список ключевых слов |
provider.siteUrl | String | сайт провайдера |
source | Object | Служебная информация |
comment | String | Комментарий к платежу |
currencyRate | Number(Decimal) | Курс конвертации (если применяется в транзакции) |
Класс Transaction
"txnId": 11233344692, "personId": 79161122331, "date": "2017-08-30T14:38:09+03:00", "errorCode": 0, "error": null, "status": "WAITING", "type": "OUT", "statusText": "Запрос обрабатывается", "trmTxnId": "11233344691", "account": "15040930424823121081", "sum": "amount": 1, "currency": 643 >, "commission": "amount": 0, "currency": 643 >, "total": "amount": 1, "currency": 643 >, "provider": "id": 1, "shortName": "MTS", "longName": "MTS", "logoUrl": "", "description": "", "keys": "", "siteUrl": "", "extras": [] >, "source": "id": 7, "shortName": "QIWI Wallet", "longName": "QIWI Wallet", "logoUrl": "", "description": "", "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями", "siteUrl": "", "extras": [] >, "comment": "", "currencyRate": 1, "paymentExtras": [], "features": "chequeReady": false, "bankDocumentAvailable": false, "bankDocumentReady": false, "repeatPaymentEnabled": false, "favoritePaymentEnabled": false, "regularPaymentEnabled": false, "chatAvailable": true, "greetingCardAttached": true >, "serviceExtras": <>, "view": "title": "", "account": "" > >
Объект, описывающий существующую транзакцию в сервисе QIWI Кошелек.
Элемент | Тип | Описание |
---|---|---|
txnId | Integer | ID транзакции в сервисе QIWI Кошелек |
personId | Integer | Номер кошелька |
date | DateTime | Для запросов истории платежей — Дата/время платежа, во временной зоне запроса (см. параметр startDate ). Формат даты ГГГГ-ММ-ДД’T’чч:мм:сс+03:00 Для запросов данных о транзакции — Дата/время платежа, время московское (в формате ГГГГ-ММ-ДД’T’чч:мм:сс+03:00 ) |
errorCode | Number(Integer) | Код ошибки платежа |
error | String | Описание ошибки |
type | String | Тип платежа. Возможные значения: IN — пополнение, OUT — платеж, QIWI_CARD — платеж с карты QIWI (QVC, QVP). |
status | String | Статус платежа. Возможные значения: WAITING — платеж проводится, SUCCESS — успешный платеж, ERROR — ошибка платежа. |
statusText | String | Текстовое описание статуса платежа |
trmTxnId | String | Клиентский ID транзакции |
account | String | Для платежей — идентификатор получателя (номер счета, телефона, маскированный номер карты и т.д.). Для пополнений — идентификатор отправителя, терминала или название агента пополнения кошелька |
sum | Object | Данные о сумме платежа или пополнения. |
sum.amount | Number(Decimal) | сумма платежа |
sum.currency | Number(3) | валюта платежа (код по ISO-4217) |
commission | Object | Данные о комиссии платежа |
commission.amount | Number(Decimal) | сумма |
commission.currency | Number(3) | валюта (код по ISO-4217) |
total | Object | Данные о фактической сумме платежа или пополнения. |
total.amount | Number(Decimal) | сумма (равна сумме платежа sum.amount и комиссии commission.amount ) |
total.currency | Number(3) | валюта (код по ISO-4217) |
provider | Object | Данные о провайдере. |
provider.id | Integer | ID провайдера в QIWI Wallet |
provider.shortName | String | краткое наименование провайдера |
provider.longName | String | развернутое наименование провайдера |
provider.logoUrl | String | ссылка на логотип провайдера |
provider.description | String | описание провайдера (HTML) |
provider.keys | String | список ключевых слов |
provider.siteUrl | String | сайт провайдера |
source | Object | Служебная информация |
comment | String | Комментарий к платежу |
currencyRate | Number(Decimal) | Курс конвертации (если применяется в транзакции) |
paymentExtras | Array of Objects | Служебная информация |
features | Object | Набор специальных полей |
features.chequeReady | Boolean | Специальное поле |
features.bankDocumentReady | Boolean | Специальное поле |
features.bankDocumentAvailable | Boolean | Специальное поле |
features.repeatPaymentEnabled | Boolean | Специальное поле |
features.favoritePaymentEnabled | Boolean | Специальное поле |
features.regularPaymentEnabled | Boolean | Специальное поле |
features.chatAvailable | Boolean | Специальное поле |
features.greetingCardAttached | Boolean | Специальное поле |
serviceExtras | Object | Служебная информация |
view | Object | Служебная информация |
Баланс QIWI Кошелька
Предложить правки на GitHub
Методы данного API предназначены для управления балансами вашего QIWI кошелька.
Список балансов
Запрос выгружает текущие балансы счетов вашего QIWI Кошелька.
Запрос → GET
curl "https://edge.qiwi.com/funding-sources/v2/persons//accounts" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /funding-sources/v2/persons//accounts HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # Баланс QIWI Кошелька def balance(login, api_access_token): s = requests.Session() s.headers['Accept']= 'application/json' s.headers['authorization'] = 'Bearer ' + api_access_token b = s.get('https://edge.qiwi.com/funding-sources/v2/persons/' + login + '/accounts') return b.json()
URL /funding-sources/v2/persons/personId/accounts
- personId — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "accounts": [ "alias": "mc_beeline_rub", "fsAlias": "qb_mc_beeline", "bankAlias": "QIWI", "title": "MC", "type": "id": "MC", "title": "Счет мобильного кошелька" >, "hasBalance": false, "balance": null, "currency": 643 >, "alias": "qw_wallet_rub", "fsAlias": "qb_wallet", "bankAlias": "QIWI", "title": "WALLET", "type": "id": "WALLET", "title": "QIWI Wallet" >, "hasBalance": true, "balance": "amount": 8.74, "currency": 643 >, "currency": 643 > ] >
# номер кошелька в формате 79992223344 mylogin = '79999999999' api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' # все балансы balances = balance(mylogin,api_access_token)['accounts'] # рублевый баланс rubAlias = [x for x in balances if x['alias'] == 'qw_wallet_rub'] rubBalance = rubAlias[0]['balance']['amount']
Повторный запрос, если в ответе пришел пустой объект balance и поле «hasBalance»: true
GET /funding-sources/v2/persons/79115221133/accounts?timeout=1000&alias=qw_wallet_rub HTTP/1.1 Accept: application/json Authorization: Bearer YUu2qw048gtdsvlk3iu Host: edge.qiwi.com
Успешный ответ содержит JSON-массив счетов вашего QIWI Кошелька для фондирования платежей и текущие балансы счетов:
Поле ответа | Тип | Описание |
---|---|---|
accounts | Array[Object] | Массив балансов |
accounts[].alias | String | Псевдоним пользовательского баланса |
accounts[].fsAlias | String | Псевдоним банковского баланса |
accounts[].bankAlias | String | Псевдоним банка |
accounts[].title | String | Название соответствующего счета кошелька |
accounts[].hasBalance | Boolean | Логический признак реального баланса в системе QIWI Кошелек (не привязанная карта, не счет мобильного телефона и т.д.) |
accounts[].currency | Number(3) | Код валюты баланса (ISO-4217). Возвращаются балансы в следующих валютах: 643 — российский рубль, 840 — американский доллар, 978 — евро |
accounts[].type | Object | Сведения о счете |
type.id, type.title | String | Описание счета |
accounts[].balance | Object | Сведения о балансе данного счета. Если объект пустой и при этом поле accounts[].hasBalance равно true , повторите запрос с дополнительными параметрами: timeout=1000 и alias=accounts[].alias (псевдоним этого баланса) |
balance.amount | Number | Текущий баланс данного счета |
balance.currency | Number(3) | Код валюты баланса (ISO-4217) |
Создание баланса
Запрос создает новый счет и баланс в вашем QIWI Кошельке. Список доступных для создания счетов можно получить другим запросом.
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/funding-sources/v2/persons//accounts" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer " \ -d '< "alias": "qw_wallet_eur">'
POST /funding-sources/v2/persons//accounts HTTP/1.1 Accept: application/json Authorization: Bearer Content-type: application/json Host: edge.qiwi.com "alias": "qw_wallet_eur" >
URL /funding-sources/v2/persons/personId/accounts
- personId — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
Название | Тип | Описание |
---|---|---|
alias | String | Псевдоним нового счета (см. запрос доступных счетов) |
Ответ ←
HTTP/1.1 201 Created
Успешный ответ содержит HTTP-код 201 .
Запрос доступных счетов
Запрос отображает псевдонимы счетов, доступных для создания в вашем QIWI Кошельке.
Запрос → GET
curl -X GET \ "https://edge.qiwi.com/funding-sources/v2/persons//accounts/offer" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /funding-sources/v2/persons//accounts/offer HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
URL /funding-sources/v2/persons/personId/accounts/offer
- personId — номер вашего кошелька без знака «+»
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "alias": "qw_wallet_eur", "currency": 978 >, <> >
Успешный JSON-ответ содержит данные о счетах, которые можно создать:
Поле ответа | Тип | Описание |
---|---|---|
<> | Object | Коллекция описаний счетов |
Object.alias | String | Псевдоним счета |
Object.currency | Number(3) | Код валюты счета (ISO-4217) |
Установка баланса по умолчанию
Запрос устанавливает для вашего QIWI Кошелька счет, баланс которого будет использоваться для фондирования всех платежей по умолчанию. Счет должен содержаться в списке счетов
Запрос → PATCH
curl -X PATCH \ "https://edge.qiwi.com/funding-sources/v2/persons//accounts/qw_wallet_usd" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer " \ -d '< "defaultAccount": true >'
PATCH /funding-sources/v2/persons//accounts/qw_wallet_usd HTTP/1.1 Accept: application/json Authorization: Bearer Content-type: application/json Host: edge.qiwi.com "defaultAccount": true >
URL /funding-sources/v2/persons/personId/accounts/accountAlias
- personId — номер вашего кошелька без знака «+»
- accountAlias — псевдоним счета в кошельке из списка счетов (параметр accounts[].alias в ответе)
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
Название | Тип | Описание |
---|---|---|
defaultAccount | Boolean | Признак установки счета по умолчанию |
Ответ ←
HTTP/1.1 204 Modified
Успешный ответ содержит HTTP-код 204 .
Платежное API
Предложить правки на GitHub
API предоставляет доступ к платежам в пользу провайдеров услуг, зарегистрированных в сервисах QIWI Кошелька.
Допустимая сумма платежной операции и лимит на платежи зависят от уровня идентификации QIWI кошелька.
Автозаполнение платежных форм
Запрос отображает в браузере предзаполненную форму на сайте qiwi.com для совершения платежа.
Если вы не хотите, чтобы пользователь видел номер вашего кошелька на форме, используйте перевод по никнейму:
Для приема переводов на свой QIWI кошелек можно использовать P2P-форму.
Запрос → GET
GET /payment/form/99?account=79991112233&sum=1.1&comment=test123¤cy=643 HTTP/1.1 Host: qiwi.com
URL /payment/form/ ?=
ID — идентификатор провайдера, у которого набор реквизитов платежа содержит только поле fields.account . Возможные значения:
- 99 — Перевод на QIWI Кошелек.
- 99999 — Перевод на QIWI Кошелек по никнейму.
- Идентификаторы для пополнения мобильного номера
- 1963 — Перевод на карту Visa (карты российских банков).
- 21013 — Перевод на карту MasterCard (карты российских банков).
- 31652 — Перевод на карту МИР.
- 22351 — Перевод на Виртуальную карту QIWI.
- Идентификаторы для оплаты других услуг.
Параметры
В строке URL запроса указываются параметры отображения платежной формы:
Название | Тип | Описание | Поле на форме |
---|---|---|---|
sum | Decimal, 10.15 | Сумма платежа. Если параметр не указан, поле Сумма на форме будет пустым. Допустимо число не больше 99 999.00 (ограничение на сумму платежа) | Сумма |
currency | Константа, 643 | Код валюты платежа. Обязательный параметр, если вы передаете в ссылке сумму платежа | — |
comment | URL-encoded string | Комментарий. Параметр используется только для > Комментарий к переводу | |
account | URL-encoded string | См. формат параметра fields.account в описании оплаты соответствующих провайдеров. Например: провайдер 99 — номер кошелька получателя; провайдер 99999 – никнейм или номер кошелька получателя (определяется значением параметра формы accountType ); провайдеры сотовой связи — номер мобильного телефона для пополнения (без префикса страны); провайдеры перевода на карту — номер банковской карты получателя (без пробелов); другие провайдеры — идентификатор пользователя | Номер Кошелька, Номер телефона/счета/карты, Пользовательский ID получателя |
blocked | Array[String] | Признак нередактируемого поля формы. Пользователь не сможет менять значение данного поля, если только не изменит его в адресной строке браузера. Каждый параметр задает соответствующее поле формы и нумеруется начиная с нуля ( blocked[0] , blocked[1] и т.д.). Если не указан, пользователь сможет изменить все поля формы. Работает только для веб-версии сайта. Допустимые значения: sum — поле Сумма платежа, account — поле Номер счета/телефона/карты, comment — поле Комментарий. Пример (неактивное поле суммы платежа): blocked[0]=sum | — |
accountType | URL-encoded string | Параметр используется только для Значение определяет перевод на QIWI кошелек по никнейму или по номеру кошелька. phone — для перевода по номеру nickname — для перевода по никнейму. Если вы не хотите, чтобы пользователь видел номер вашего кошелька на форме, используйте это значение | — |
Комиссионные тарифы
Чтобы узнать комиссию за платеж до его совершения по заданному набору платежных реквизитов, используйте этот запрос. Возвращается полная комиссия QIWI Кошелька за платеж в пользу указанного провайдера с учетом всех тарифов.
Запрос → POST
curl -X POST \ 'https://edge.qiwi.com/sinap/providers/99/onlineCommission' \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer " \ -d '< "account":"380995238345", "paymentMethod":< "type":"Account", "accountId":"643" >, "purchaseTotals": < "total":< "amount":10, "currency":"643" >> >'
POST /sinap/providers/99/onlineCommission HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "account":"380995238345", "paymentMethod": "type":"Account", "accountId":"643" >, "purchaseTotals": "total": "amount":10, "currency":"643" > > >
import requests # Тарифные комиссии def get_commission(api_access_token, to_account, prv_id, sum_pay): s = requests.Session() s.headers = 'content-type': 'application/json'> s.headers['authorization'] = 'Bearer ' + api_access_token postjson = "account":"","paymentMethod":"type":"Account","accountId":"643">, "purchaseTotals":"total":"amount":"","currency":"643">>> postjson['account'] = to_account postjson['purchaseTotals']['total']['amount'] = sum_pay c_online = s.post('https://edge.qiwi.com/sinap/providers/'+prv_id+'/onlineCommission',json = postjson) return c_online.json()['qwCommission']['amount']
URL /sinap/providers/ /onlineCommission
ID — идентификатор провайдера. Возможные значения:
- 99 — Перевод на QIWI Кошелек.
- 1717 — Перевод по банковским реквизитам организации.
- Провайдеры банковских переводов.
Также идентификатор нужного провайдера можно установить поиском по ключевым словам.
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
Обязательные параметры в теле запроса:
Название | Тип | Описание |
---|---|---|
account | String | Пользовательский идентификатор (номер телефона с международным префиксом, номер карты/счета получателя, и т.д., в зависимости от провайдера) |
paymentMethod | Object | Объект, определяющий обработку платежа процессингом QIWI Wallet. Содержит следующие параметры: |
paymentMethod.type | String | Метод платежа, только Account |
paymentMethod.accountId | String | Идентификатор счета, только 643 . |
purchaseTotals | Object | Объект с платежными реквизитами |
purchaseTotals.total | Object | Объект, содержащий данные о сумме платежа: |
total.amount | Number | Сумма (можно указать рубли и копейки, разделитель . ). Положительное число, округленное до 2 знаков после десятичной точки. При большем числе знаков значение будет округлено до копеек в меньшую сторону. |
total.currency | String | Валюта (только 643 , рубли) |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "providerId": 99, . "qwCommission": "amount": 10.01, "currency": "643" > >
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' # Комиссия за перевод на QIWI кошелек print(get_commission(api_access_token,'+380000000000','99',5000)) # Комиссия за перевод на карту print(get_commission(api_access_token,'4890xxxxxxxx1698','22351',1000))
Рассчитанная сумма комиссии возвращается в поле qwCommission.amount JSON-ответа.
Перевод на QIWI Кошелек
Запрос → POST
curl -X POST \ 'https://edge.qiwi.com/sinap/api/v2/terms/99/payments' \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ -d '< "id":"11111111111111", "sum": < "amount":100, "currency":"643" >, "paymentMethod": < "type":"Account", "accountId":"643" >, "comment":"Комментарий", "fields": < "account":"+79121112233" >>'
POST /sinap/api/v2/terms/99/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "id":"11111111111111", "sum": "amount":100.50, "currency":"643" >, "paymentMethod": "type":"Account", "accountId":"643" >, "comment":"Комментарий", "fields": "account":"+79121112233" > >
import requests import time # Перевод на QIWI Кошелек def send_p2p(api_access_token, to_qw, comment, sum_p2p): s = requests.Session() s.headers = 'content-type': 'application/json'> s.headers['authorization'] = 'Bearer ' + api_access_token s.headers['User-Agent'] = 'Android v3.2.0 MKT' s.headers['Accept'] = 'application/json' postjson = "id":"","sum":"amount":"","currency":"">,"paymentMethod":"type":"Account","accountId":"643">, "comment":"'+comment+'","fields":"account":"">> postjson['id'] = str(int(time.time() * 1000)) postjson['sum']['amount'] = sum_p2p postjson['sum']['currency'] = '643' postjson['fields']['account'] = to_qw res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/99/payments',json = postjson) return res.json()
URL /sinap/api/v2/terms/99/payments
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа передается во вложенном объекте fields :
Название | Тип | Описание |
---|---|---|
fields.account | String | Обязательный параметр. Номер кошелька для перевода |
Ответ ←
print(send_p2p(mylogin,api_access_token,'+79261112233','comment',99.01)) 'comment': 'comment', 'fields': 'account': '+79261112233'>, 'id': '1514296828893', 'source': 'account_643', 'sum': 'amount': 99.01, 'currency': '643'>, 'terms': '99', 'transaction': 'id': '11982501857', 'state': 'code': 'Accepted'>>>
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Никнейм QIWI кошелька
Запрос → GET
curl -X GET \ "https://edge.qiwi.com/qw-nicknames/v1/persons/79111234567/nickname" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /qw-nicknames/v1/persons/79111234567/nickname HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
URL /qw-nicknames/v1/persons/ /nickname
wallet — номер вашего кошелька без знака + .
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "canChange": true, "canUse": true, "description": "", "nickname": "NICKNAME" >
Успешный ответ в формате JSON содержит никнейм вашего кошелька в поле nickname .
Конвертация
Запрос выполняет перевод средств на валютный счет QIWI Кошелька с конвертацией с вашего рублевого счета. При этом формируются две транзакции: конвертации между счетами вашего кошелька и перевода на другой кошелек. Курс валют для конвертации можно узнать другим запросом.
Запрос → POST
curl -X POST \ 'https://edge.qiwi.com/sinap/api/v2/terms/1099/payments' \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ -d '< "id":"11111111111111", "sum": < "amount":100, "currency":"398" >, "paymentMethod": < "type":"Account", "accountId":"643" >, "comment":"Комментарий", "fields": < "account":"+79121112233" >>'
POST /sinap/api/v2/terms/1099/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "id":"11111111111111", "sum": "amount":10.00, "currency":"398" >, "paymentMethod": "type":"Account", "accountId":"643" >, "comment":"Комментарий", "fields": "account":"+79121112233" > >
import requests import time # Конвертация в QIWI Кошельке (currency - код валюты String) def exchange(api_access_token, sum_exchange, currency, to_qw): s = requests.Session() currencies = ['398', '840', '978'] if currency not in currencies: print('This currency not available') return s.headers = 'content-type': 'application/json'> s.headers['authorization'] = 'Bearer ' + api_access_token s.headers['User-Agent'] = 'Android v3.2.0 MKT' s.headers['Accept'] = 'application/json' postjson = "id":"","sum":"amount":"","currency":"">,"paymentMethod":"type":"Account","accountId":"643">, "comment":"'+comment+'","fields":"account":"">> postjson['id'] = str(int(time.time() * 1000)) postjson['sum']['amount'] = sum_exchange postjson['sum']['currency'] = currency postjson['fields']['account'] = to_qw res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/1099/payments',json = postjson) return res.json()
URL /sinap/api/v2/terms/1099/payments
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа передается во вложенном объекте fields :
Название | Тип | Описание |
---|---|---|
fields.account | String | Обязательный параметр. Номер кошелька для перевода |
Ответ ←
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Курсы валют
Запрос возвращает текущие курсы и кросс-курсы валют КИВИ Банка.
Запрос → GET
curl "https://edge.qiwi.com/sinap/crossRates" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /sinap/crossRates HTTP/1.1 Accept: application/json Authorization: Bearer Host: edge.qiwi.com
import requests # Курс пары валют (коды валют в String) def exchange(api_access_token, currency_to, currency_from): s = requests.Session() s.headers = 'content-type': 'application/json'> s.headers['authorization'] = 'Bearer ' + api_access_token s.headers['User-Agent'] = 'Android v3.2.0 MKT' s.headers['Accept'] = 'application/json' res = s.get('https://edge.qiwi.com/sinap/crossRates') # все курсы rates = res.json()['result'] # запрошенный курс rate = [x for x in rates if x['from'] == currency_from and x['to'] == currency_to] if (len(rate) == 0): print('No rate for this currencies!') return else: return rate[0]['rate']
URL /sinap/crossRates
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "result": [ "set": "General", "from": "398", "to": "643", "rate": 6.22665 >, "set": "General", "from": "398", "to": "756", "rate": 412.0174305 >, . , "set": "General", "from": "980", "to": "978", "rate": 31.4680914 > ] >
Успешный JSON-ответ содержит список курсов валют в списке result . Элемент списка соответствует валютной паре:
Поле ответа | Тип | Описание |
---|---|---|
from | String | Валюта покупки |
to | String | Валюта продажи |
rate | Number | Курс |
Оплата сотовой связи
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/sinap/api/v2/terms/1/payments" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ -d '< "id":"11111111111111", "sum": < "amount":100, "currency":"643" >, "paymentMethod": < "type":"Account", "accountId":"643" >, "fields": < "account":"9161112233" >>'
POST /sinap/api/v2/terms/1/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "id":"21131343", "sum": "amount":1000, "currency":"643" >, "paymentMethod": "type":"Account", "accountId":"643" >, "fields": "account":"9161112233" > >
import requests import time # Оплата мобильного телефона def send_mobile(api_access_token, prv_id, to_account, comment, sum_pay): s = requests.Session() s.headers['Accept'] = 'application/json' s.headers['Content-Type'] = 'application/json' s.headers['authorization'] = 'Bearer ' + api_access_token postjson = "id":"","sum": "amount":"","currency":"643">,"paymentMethod": "type":"Account","accountId":"643">,"comment":"","fields": "account":"">> postjson['id'] = str(int(time.time() * 1000)) postjson['sum']['amount'] = sum_pay postjson['fields']['account'] = to_account postjson['comment'] = comment res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/'+prv_id+'/payments', json = postjson) return res.json()
URL /sinap/api/v2/terms/ /payments
ID — идентификатор провайдера. Определяется с помощью поиска провайдера.
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа передается во вложенном объекте fields :
Название | Тип | Описание |
---|---|---|
fields.account | String | Номер мобильного телефона для пополнения (без префикса 8 ) |
Ответ ←
send_mobile(api_access_token,'2','9670058909','123','1')
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Перевод на карту
Поиск ID для переводов на банковские карты РФ и Белоруссии
Определение ID для переводов на банковские карты РФ и Белоруссии.
Запрос → POST
POST /sinap/api/refs/bd6fb248-2bdf-49ed-bcb2-9b0a789cfde8/containers HTTP/1.1 Accept: application/vnd.qiwi.v1+json Content-Type: application/json Host: edge.qiwi.com Authorization: Bearer "account":"1234 1234 1234 1234" >
curl -X POST \ "https://edge.qiwi.com/sinap/api/refs/bd6fb248-2bdf-49ed-bcb2-9b0a789cfde8/containers" \ --header "Content-Type: application/json" \ --header "Accept: application/vnd.qiwi.v1+json" \ --header "Authorization: Bearer " \ -d '< "account":"1234 1234 1234 1234" >'
URL /sinap/api/refs/bd6fb248-2bdf-49ed-bcb2-9b0a789cfde8/containers
HEADERS
- Accept: application/vnd.qiwi.v1+json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В поле account JSON-тела запроса передается номер карты в строковом формате. В номере после каждой четвертой цифры ставится пробел.
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "elements": [ "type": "field", "name": "termsId", "value": "36390" > ] >
"elements":["type": "field","name": "termsId","value": "36390">]>
В поле ответа elements[].value возвращается ID провайдера для перевода на банковскую карту.
Перевод на карты банков РФ и зарубежных банков
Запрос выполняет денежный перевод на карты платежных систем Visa, MasterCard или МИР.
Платежи на карты Visa и MasterCard, выпущенные иностранными банками, временно остановлены по причине ограничений со стороны платежной системы .
Запрос → POST
Пример перевода на карту банка РФ
curl -X POST \ "https://edge.qiwi.com/sinap/api/v2/terms/1963/payments" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ -d '< "id":"21131343", "sum":< "amount":1000, "currency":"643" >, "paymentMethod":< "type":"Account", "accountId":"643" >, "fields": < "account":"4256********1231" >>'
POST /sinap/api/v2/terms/1963/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "id":"21131343", "sum": "amount":1000, "currency":"643" >, "paymentMethod": "type":"Account", "accountId":"643" >, "fields": "account":"4256XXXXXXXX1231" > >
Пример перевода на международную карту
curl -X POST \ "https://edge.qiwi.com/sinap/api/v2/terms/1960/payments" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ -d '< "id":"21131343", "sum":< "amount":1000, "currency":"643" >, "paymentMethod":< "type":"Account", "accountId":"643" >, "fields": < "account": "402865XXXXXXXXXX", "rec_address": "Ленинский проспект 131, 56", "rec_city": "Москва", "rec_country": "Россия", "reg_name": "Виктор", "reg_name_f": "Петров", "rem_name": "Сергей", "rem_name_f": "Иванов" >>'
POST /sinap/api/v2/terms/1960/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "id":"21131343", "sum": "amount":1000, "currency":"643" >, "paymentMethod": "type":"Account", "accountId":"643" >, "fields": "account": "402865XXXXXXXXXX", "rec_address": "Ленинский проспект 131, 56", "rec_city": "Москва", "rec_country": "Россия", "reg_name": "Виктор", "reg_name_f": "Петров", "rem_name": "Сергей", "rem_name_f": "Иванов" > >
import requests import time # Перевод на карту def send_card(api_access_token, payment_data): # payment_data - dictionary with all payment data s = requests.Session() s.headers['Accept'] = 'application/json' s.headers['Content-Type'] = 'application/json' s.headers['authorization'] = 'Bearer ' + api_access_token postjson = "id":"","sum": "amount":"","currency":"643">,"paymentMethod": "type":"Account","accountId":"643">,"fields": "account":"">> postjson['id'] = str(int(time.time() * 1000)) postjson['sum']['amount'] = payment_data.get('sum') postjson['fields']['account'] = payment_data.get('to_card') prv_id = payment_data.get('prv_id') if payment_data.get('prv_id') in ['1960', '21012']: postjson['fields']['rem_name'] = payment_data.get('rem_name') postjson['fields']['rem_name_f'] = payment_data.get('rem_name_f') postjson['fields']['reg_name'] = payment_data.get('reg_name') postjson['fields']['reg_name_f'] = payment_data.get('reg_name_f') postjson['fields']['rec_city'] = payment_data.get('rec_address') postjson['fields']['rec_address'] = payment_data.get('rec_address') res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/' + prv_id + '/payments', json = postjson) return res.json()
URL /sinap/api/v2/terms/ /payments
ID — идентификатор провайдера. Возможные значения:
- 1963 — Перевод на карту Visa. Для карт, выпущенных российскими банками.
- 1960 — Перевод на карту Visa. Для карт, выпущенных банками стран Албания, Андорра,Аргентина, Армения, Австралия, Австрия, Азербайджан, Беларусь, Бельгия, Бенин, Босния и Герцеговина, Бразилия, Болгария, Китай, Хорватия, Кипр, Чешская Республика, Дания, Египет, Эстония, Финляндия, Франция, Грузия, Германия, Греция, Гонконг (Китай), Венгрия, Исландия, Индия, Индонезия, Израиль, Италия, Япония, Казахстан, Кения, Корея Республика, Кувейт, Кыргызстан, Латвия, Литва, Люксембург, Макао, Китай, Македония, Мадагаскар, Малайзия, Мальдивы, Мальта, Республика Молдова, Монако, Монголия, Черногория, Намибия, Нидерланды, Новая Зеландия, Нигерия, Норвегия, Оман, Парагвай, Польша, Португалия, Катар, Румыния, Саудовская Аравия, Республика Сербия, Сингапур, Словакия, Словения, Южная Африка, Испания, Шри-Ланка, Швеция, Таджикистан, Танзания, Таиланд, Турция, Туркменистан, Объединенные Арабские Эмираты, Великобритания, Узбекистан, Вьетнам, Замбия.
- 21013 — Перевод на карту MasterCard. Для карт, выпущенных российскими банками.
- 21012 — Перевод на карту MasterCard. Для карт, выпущенных банками стран Албания, Аргентина, Армения, Австралия, Австрия, Азербайджан, Бангладеш, Барбадос, Беларусь, Бельгия, Бенин, Босния и Герцеговина, Буркина-Фасо, Бразилия, Болгария, Камбоджа, Камерун Объединенная Республика, Чили, Китай, Колумбия, Конго, Коста-Рика, Хорватия, Кипр, Чешская Республика, Демократическая Республика Конго, Дания, Доминиканская Республика, Эквадор, Сальвадор, Египет, Эстония, Финляндия, Франция, Грузия, Германия, Гана, Греция, Гватемала, Гонконг, Венгрия, Индия, Индонезия, Ирландия, Израиль, Италия, Япония, Иордания, Казахстан, Кения, Корея, Кувейт, Кыргызстан, Латвия, Ливан, Литва, Люксембург, Макао, Македония, Мадагаскар, Малайзия, Мальдивы, Мальта, Мексика, Молдова, Монако, Монголия, Черногория, Марокко, Намибия, Нигерия, Непал, Нидерланды, Новая Зеландия, Нигерия, Норвегия, Оман, Панама, Парагвай, Перу, Филиппины, Польша, Португалия, Румыния, Катар, Саудовская Аравия, Сенегал, Сербия Республика, Сингапур, Словакия, Словения, Южная Африка, Испания, Шри-Ланка, Швеция, Швейцария, Таджикистан, Танзания, Тайланд, Тунис, Турция, Туркменистан, Объединенные Арабские Эмираты, Великобритания, Узбекистан, Вьетнам, Замбия.
- 31652 — Перевод на карту МИР.
- 22351 — Перевод на Виртуальную карту QIWI.
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа в поле fields зависит от ID провайдера.
Параметры для ID 1963, 21013, 31652, 22351
Название | Тип | Описание |
---|---|---|
fields.account | String | Номер банковской карты получателя (без пробелов) |
Параметры для ID 1960, 21012
Название | Тип | Описание |
---|---|---|
fields.account | String | Номер банковской карты получателя (без пробелов) |
fields.rem_name | String | Имя отправителя |
fields.rem_name_f | String | Фамилия отправителя |
fields.rec_address | String | Адрес отправителя (без почтового индекса, в произвольной форме) |
fields.rec_city | String | Город отправителя |
fields.rec_country | String | Страна отправителя |
fields.reg_name | String | Имя получателя |
fields.reg_name_f | String | Фамилия получателя |
Ответ ←
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Перевод на карты банков Казахстана
Запрос выполняет денежный перевод на карты Visa или MasterCard, выпущенные банками Казахстана.
Запрос → POST
curl -X POST \ --location \ "https://edge.qiwi.com/sinap/api/terms/27292/payments" \ -H "authorization: Bearer " \ -H "accept: application/vnd.qiwi.v2+json" \ -H "sec-fetch-site: same-site" \ -H "sec-fetch-mode: cors" \ -H "sec-fetch-dest: empty" \ -H "Content-Type: application/json" \ -d '< "id": "", "sum": < "amount": , "currency": "398" >, "paymentMethod": < "accountId": "398", "type": "Account" >, "comment": "", "fields": < "cardNumber": "", "version": "2", "transferSum": "100", "info": "Для продолжения оплаты, подтвердите, что являетесь держателем указанного банковского счета.", "accept": "1", "account": "", "ev_account1": "" > >`
POST /sinap/api/terms/27292/payments HTTP/1.1 Content-Type: application/json Accept: application/vnd.qiwi.v2+json Authorization: Bearer sec-fetch-site: same-site sec-fetch-mode: cors sec-fetch-dest: empty Host: edge.qiwi.com "id":"21131343", "sum": "amount":1000, "currency":"398" >, "paymentMethod": "type":"Account", "accountId":"398" >, "fields": "cardNumber": "", "version": "2", "transferSum": "100", "info": "Для продолжения оплаты, подтвердите, что являетесь держателем указанного банковского счета." "accept": "1", "account": "", "ev_account1": "" > >
URL /sinap/api/terms/27292/payments
HEADERS
- Accept: application/vnd.qiwi.v2+json
- Content-type: application/json
- Authorization: Bearer ***
- sec-fetch-site: same-site
- sec-fetch-mode: cors
- sec-fetch-dest: empty
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа передается во вложенном объекте fields :
Название | Тип | Описание |
---|---|---|
fields.cardNumber | String | Номер банковской карты получателя (без пробелов) |
fields.account | String | Значение поля account из ответа на подготовительный запрос |
fields.ev_account1 | String | Значение поля ev_account1 из ответа на подготовительный запрос |
fields.transferSum | String | Всегда 100 |
fields.accept | String | Всегда 1 |
fields.info | String | Всегда Для продолжения оплаты, подтвердите, что являетесь держателем указанного банковского счета. |
Ответ ←
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Подготовительный запрос для перевода на карту
Запрос → POST
Пример подготовительного запроса
curl -X POST \ "https://edge.qiwi.com/sinap/api/refs/a42ebc79-0584-4271-b8a0-15cb4ea8b340/containers" \ --header "Content-Type: application/json" \ --header "Accept: application/vnd.qiwi.v1+json" \ --header "Authorization: Bearer " \ -H 'sec-fetch-site: same-site' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-dest: empty' \ --data-raw '","version":"2","transferSum":"100","src":"sinap">' \ --compressed
POST /sinap/api/refs/a42ebc79-0584-4271-b8a0-15cb4ea8b340/containers HTTP/1.1 Content-Type: application/json Accept: application/vnd.qiwi.v1+json Authorization: Bearer YUu2qw048gtdsvlk3iu sec-fetch-site: same-site sec-fetch-mode: cors sec-fetch-dest: empty Host: edge.qiwi.com "cardNumber":"", "version":"2", "transferSum":"100", "src":"sinap" >
URL /sinap/api/refs/a42ebc79-0584-4271-b8a0-15cb4ea8b340/containers
HEADERS
- Accept: application/vnd.qiwi.v1+json
- Content-type: application/json
- Authorization: Bearer ***
- sec-fetch-site: same-site
- sec-fetch-mode: cors
- sec-fetch-dest: empty
Параметры
Название | Тип | Описание |
---|---|---|
cardNumber | String | Номер банковской карты получателя (без пробелов) |
transferSum | String | Всегда 100 |
version | String | Всегда 2 |
src | String | Всегда sinap |
Ответ ←
. "elements":[ "type":"field", "name":"account", "value":"" >, "type":"field", "name":"ev_account1", "value":"" > ]
Успешный JSON-ответ содержит блоки «name»: «account» и «name»: «ev_account1» . Сохраните значения из поля value для передачи в платежном запросе.
Банковский перевод
Запрос выполняет денежный перевод на карты/счета физических лиц, открытые в российских банках.
Перевод по номеру карты
Запрос выполняет денежный перевод на карты физических лиц, выпущенные российскими банками.
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/sinap/api/v2/terms/464/payments" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ -d '< "id":"21131343", "sum": < "amount":1000, "currency":"643" >, "paymentMethod": < "type":"Account", "accountId":"643" >, "fields": < "account_type": "1", "account":"4256********1231", "exp_date": "0422" >>'
POST /sinap/api/v2/terms/464/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "id":"21131343", "sum": "amount":1000, "currency":"643" >, "paymentMethod": "type":"Account", "accountId":"643" >, "fields": "account":"4256********1231", "account_type": "1", "exp_date": "0422" > >
URL /sinap/api/v2/terms/ /payments
ID — идентификатор провайдера. Возможные значения:
- 464 — Альфа-Банк
- 804 — АО «ОТП БАНК»
- 810 — АО «РОССЕЛЬХОЗБАНК»
- 815 — Русский Стандарт
- 816 — ВТБ (ПАО)
- 821 — Промсвязьбанк
- 870 — ПАО Сбербанк
- 881 — Ренессанс Кредит
- 1134 — ПАО «МОСКОВСКИЙ КРЕДИТНЫЙ БАНК»
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа передается во вложенном объекте fields :
Название | Тип | Описание |
---|---|---|
fields.account | String | Номер банковской карты получателя (без пробелов) |
fields.exp_date | String | Срок действия карты, в формате ММГГ (например, 0218 ). Параметр указывается только в случае перевода на карту Альфа-Банка (ID 464) и Промсвязьбанка (ID 821). |
fields.account_type | String | Тип банковского идентификатора. Номер карты соответствует типу 1 . Для некоторых банков применяются собственные значения: Россельхозбанк — 5 ВТБ — 5 Промсвязьбанк — 7 Сбербанк — 5 МОСКОВСКИЙ КРЕДИТНЫЙ БАНК — 5 . |
fields.mfo | String | БИК соответствующего банка/территориального отделения банка |
fields.lname | String | Фамилия получателя |
fields.fname | String | Имя получателя |
fields.mname | String | Отчество получателя |
Ответ ←
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Перевод по номеру счета/договора
Запрос выполняет денежный перевод на счета физических лиц, открытые в российских банках. Возможен обычный перевод или перевод с использованием сервиса срочного перевода (исполнение в течение часа, с 9:00 до 19:30).
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/sinap/api/v2/terms/816/payments" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ -d '< "id":"21131343", "sum": < "amount":1000, "currency":"643" >, "paymentMethod": < "type":"Account", "accountId":"643" >, "fields": < "account_type": "2", "urgent": "0", "lname": "Иванов", "fname": "Иван", "mname": "Иванович", "mfo": "046577795", "account":"40817***" >>'
POST /sinap/api/v2/terms/816/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "id":"21131343", "sum": "amount":1000, "currency":"643" >, "paymentMethod": "type":"Account", "accountId":"643" >, "fields": "account_type": "2", "urgent": "0", "lname": "Иванов", "fname": "Иван", "mname": "Иванович", "mfo": "046577795", "account":"40817***" > >
URL /sinap/api/v2/terms/ /payments
ID — идентификатор провайдера. Возможные значения:
- 313 — ХоумКредит Банк
- 464 — Альфа-Банк
- 821 — Промсвязьбанк
- 804 — АО «ОТП БАНК»
- 810 — АО «РОССЕЛЬХОЗБАНК»
- 816 — ВТБ (ПАО)
- 819 — АО ЮНИКРЕДИТ БАНК
- 868 — КИВИ БАНК (АО)
- 870 — ПАО Сбербанк
- 1134 — ПАО «МОСКОВСКИЙ КРЕДИТНЫЙ БАНК»
- 27324 — АО «РАЙФФАЙЗЕНБАНК»
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа передается во вложенном объекте fields :
Название | Тип | Описание |
---|---|---|
fields.account | String | Номер банковского счета получателя |
fields.urgent | String | Признак ускоренного перевода. Значение 0 — не использовать; значение 1 — выполнить перевод через Сервис срочного перевода ЦБ РФ. Внимание! Взимается дополнительная комиссия за ускоренный перевод |
fields.mfo | String | БИК соответствующего банка/территориального отделения банка |
fields.account_type | String | Тип банковского идентификатора. Номер счета ( 2 ) или номер договора ( 3 ). Для некоторых банков применяются собственные значения: Промсвязьбанк — 9 ВТБ — 5 ХоумКредит Банк — 6 . |
fields.lname | String | Фамилия получателя |
fields.fname | String | Имя получателя |
fields.mname | String | Отчество получателя |
fileds.agrnum | String | Номер договора. Только для переводов в ХоумКредит Банк |
Ответ ←
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Оплата других услуг
Оплата услуги по идентификатору пользователя. Запрос применяется для провайдеров, использующих в реквизитах единственный пользовательский идентификатор, без проверки номера аккаунта.
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/sinap/api/v2/terms/674/payments" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ -d '< "id":"21131343", "sum": < "amount":100, "currency":"643" >, "paymentMethod": < "type":"Account", "accountId":"643" >, "fields": < "account":"111000000" >>'
POST /sinap/api/v2/terms/674/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com "id":"21131343", "sum": "amount":100, "currency":"643" >, "paymentMethod": "type":"Account", "accountId":"643" >, "fields": "account":"111000" > >
import requests import time # оплата простого провайдера def pay_simple_prv(api_access_token, prv_id, to_account, sum_pay): s = requests.Session() s.headers['Accept'] = 'application/json' s.headers['Content-Type'] = 'application/json' s.headers['authorization'] = 'Bearer ' + api_access_token postjson = "id":"","sum": "amount":"","currency":"643">,"paymentMethod": "type":"Account","accountId":"643">,"fields": "account":"">> postjson['id'] = str(int(time.time() * 1000)) postjson['sum']['amount'] = sum_pay postjson['fields']['account'] = to_account res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/'+prv_id+'/payments', json = postjson) return res.json()
URL /sinap/api/v2/terms/ /payments
ID — идентификатор провайдера. Возможные значения:
- 674 — OnLime.
- 1239 — Фонд Подари жизнь.
- Идентификатор другого интернет-провайдера или благотворительного фонда. Воспользуйтесь поиском провайдера по ключевым словам.
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа передается во вложенном объекте fields :
Название | Тип | Описание |
---|---|---|
fields.account | String | Пользовательский идентификатор |
Ответ ←
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Платеж по свободным реквизитам
Оплата услуг коммерческих организаций по их банковским реквизитам.
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/sinap/api/v2/terms/1717/payments" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \ --header "User-Agent: ***" \ -d '< "id":"21131343", "sum": < "amount":1000, "currency":"643" >, "paymentMethod": < "type":"Account", "accountId":"643" >, "fields": < "extra_to_bik":"044525201", "requestProtocol":"qw1", "city":"МОСКВА", "name":"ПАО АКБ \"АВАНГАРД\"", "to_bik":"044525201", "urgent":"0", "to_kpp":"772111001", "is_commercial":"1", "nds":"НДС не облагается", "goal":" Оплата товара по заказу №090738231", "from_name_p":"Николаевич", "from_name":"Иван", "from_name_f":"Михайлов", "info":"Коммерческие организации", "to_name":"ООО \"Технический Центр ДЕЛЬТА\"", "to_inn":"7726111111", "account":"40711100000012321", "toServiceId":"1717" >>'
POST /sinap/api/v2/terms/1717/payments HTTP/1.1 Content-Type: application/json Accept: application/json Authorization: Bearer Host: edge.qiwi.com User-Agent: **** "id":"21131343", "sum": "amount":1000, "currency":"643" >, "paymentMethod": "type":"Account", "accountId":"643" >, "fields": "extra_to_bik":"044525201", "requestProtocol":"qw1", "city":"МОСКВА", "name":"ПАО АКБ \"АВАНГАРД\"", "to_bik":"044525201", "urgent":"0", "to_kpp":"772111001", "is_commercial":"1", "nds":"НДС не облагается", "goal":" Оплата товара по заказу №090738231", "from_name_p":"Николаевич", "from_name":"Иван", "from_name_f":"Михайлов", "info":"Коммерческие организации", "to_name":"ООО \"Технический Центр ДЕЛЬТА\"", "to_inn":"7726111111", "account":"40711100000012321", "toServiceId":"1717" > >
URL /sinap/api/v2/terms/1717/payments
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer ***
Параметры
В теле запроса передается JSON-объект. Структура объекта описана в классе Payment. Набор реквизитов платежа передается во вложенном объекте fields :
Название | Тип | Описание |
---|---|---|
fields.name | String | Наименование банка получателя (кавычки экранируются символом \ ) |
fields.extra_to_bik | String | БИК банка получателя |
fields.to_bik | String | БИК банка получателя |
fields.city | String | Город местонахождения получателя |
fields.info | String | Константа, Коммерческие организации |
fields.is_commercial | String | Служебная информация, константа 1 |
fields.to_name | String | Наименование организации (кавычки экранируются символом \ ) |
fields.to_inn | String | ИНН организации |
fields.to_kpp | String | КПП организации |
fields.nds | String | Признак уплаты НДС. Если вы оплачиваете квитанцию и в ней не указан НДС, то строка НДС не облагается . В ином случае, строка В т.ч. НДС . |
fields.goal | String | Назначение платежа |
fields.urgent | String | Признак срочного платежа ( 0 — нет, 1 — да). Срочный платеж выполняется от 10 минут. Возможен по будням с 9:00 до 20:30 по московскому времени. Стоимость услуги — 25 рублей. |
fields.account | String | Номер счета получателя |
fields.from_name | String | Имя плательщика |
fields.from_name_p | String | Отчество плательщика |
fields.from_name_f | String | Фамилия плательщика |
fields.requestProtocol | String | Служебная информация, константа qw1 |
fields.toServiceId | String | Служебная информация, константа 1717 |
Ответ ←
В успешном JSON-ответе возвращается объект со структурой класса PaymentInfo с данными о принятом платеже.
Поиск провайдера по ключевым словам
Используйте этот запрос для поиска идентификатора провайдера. В запросе указывается список ключевых слов (например, название провайдера), разделенных пробелами.
Запрос → GET
curl -X GET \ "https://edge.qiwi.com/search/v1/search?query=%D0%91%D0%B8%D0%BB%D0%B0%D0%B9%D0%BD+%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9+%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82" \ --header "Accept: application/json" \ --header "Authorization: Bearer "
GET /search/v1/search?query=%D0%91%D0%B8%D0%BB%D0%B0%D0%B9%D0%BD+%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9+%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82 HTTP/1.1 Accept: application/json Host: edge.qiwi.com Authorization: Bearer
import requests # поиск на qiwi.com - определение id провайдера по названию def qiwi_com_search(api_access_token, search_phrase): s = requests.Session() s.headers['authorization'] = 'Bearer ' + api_access_token search = s.get('https://edge.qiwi.com/search/v1/search', params='query':search_phrase>) return search.json()['items']
URL https://edge.qiwi.com/search/v1/search?query=
query — строка ключевых слов, разделенных пробелами.
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "items": [ "name": "МТС Домашний интернет, ТВ и Телефония РФ", "description": "МТС Домашний интернет, ТВ и Телефония РФ", "uri": null, "data": "id": 23729, "logoUrl": "https://static.qiwi.com/img/providers/logoBig/23729_l.png", . > >, . ] >
# Поиск провайдера: парсинг ответа prv = qiwi_com_search('xxxxxxxxxxxxxxxxxxx','Билайн домашний интернет')[0]['data']['id'] print(str(prv))
Успешный JSON-ответ содержит идентификаторы найденных провайдеров:
Поле ответа | Тип | Описание |
---|---|---|
items | Array | Список провайдеров |
items[].data.id | Number | Идентификатор провайдера |
Поиск сотового оператора по номеру телефона
Используйте этот запрос для поиска идентификатора провайдера сотового оператора. В запросе указывается номер мобильного телефона в формате 11 цифр, начинающийся с цифры 7 . Действует только для мобильных операторов РФ и Казахстана.
Запрос → GET
curl "https://edge.qiwi.com/qw-mobile-providers-resolver/v1/providers?phoneNumber=79277010101" \ --header "Accept: application/json" \ --header "Authorization: Bearer " \
GET /qw-mobile-providers-resolver/v1/providers?phoneNumber=79270010101 HTTP/1.1 Accept: application/json Host: edge.qiwi.com Authorization: Bearer
import requests # поиск на qiwi.com - определение id провайдера по номеру телефона def qiwi_com_search_mobile(api_access_token, number): s = requests.Session() s.headers['authorization'] = 'Bearer ' + api_access_token search = s.get('https://edge.qiwi.com/qw-mobile-providers-resolver/v1/providers', params='phoneNumber':number>) return search.json()['mobileOperatorProviderList']
URL https://edge.qiwi.com/qw-mobile-providers-resolver/v1/providers?phoneNumber=
value — номер мобильного телефона в формате 11 цифр, начинающийся с 7 .
HEADERS
- Accept: application/json
- Authorization: Bearer ***
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "mobileOperatorProviderList": [ "id": 3, "shortName": "МегаФон Столичный филиал", "logoUrl": "https://static.qiwi.com/img/providers/logoBig/3_l.png" > ] >
# Поиск провайдера: парсинг ответа prv = qiwi_com_search_mobile('xxxxxxxxxxxxxxxxxxx','79270010101')[0]['id'] print(str(prv))
Успешный JSON-ответ содержит идентификатор найденного провайдера:
Поле ответа | Тип | Описание |
---|---|---|
mobileOperatorProviderList | Array | Информация о провайдере |
id | Number | Идентификатор провайдера |
shortName | String | Название провайдера |
Модели данных API
Класс Payment
Класс, описывающий данные для платежа на провайдера в QIWI Кошельке.
Элемент | Тип | Описание |
---|---|---|
id | String | Обязательный параметр. Клиентский ID транзакции (максимум 20 цифр). Должен быть уникальным для каждой транзакции и увеличиваться с каждой последующей транзакцией. Для выполнения этих требований рекомендуется задавать равным 1000*(Standard Unix time в секундах). |
sum | Object | Обязательный параметр. Данные о сумме платежа |
sum.amount | Number | Обязательный параметр. Сумма (можно указать рубли и копейки, разделитель . ). Положительное число, округленное до 2 знаков после десятичной точки. При большем числе знаков значение будет округлено до копеек в меньшую сторону. |
sum.currency | String | Обязательный параметр. Валюта (только 643 , рубли) |
paymentMethod | Object | Обязательный параметр. Объект, определяющий обработку платежа процессингом QIWI Wallet. |
paymentMethod.type | String | Обязательный параметр. Константа, Account |
paymentMethod.accountId | String | Обязательный параметр. Константа, 643 |
fields | Object | Обязательный параметр. Реквизиты платежа. Состав полей зависит от провайдера. |
comment | String | Комментарий к платежу. Используется только для переводов на QIWI кошелек и при конвертации |
Класс PaymentInfo
"id": "150217833198900", "terms": "99", "fields": "account": "79121238345" >, "sum": "amount": 100, "currency": "643" >, "transaction": "id": "11155897070", "state": "code": "Accepted" > >, "source": "account_643", "comment": "Комментарий" >
Пример ответа с маскированным полем
"id": "21131343", "terms": "1963", "fields": "account": "4256********1231" >, "sum": "amount": 1000, "currency": "643" >, "source": "account_643", "transaction": "id": "4969142201", "state": "code": "Accepted" > > >
Класс, описывающий данные платежной транзакции в QIWI Кошельке. Возвращается в ответе на запросы к платежному API.
Элемент | Тип | Описание |
---|---|---|
id | Number | Копия параметра id из платежного запроса |
terms | String | Идентификатор провайдера, на которого был отправлен платеж |
fields | Object | Копия объекта fields из платежного запроса. Номер карты (если был выполнен перевод на карту) возвращается в маскированном виде |
sum | Object | Копия объекта sum из платежного запроса |
source | String | Константа, account_643 |
comment | String | Копия параметра comment из платежного запроса (возвращается, если присутствует в запросе) |
transaction | Object | Объект с данными о транзакции в процессинге QIWI Wallet. |
transaction.id | String | ID транзакции в процессинге QIWI Wallet |
transaction.state | Object | Объект содержит текущее состояние транзакции в процессинге QIWI Wallet. |
state.code | String | Текущий статус транзакции, только значение Accepted (платеж принят к проведению). Финальный результат транзакции можно узнать в истории платежей. |
Счета
Счет в QIWI Wallet API — универсальная заявка на платеж или перевод с QIWI кошелька.
В API поддерживаются операции выставления, оплаты и отмены счетов, а также запрос списка неоплаченных счетов вашего QIWI кошелька.
Выставление счета на QIWI кошелек
Для выставления счета на QIWI Кошелек используется протокол API P2P-счетов. Для авторизации используется токен P2P.
Выпуск токена P2P
Вы можете получить токен P2P на p2p.qiwi.com в личном кабинете, или использовать представленный ниже запрос. Этим запросом можно также настроить адрес уведомлений об оплате счетов.
Запрос возвращает в ответе пару токенов P2P:
- поле PublicKey — токен для выставления счета при вызове платежной формы;
- поле SecretKey — токен для выставления счета через API.
Запрос → POST
curl -X POST \ https://edge.qiwi.com/widgets-api/api/p2p/protected/keys/create \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -H 'cache-control: no-cache' \ -d ''
POST /widgets-api/api/p2p/protected/keys/create HTTP/1.1 Host: edge.qiwi.com Authorization: Bearer Content-Type: application/json Accept: application/json User-Agent: **** "keysPairName":"Name", "serverNotificationsUrl":"https://test.com">
HTTP/1.1 200 OK Content-Type: application/json "PublicKey": "XXX", "SecretKey": "YYY">
URL /widgets-api/api/p2p/protected/keys/create
HEADERS
- Content-Type: application/json
- Accept: application/json
- Authorization: Bearer Токен QIWI Wallet API
Параметры
Для авторизации используется токен API QIWI Кошелька.
Параметры передаются в теле запроса как JSON:
Название | Тип | Описание |
---|---|---|
keysPairName | String | Название пары токенов P2P (произвольная строка) |
serverNotificationsUrl | String | URL для уведомлений об оплате счетов (необязательный параметр) |
Список счетов
Метод получения списка неоплаченных счетов вашего кошелька. Список строится в обратном хронологическом порядке. По умолчанию, список разбивается на страницы по 50 элементов в каждой, но вы можете задать другое количество элементов (не более 50). В запросе можно использовать фильтры по времени выставления счета, начальному идентификатору счета.
Запрос → GET
curl -X GET \ --header 'Accept: application/json' \ --header 'Authorization: Bearer ***' \ 'https://edge.qiwi.com/checkout-api/api/bill/search?statuses=READY_FOR_PAY&rows=50'
GET /checkout-api/api/bill/search?statuses=READY_FOR_PAY&rows=50 HTTP/1.1 Accept: application/json Authorization: Bearer *** Host: edge.qiwi.com User-Agent: ****
URL /checkout-api/api/bill/search?statuses=READY_FOR_PAY¶meter=value
HEADERS
- Accept: application/json
- Authorization: Bearer SecretKey
Параметры
Параметры передаются в строке URL запроса:
Название | Тип | Описание |
---|---|---|
statuses | String | Статус неоплаченного счета. Обязательный параметр. Только строка READY_FOR_PAY |
rows | Integer | Максимальное число счетов в ответе, для разбивки списка на страницы. Целое число от 1 до 50. По умолчанию возвращается не более 50 счетов. |
min_creation_datetime | Long | Нижняя временная граница для поиска счетов, Unix-time |
max_creation_datetime | Long | Верхняя временная граница для поиска счетов, Unix-time |
next_id | Number | Начальный идентификатор счета для поиска. Будет возвращен список счетов с идентификаторами, равными или меньше этого значения. Используется для продолжения списка, разбитого на страницы. |
next_creation_datetime | Long | Начальное время для поиска (возвращаются только счета, выставленные ранее этого времени), Unix-time. Используется для продолжения списка, разбитого на страницы. |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "bills": [ "id": 1063702405, "external_id": "154140605", "creation_datetime": 1523025585000, "expiration_datetime": 1523026003808, "sum": "currency": 643, "amount": 100 >, "status": "READY_FOR_PAY", "type": "MERCHANT", "repetitive": false, "provider": "id": 480706, "short_name": "Интернет-магазин цветов", "long_name": "ООО «Ромашка»", "logo_url":"https://static.qiwi.com/img/providers/logoBig/480706_l.png" >, "comment": "Пополнение счета 13515573", "pay_url":"https://oplata.qiwi.com/form?shop=480706&transaction=102263702405" > ] >
Успешный JSON-ответ содержит список неоплаченных счетов вашего кошелька, соответствующих заданному фильтру:
Поле ответа | Тип | Описание |
---|---|---|
bills | Array[Object] | Список счетов. Длина списка равна или меньше параметру rows из запроса, или максимально 50, если параметр не указан |
bills[].id | Integer | Идентификатор счета в QIWI Кошельке |
bills[].external_id | String | Идентификатор счета у мерчанта |
bills[].creation_datetime | Long | Дата/время создания счета, Unix-time |
bills[].expiration_datetime | Long | Дата/время окончания срока действия счета, Unix-time |
bills[].sum | Object | Сведения о сумме счета |
sum.currency | Integer | Валюта суммы счета |
sum.amount | Number | Сумма счета |
bills[].status | String | Константа, READY_FOR_PAY |
bills[].type | String | Константа, MERCHANT |
bills[].repetitive | Boolean | Служебное поле |
bills[].provider | Object | Информация о мерчанте |
provider.id | Integer | Идентификатор мерчанта в QIWI |
provider.short_name | String | Сокращенное название мерчанта |
provider.long_name | String | Полное название мерчанта |
provider.logo_url | String | Ссылка на логотип мерчанта |
bills[].comment | String | Комментарий к счету |
bills[].pay_url | String | Ссылка для оплаты счета на Платежной форме QIWI |
Оплата счета
Метод выполняет безусловную оплату счета без SMS-подтверждения.
Запрос → POST
curl -X POST \ --header 'Content-Type: application/json;charset=UTF-8' \ --header 'Accept: application/json' \ --header 'Authorization: Bearer 68ec21fd52e4244838946dd07ed225a1' \ -d '< "invoice_uid": "1063702405", "currency": "643" >' \ 'https://edge.qiwi.com/checkout-api/invoice/pay/wallet'
POST /checkout-api/invoice/pay/wallet HTTP/1.1 Accept: application/json Content-type: application/json Authorization: Bearer *** Host: edge.qiwi.com User-Agent: **** "invoice_uid": "1063702405", "currency": "643" >
URL /checkout-api/invoice/pay/wallet
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer SecretKey
Параметры
Обязательные параметры в теле запроса:
Название | Тип | Описание |
---|---|---|
invoice_uid | String | ID счета в QIWI; берется из значения bills[].id данных о счете |
currency | String | Валюта суммы счета; берется из значения bills[].sum.currency данных о счете |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "invoice_status": "PAID_STATUS", "is_sms_confirm": false, "WALLET_ACCEPT_PAY_RESULT": <> >
Успешный JSON-ответ содержит статус оплаченного счета:
Поле ответа | Тип | Описание |
---|---|---|
invoice_status | String | Строка кода статуса оплаты счета, PAID_STATUS . Любой другой статус означает неуспех платежной транзакции. |
is_sms_confirm | String | Признак подтверждения по SMS |
Отмена неоплаченного счета
Метод отклоняет неоплаченный счет, что делает его недоступным для оплаты.
Запрос → POST
curl -X POST \ --header 'Accept: application/json' \ --header 'Authorization: Bearer ***' \ --header 'Content-Type: application/json;charset=UTF-8' \ -d '< "id": 1034353453 >' \ 'https://edge.qiwi.com/checkout-api/api/bill/reject'
POST /checkout-api/api/bill/reject HTTP/1.1 Accept: application/json Authorization: Bearer *** Content-type: application/json Host: edge.qiwi.com User-Agent: **** "id": 1034353453 >
URL /checkout-api/api/bill/reject
HEADERS
- Accept: application/json
- Content-type: application/json
- Authorization: Bearer SecretKey
Параметры
Обязательный параметр передается в теле запроса в формате JSON:
Название | Тип | Описание |
---|---|---|
id | Integer | ID счета для отмены; берется из значения bills[].id данных о счете |
Ответ ←
HTTP/1.1 200 OK
Успешный ответ содержит HTTP-код 200 .
Уведомления (вебхуки)
Предложить правки на GitHub
Хуки или уведомления с данными о событии (платеже/пополнении) отправляются на ваш сервер. В настоящее время поддерживаются только вебхуки (webhook) — сообщения, адресованные веб-сервисам. Для приема вебхуков вам необходимо настроить свой сервер на прием и обработку POST-запросов (Формат запросов).
От вашего сервера успешный ответ 200 OK на входящий запрос должен поступить в течение 1-2 сек. Не дождавшись ответа, сервис КИВИ отправляет еще одно уведомление через 10 минут, потом еще одно через 1 час.
Пулы IP-адресов, с которых сервисы QIWI отправляют webhook:
- 79.142.16.0/20
- 195.189.100.0/22
- 91.232.230.0/23
- 91.213.51.0/24
Если ваш сервер обработки вебхуков работает за брандмауэром, необходимо добавить эти IP-адреса в список разрешенных адресов входящих TCP-пакетов.
Быстрый старт
- Реализуйте веб-сервис обработки запросов. Особое внимание обратите на реализацию проверки подписи.
- Зарегистрируйте свой обработчик. Внимание! Длина оригинального (не URL-encoded) адреса сервиса обработчика не должна превышать 100 символов.
- Запросите ключ проверки подписи.
- Протестируйте прием запросов вашим обработчиком с помощью тестового запроса. На зарегистрированный в п.2 сервис придет пустое уведомление.
Чтобы сменить адрес сервера для обработки вебхуков:
- Удалите обработчик вебхуков.
- Зарегистрируйте новый обработчик. Внимание! Длина оригинального (не URL-encoded) адреса сервиса обработчика не должна превышать 100 символов.
- Запросите ключ проверки подписи для нового обработчика.
- Протестируйте прием запросов новым обработчиком с помощью тестового запроса. На зарегистрированный в п.2 сервис придет пустое уведомление.
Обработка вебхука
Исходящие платежи — платеж в проведении
POST /some-hook.php HTTP/1.1 Accept: application/json Content-type: application/json Host: example.com "hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945", "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", "messageId": "f9a197a8-26b6-4d42-aac4-d86b789c373c", "payment": "account": "myAccount", "comment": "Комментарий", "commission": Null, "date": "2018-05-18T16:05:15+03:00", "errorCode": "0", "personId": 79254914194, "provider": 25549, "signFields": "sum.currency,sum.amount,type,account,txnId", "status": "WAITING", "sum": "amount": 1.73, "currency": 643>, "total": "amount": 1.73, "currency": 643>, "txnId": "13117338074", "type": "OUT">, "test": false, "version": "1.0.0">
Исходящие платежи — успешный платеж
POST /some-hook.php HTTP/1.1 Accept: application/json Content-type: application/json Host: example.com "hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945", "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", "messageId": "6e2a0e32-4c8d-4fe2-9eed-fe3b6a726ff4", "payment": "account": "masterDre", "comment": "Комментарий", "commission": "amount": 0.0, "currency": 643>, "date": "2018-05-18T16:05:15+03:00", "errorCode": "0", "personId": 79254914194, "provider": 25549, "signFields": "sum.currency,sum.amount,type,account,txnId", "status": "SUCCESS", "sum": "amount": 1.73, "currency": 643>, "total": "amount": 1.73, "currency": 643>, "txnId": "13117338074", "type": "OUT">, "test": false, "version": "1.0.0">
Исходящие платежи — неуспешный платеж
POST /some-hook.php HTTP/1.1 Accept: application/json Content-type: application/json Host: example.com "hash": "0637b07b1018d76585db26b0f8077016b12996006429e22a7dc5b6982710a1ef", "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", "messageId": "1133873b-9bb6-4adb-9bfe-7be3a9aa999f", "payment": "account": "borya241203", "comment": "Комментарий", "commission": None, "date": "2018-05-20T05:19:16+03:00", "errorCode": "5", "personId": 79254914194, "provider": 25549, "signFields": "sum.currency,sum.amount,type,account,txnId", "status": "ERROR", "sum": "amount": 1.01, "currency": 643>, "total": "amount": 1.01, "currency": 643>, "txnId": "13126423989", "type": "OUT">, "test": false, "version": "1.0.0">
Входящие платежи — успешный платеж
POST /some-hook.php HTTP/1.1 Accept: application/json Content-type: application/json Host: example.com "hash": "a56ed0090fa3fd2fd0b002ed80f85a120037a6a85f840938888275e1631da96f", "hookId": "8c79f60d-0272-476b-b120-6e7629467328", "messageId": "bba24947-ab5f-4b33-881b-738fc3a4c9e1", "payment": "account": "79042426915", "comment": "Пополнение кошелька", "commission": "amount": 0.0, "currency": 643>, "date": "2018-03-25T13:16:48+03:00", "errorCode": "0", "personId": 79645265240, "provider": 7, "signFields": "sum.currency,sum.amount,type,account,txnId", "status": "SUCCESS", "sum": "amount": 1.09, "currency": 643>, "total": "amount": 1.09, "currency": 643>, "txnId": "12565018935", "type": "IN">, "test": false, "version": "1.0.0">
Каждый вебхук посылает уведомления — входящие POST-запросы с JSON-объектом, содержащим данные об одном платеже. Схема объекта:
Поле | Тип | Описание |
---|---|---|
hookId | String (UUID) | Уникальный id хука |
messageId | String (UUID) | Уникальный id уведомления |
payment | Object | Данные платежа |
payment.txnId | String | ID транзакции в процессинге QIWI Wallet |
payment.account | String | Для платежей — номер счета получателя. Для пополнений — номер отправителя, терминала или название агента пополнения кошелька |
payment.signFields | String | Список полей объекта payment (через , ), которые хешируются алгоритмом HmacSHA256 для проверки уведомления (см. параметр hash ) |
payment.personId | Integer | Номер кошелька |
payment.date | String DateTime | Дата/время платежа, в московской временной зоне. Формат даты ГГГГ-ММ-ДД’T’чч:мм:сс+03:00 |
payment.errorCode | String | Код ошибки платежа |
payment.type | String | Тип платежа. Возможные значения: IN — пополнение, OUT — платеж |
payment.status | String | Статус платежа. Возможные значения: WAITING — платеж проводится, SUCCESS — успешный платеж, ERROR — ошибка платежа. |
payment.provider | Integer | ID провайдера QIWI Wallet |
payment.comment | String | Комментарий к транзакции |
payment.sum | Object | Данные о сумме платежа или пополнения. Параметры: |
sum.amount | Number(Decimal) | Сумма |
sum.currency | Number(3) | Код валюты |
payment.commission | Object | Данные о комиссии для платежа или пополнения. Параметры: |
commission.amount | Number(Decimal) | Сумма |
commission.currency | Number(3) | Код валюты |
payment.total | Object | Данные об итоговой сумме платежа или пополнения. Параметры: |
total.amount | Number(Decimal) | Сумма |
total.currency | Number(3) | Код валюты |
test | Boolean | Признак тестового сообщения |
version | String | Версия API |
hash | String | Хэш цифровой подписи уведомления |
Как проверить подпись уведомления
//Функция возвращает упорядоченную строку значений параметров webhook и хэш подписи webhook для проверки function getReqParams() //Make sure that it is a POST request. if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) throw new Exception('Request method must be POST!'); > //Receive the RAW post data. $content = trim(file_get_contents("php://input")); //Attempt to decode the incoming RAW post data from JSON. $decoded = json_decode($content, true); //If json_decode failed, the JSON is invalid. if(!is_array($decoded)) throw new Exception('Received content contained invalid JSON!'); > //Check if test if ($decoded['test'] == 'true') throw new Exception('Test!'); > // Строка параметров $reqparams = $decoded['payment']['sum']['currency'] . '|' . $decoded['payment']['sum']['amount'] . '|'. $decoded['payment']['type'] . '|' . $decoded['payment']['account'] . '|' . $decoded['payment']['txnId']; // Подпись из запроса foreach ($decoded as $name=>$value) if ($name == 'hash') $SIGN_REQ = $value; > > return [$reqparams, $SIGN_REQ]; > // Список параметров и подпись $Request = getReqParams(); // Base64 encoded ключ для дешифровки вебхуков (метод /hook//key) $NOTIFY_PWD = "JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc p">; // Вычисляем хэш SHA-256 строки параметров и шифруем с ключом для веб-хуков $reqres = hash_hmac("sha256", $Request[0], base64_decode($NOTIFY_PWD)); // Проверка подписи вебхука if (hash_equals($reqres, $Request[1])) $error = array('response' => 'OK'); > else $error = array('response' => 'error'); //Ответ header('Content-Type: application/json'); $jsonres = json_encode($error); echo $jsonres; error_log('error code' . $jsonres); ?>
import base64 import hmac import hashlib import requests # Base64 encoded ключ для расшифровки вебхука (/hook//key) webhook_key_base64 = 'JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=' # строка параметров из запроса data = '643|1|IN|+79161112233|13353941550' # хэш подписи из запроса sign_hash = 'f05c4e7bdf00620205d47696d77f924bfd3ba4d02b0398ac8a626e737dc27243' webhook_key = base64.b64decode(bytes(webhook_key_base64,'utf-8')) print('Signature verified?') print(hmac.new(webhook_key, data.encode('utf-8'), hashlib.sha256).hexdigest() == sign_hash)
Реализуйте шаги проверки подписи:
- Возьмите значения полей из списка в payment.signFields уведомления (в том же порядке) в формате String.
- Объедините значения в строку с разделителями | .
- Зашифруйте строку п.2 алгоритмом SHA-256 с ключом проверки подписи.
- Сравните полученное значение со значением поля hash уведомления.
Пример расшифровки подписи (см. также функцию PHP на вкладке справа):
- По запросу пользователь получает ключ вебхука, закодированный в Base64: JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=
- Приходит уведомление , «commission»:, «total»:, «signFields»:»sum.currency,sum.amount,type,account,txnId»>, «hash»:»76687ffe5c516c793faa46fafba0994e7ca7a6d735966e0e0c0b65eaa43bdca0″,»version»:»1.0.0″,»test»:false>
- Склеиваются требуемые поля платежных данных (указаны в payment.signFields — sum.currency,sum.amount,type,account,txnId ): 643|1|IN|+79161112233|13353941550
- Поля шифруются методом SHA-256 с Base64-раскодированным ключом из п.1. Результат f05c4e7bdf00620205d47696d77f924bfd3ba4d02b0398ac8a626e737dc27243 совпадает с параметром hash из запроса.
Регистрация обработчика вебхуков
Запрос → PUT
curl -X PUT \ "https://edge.qiwi.com/payment-notifier/v1/hooks?hookType=1¶m=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2" \ -H "accept: */*" \ -H "authorization: Bearer "
PUT /payment-notifier/v1/hooks?hookType=1¶m=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2 HTTP/1.1 Host: edge.qiwi.com Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f User-Agent: ****
URL /payment-notifier/v1/hooks?parameter=value
HEADERS
- Authorization: Bearer ***
- Accept: application/json
Параметры
Название | Тип | Описание |
---|---|---|
hookType | Integer | Тип хука. Только 1 — вебхук. |
param | URL-encoded | Адрес сервера обработки вебхуков. Длина исходного (не URL-encoded) адреса — не более 100 символов. URL обработчика должен быть доступен из Интернета. |
txnType | String | Тип транзакций, по которым будут включены уведомления. Возможные значения: 0 — только входящие транзакции (пополнения); 1 — только исходящие транзакции (платежи); 2 — все транзакции |
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc", "hookParameters": "url":"http://example.com/callbacks/" >, "hookType":"WEB", "txnType":"BOTH" >
Ответ в формате JSON.
Название | Тип | Описание |
---|---|---|
hookId | String | UUID созданного вебхука |
hookParameters | Object | Набор параметров вебхука (только URL) |
hookType | String | Тип вебхука (только WEB) |
txnType | String | Тип транзакций, по которым отсылаются уведомления ( IN — входящие, OUT — исходящие, BOTH — все) |
Удаление обработчика вебхуков
Запрос → DELETE
curl -X DELETE \ "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc" \ -H "accept: */*" \ -H "authorization: Bearer "
DELETE /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc HTTP/1.1 Host: edge.qiwi.com Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f User-Agent: ****
URL /payment-notifier/v1/hooks/hookId
HEADERS
- Authorization: Bearer ***
- Accept: application/json
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "response":"Hook deleted" >
Формат ответа JSON.
Название | Тип | Описание |
---|---|---|
response | String | Описание результата операции |
Получение секретного ключа
Каждое уведомление содержит цифровую подпись сообщения, зашифрованную ключом. Используйте запрос для получения ключа проверки подписи.
Запрос → GET
curl -X GET \ "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key" \ -H "accept: */*" \ -H "accept: */*" \ -H "authorization: Bearer "
GET /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key HTTP/1.1 Host: edge.qiwi.com Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f User-Agent: ****
URL /payment-notifier/v1/hooks/hookId/key
HEADERS
- Authorization: Bearer ***
- Accept: application/json
Ответ ←
HTTP/1.1 201 Created Content-Type: application/json "key":"L8UVF3JkLVUr6r70LiE0A9/5WoGGwWKG2pI/e+l/9fs w"> >
Формат ответа JSON.
Название | Тип | Описание |
---|---|---|
key | String | Base64-закодированный ключ |
Изменение секретного ключа
Для смены ключа шифрования уведомлений используйте этот запрос.
Запрос → POST
curl -X POST \ "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey" \ -H "accept: */*" \ -H "authorization: Bearer "
POST /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey HTTP/1.1 Host: edge.qiwi.com Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f User-Agent: ****
URL /payment-notifier/v1/hooks/hookId/newkey
HEADERS
- Authorization: Bearer ***
- Accept: application/json
Ответ ←
HTTP/1.1 201 Created Content-Type: application/json "key":"OikS4/CcIbSf+yYGnLbnOige8RGoYmGxs/LNMwkJy7Q w"> >
Формат ответа JSON.
Название | Тип | Описание |
---|---|---|
key | String | Base64-закодированный новый ключ |
Данные об обработчике уведомлений
Список действующих (активных) обработчиков уведомлений, связанных с вашим кошельком, можно получить данным запросом.
Так как сейчас используется только один тип хука — вебхук, то в ответе содержится только один объект данных.
Запрос → GET
curl -X GET \ "https://edge.qiwi.com/payment-notifier/v1/hooks/active" \ -H "accept: */*" \ -H "accept: */*" \ -H "authorization: Bearer "
GET /payment-notifier/v1/hooks/active HTTP/1.1 Host: edge.qiwi.com Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f User-Agent: ****
URL /payment-notifier/v1/hooks/active
HEADERS
- Authorization: Bearer ***
- Accept: application/json
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc", "hookParameters": "url":"http://example.com/callbacks/" >, "hookType":"WEB", "txnType":"BOTH" >
Формат ответа JSON.
Название | Тип | Описание |
---|---|---|
hookId | String | UUID действующего обработчика вебхуков |
hookParameters | Object | Набор параметров обработчика (только URL) |
hookType | String | Тип вебхука (только WEB) |
txnType | String | Тип транзакций, по которым отсылаются уведомления ( IN — входящие, OUT — исходящие, BOTH — все) |
Отправка тестового уведомления
Для проверки вашего обработчика вебхуков используйте этот запрос. Тестовое уведомление отправляется на адрес, указанный в параметрах действующего обработчика.
Запрос → GET
curl -X GET \ "https://edge.qiwi.com/payment-notifier/v1/hooks/test" \ -H "accept: */*" \ -H "authorization: Bearer "
GET /payment-notifier/v1/hooks/test HTTP/1.1 Host: edge.qiwi.com Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f User-Agent: ****
URL /payment-notifier/v1/hooks/test
HEADERS
- Authorization: Bearer ***
- Accept: application/json
Ответ ←
HTTP/1.1 200 OK Content-Type: application/json "response":"Webhook sent" >
Формат ответа JSON.
Название | Тип | Описание |
---|---|---|
response | String | Результат запроса |
Коды ошибок
Этот раздел на GitHub
В случае ошибки API возвращается HTTP-код ошибки.
HTTP Код | Секция API | Описание |
---|---|---|
400 | Все | Ошибка синтаксиса запроса (неправильный формат данных) |
401 | Все | Неверный токен или истек срок действия токена API |
403 | Все | Нет прав на этот запрос (недостаточно разрешений у токена API) |
404 | История платежей, Информация о транзакции, Отправка квитанции | Не найдена транзакция или отсутствуют платежи с указанными признаками |
404 | Балансы, Профиль пользователя, Идентификация пользователя | Не найден кошелек |
404 | Веб-хуки | Не найден активный веб-хук |
404 | Оплата/Отмена счета | Не найден счет |
422 | Регистрация веб-хука | Неправильно указаны домен/подсеть/хост веб-хука (в параметре param для URL веб-хука), неправильно указаны тип хука или тип транзакции, попытка создать хук при наличии уже созданного |
423 | Все | Слишком много запросов, сервис временно недоступен |
500 | Все | Внутренняя ошибка сервиса (превышена длина URL веб-хука, проблемы с инфраструктурой, недоступность каких-либо ресурсов и т.д.) |
Следующие ошибки возвращаются на запросы истории платежей и информации о транзакции в параметре errorCode ответа:
errorCode | Описание |
---|---|
0 | OK |
3 | Техническая ошибка. Повторите платеж позже. |
4 | Некорректный формат телефона или счета. Проверьте данные. |
5 | Данного номера не существует. Проверьте данные и попробуйте еще раз. |
8 | Техническая проблема на стороне банка-получателя. Попробуйте позже. |
57 | Статус кошелька получателя не позволяет перевести ему деньги. Попросите владельца кошелька повысить его статус: укажите паспортные данные. |
131 | Платеж недоступен для вашей страны |
166 | Ваш статус кошелька не позволяет совершить платеж. Повысьте статус кошелька: укажите паспортные данные. |
167 | Статус кошелька получателя не позволяет перевести ему деньги. Попросите владельца кошелька повысить его статус: указать паспортные данные. |
202 | Техническая ошибка. Повторите платеж позже. |
204 | Ваш статус кошелька не позволяет пополнять его наличными. Повысьте статус кошелька: укажите паспортные данные. |
220 | Недостаточно средств. Пополните кошелек |
241 | Сумма платежа должна быть больше 1 рубля |
242 | Сумма платежа превышает максимально допустимую |
254 | Сумма платежа должна быть больше 1 рубля |
271 | Техническая проблема на стороне банка-получателя. Попробуйте позже. |
300 | Техническая ошибка. Повторите платеж позже. |
303 | Неверный номер телефона — должно быть 10 цифр |
319 | Ваш статус кошелька не позволяет совершить платеж. Повысьте статус кошелька: укажите паспортные данные. |
407 | Недостаточно средств на вашей карте |
408 | У вас уже есть такой платеж — оплатите или отмените его |
455 | Платеж невозможен из-за ограничений на минимальный остаток |
461 | Время подтверждения операции истекло. Попробуйте еще раз. |
472 | Недостаточно денег на кошельке — пополните его |
500 | Техническая ошибка на стороне банка-получателя. Обратитесь в их поддержку. |
522 | Неверный номер или срок действия карты получателя. Проверьте данные и повторите попытку. |
547 | Неверный срок действия карты получателя. Проверьте данные и повторите попытку. |
548 | Истек срок действия карты получателя |
558 | Сумма платежа превышает максимально допустимую |
561 | Банк, куда вы переводите деньги, не принимает платеж. Обратитесь в его поддержку. |
700 | Превышен лимит для вашего статуса кошелька. Повысьте статус или уточните свой текущий лимит в разделе Профиль. |
702 | Платеж невозможен из-за ограничений у получателя. Превышен его лимит на остаток. Получателю необходимо связаться с нашей поддержкой. |
704 | Превышен ежемесячный лимит по вашему кошельку. Чтобы снять ограничения, повысьте статус кошелька в Профиле. |
705 | Превышен ежемесячный лимит по вашему кошельку. Чтобы снять ограничения, повысьте статус кошелька в Профиле. |
710 | Перевод невозможен – превышен лимит платежей за неделю в пользу одного и того же получателя |
711 | Перевод невозможен. Вы превысили лимит платежей для таких операций за месяц. |
716 | Вы превысили месячный лимит на снятие денег с карты. Чтобы снять ограничения, повысьте статус кошелька в Профиле. |
717 | Вы превысили дневной лимит на снятие денег с карты. Чтобы снять ограничения, повысьте статус кошелька в Профиле. |
746 | Перевод невозможен – превышен лимит в пользу одного и того же получателя |
747 | Перевод невозможен. Превышено количество операций в пользу одного и того же получателя. |
749 | Техническая ошибка. Обратитесь в нашу поддержку. |
750 | Техническая ошибка. Повторите платеж позже. |
757 | Превышен лимит на количество платежей. Чтобы снять ограничения, повысьте статус кошелька в Профиле. |
797 | Платеж был отменен, деньги возвращены на ваш кошелек |
852 | Перевод невозможен – превышен лимит в пользу одного и того же получателя |
866 | Платеж не проведен. Превышен лимит 5 000 RUB — на исходящие переводы из RUB, USD, EUR в KZT в месяц. Повысьте статус кошелька в Профиле и платите без ограничений. |
867 | Платеж не проведен. Превышен лимит 5 000 RUB — на входящие переводы из RUB, USD, EUR в KZT в месяц. Повысьте статус кошелька в Профиле и платите без ограничений. |
893 | Перевод отклонен. Истек его срок действия. |
901 | Истек срок действия кода для подтверждения платежа. Повторите платеж. |
943 | Превышен лимит на переводы в месяц. Повысьте статус кошелька в Профиле и переводите без ограничений. |
1050 | Превышен лимит на такие операции. Повысьте статус кошелька в Профиле и расширьте свои возможности. |
7000 | Платеж отклонен. Проверьте реквизиты карты и повторите платеж. |
7600 | Платеж отклонен. Обратитесь в банк, выпустивший карту. |
Инструкция по генерации секретного ключа для «QIWI Wallet»
Переходим на сайт «QIWI» https://p2p.qiwi.com для получения ключей интеграции.
Проходим авторизацию.
В личном кабинете необходимо перейти в раздел «Прием переводов» и открыть вкладку API.
В нижней части раздела видим пункт «Аутентификационные данные». Нажимаем на кнопку «Создать пару ключей и настроить».
Далее в открывшемся окне вводим название ключа и нажимаем «Сохранить»
Примечание: секретный ключ больше виден не будет, сохраните его в надежном месте на компьютере.
Как легально «вскрыть» QIWI Кошелек и прокачать его по полной программе
С недавнего времени пользователям Visa QIWI Кошелька доступны новые методы API. Под катом: что это за API, зачем мы его открыли и почему стоит начать им пользоваться уже сейчас.
История появления API
Формально история нашего API началась в апреле этого года, хотя часть из входящих в него методов была доступна задолго до этого.
Массовый пользовательский сервис QIWI Кошелек постепенно переходит на архитектуру микросервисов, поэтому внутри нашей системы компоненты взаимодействуют друг с другом посредством некоего API. Любой пользователь может зайти на сайт, открыть дебаггер и просмотреть, какие запросы браузер отправляет на сервер. Минимальных навыков программиста достаточно, чтобы вытащить отправляемые запросы и использовать их в собственных решениях в обход сайта.
Желающих так схитрить оказалось довольно много. Это и студенты-энтузиасты, которым интересно поковыряться в деталях работы Кошелька, и профессиональные разработчики, желающие интегрировать отдельные функции сайта QIWI Кошелька в свои решения. В итоге параллельно с развитием сайта начала развиваться целая экосистема сторонних решений в «сером» режиме, не легализованном в пользовательском соглашении и не обеспеченным нашим саппортом.
Вот только скрипты, построенные на результатах самостоятельных исследований сайта, работают у пользователей нестабильно. Разработчики используют разные способы извлечения информации, в том числе откровенно устаревшие методы, создающие дополнительную нагрузку на наши сервера.
Чтобы упорядочить выгрузку данных с сайта, мы приняли решение легализовать ее, как это сделали в свое время в Citibank, Wargaming и Вконтакте. Мы описали наиболее современный и стабильный из существующих способов получения информации, сформировав первую версию пользовательского API.
С появлением документации для разработчиков пользователям больше не нужно разбирать наш сайт по кусочкам, рискуя наткнуться на старые протоколы. По посещаемости раздела документации мы отслеживали, насколько востребован API. Мы также разместили адрес электронной почты для обратной связи и вопросов и мониторили публикации по теме в социальных сетях и форумах. На тот момент перед нами не стояло задачи как-то продвигать API — мы хотели навести порядок и предложить сторонним разработчикам бесплатный, безопасный, проверенный способ доступа.
Публикация документации по API сама по себе никак не отразилась на работе сторонних инструментов доступа к функциям Кошелька. Мы не планировали регламентировать «самострой», но наблюдали за ситуацией, поскольку решения были построены разработчиками на свой страх и риск на основе недокументированных возможностей сервиса. И пока они не затрагивают данные наших пользователей, мы никак с ними не боремся, но стараемся выйти на контакт с их создателями и рекомендовать перейти на использование задокументированного API.
Поскольку запросы проходили через парсинг сайта, очевидно, что решения, использующие выходящие за рамки API методы, будут работать до тех пор, пока соответствующие схемы работают на сайте. Но мы надеемся, что после появления более качественного пути недокументированные решения начнут постепенно отмирать.
Проблемы первой версии
К сожалению, на момент создания первой версии API у нас еще не было отдельной системы аутентификации. Поэтому на том этапе мы использовали схему аутентификации с нашего сайта (CAS), она была разобрана по отдельным командам и опубликована на developer.qiwi.com.
Аутентификация стала ключевой проблемой первого API. Если с точки зрения сайта механизм был правильным (именно так организована аутентификация на большинстве веб-страниц, по принципу двух токенов с разным временем жизни), то пользователю пройти процедуру оказалось довольно сложно. Этот метод изначально не был ориентирован на пользователей, а служил внутренним задачам нашего сайта. В результате возникали различные сложности, к примеру, выскакивала капча «докажите, что вы не робот», что было неожиданностью для пользователей, поскольку API предполагает доступ именно при помощи автоматических систем.
Хотя публикацию открытого API мы никак не афишировали, в сети появилось несколько статей, в том числе с негативными отзывами. На адрес обратной связи api_help@qiwi.com мы получили более сотни писем, смысл которых сводился к тому, что сам по себе API хороший, но аутентификация никуда не годится. Не все пользователи понимали, почему для подключения к финансовому сервису надо проходить столь заковыристую процедуру, в то время как с Instagram или Вконтакте все намного проще. Мы разъясняли, что сложности были обусловлены именно финансовой составляющей, ведь используемый метод (как в аутентификации сайта, так и в API) не должен ставить под угрозу счета клиентов.
Анализируя обратную связь, мы увидели, что API востребован, а критика направлена в основном на систему аутентификации, и приняли решение развивать API дальше.
Обновленный API
Разработка новых методов в рамках API была поручена команде специалистов, которые делают бекэнд для сайта и мобильного приложения QIWI Кошелька. API — их ключевая компетенция, именно эта команда переводит основной сайт на архитектуру микросервисов. И API тут служит для взаимодействия основного сайта и отдельных сущностей через запросы, которые мы передаем нашим пользователям.
Чтобы доработать существующий API и добавить в него новые методы, мы тщательно проанализировали обратную связь от пользователей.
Хотя среди наших клиентов довольно много любителей-энтузиастов, склонных пробовать что-то новое, основная часть пользователей API — профессиональные разработчики, интегрирующие QIWI Кошелек в свои бизнес-процессы (причем, это не интернет-магазины — для юридических лиц у нас предусмотрен отдельный API). В основном речь идет об оптимизации работы Кошелька под собственные нужды: настройке уведомлений, автоматизации оплаты услуг и обмена цифровыми товарами между пользователями, а также других задачах, не связанных с привычной электронной коммерцией.
Опираясь на отзывы, мы предложили новую аутентификацию пользователей через API, добавили новые функции для взаимодействия с Кошельком. В первой версии у нас были описаны запрос баланса, история платежей и отправка перевода. Сейчас их дополнили запрос профиля пользователя, оплата сотовой связи, переводы в банки и на карты по номерам карт, счетов и договоров вместо полных реквизитов.
Новая аутентификация
Для построения системы аутентификации, ориентированной на API, мы использовали стандарт RFC 6749 по открытому протоколу OAuth 2.0. Чтобы аутентификация соответствовала требованиям финансового сервиса, мы обеспечили двухфакторный доступ — по паролю к Кошельку и SMS-коду. Для прохождения процедуры пользователю необходимо выпустить токен, действительный в течение одного месяца 180 дней (выпуск подтверждается SMS-сообщением). По просьбе пользователей в новой версии OAuth 2.0 мы также открыли возможность выбора прав доступа для токена. К примеру, если требуется запросить баланс или получить историю платежей, токену даются права только на чтение. Всего доступно четыре группы прав доступа:
- доступ к информации о профиле пользователя;
- доступ к балансу Кошелька;
- доступ к истории платежей;
- полный доступ к платежам.
Функция оказалась весьма востребована, менее половины токенов выпускается с полными правами (осуществление платежей), многим нужно лишь получение информации.
Профиль пользователя
Одна из новых функций, родившихся внутри нашей команды, а не из пожеланий клиентов — запрос профиля пользователя. Он позволяет получать различную информацию о Кошельке: дату регистрации, привязанный адрес электронной почты, уровень идентификации Кошелька. Последнее особенно важно для финансового сервиса, поскольку уровень идентификации определяет лимиты по операциям для кошелька. Ранее эту информацию можно было найти в настройках Кошелька на сайте qiwi.com, теперь она доступна и через API.
Отметим, что персональные данные пользователя через запрос профиля не доступны — таково требование безопасности.
Комиссионные тарифы
Следуя пожеланиям пользователей, мы добавили в API возможность запрашивать размер комиссии при проведении операций по любому из доступных поставщиков услуг. Метод этот открыт и прохождения процедуры аутентификации не требует.
Оплата сотовой связи
Еще одно нововведение, инициированное нашими пользователями, — инструмент автоматизации оплаты сотовой связи, например, для телефонов курьеров.
Фактически метод состоит из двух этапов:
- автоматическое определение оператора по номеру телефона и ID поставщика услуг в системе (работает даже для номеров, которые переносились от одного оператора к другому (MNP);
- перевод денег на счет оператора.
Переводы в банки и на банковские карты
По аналогии с оплатой сотовой связи эта группа методов API позволяет автоматизировать переводы на банковские карты систем VISA, MasterCard и национальной платежной системы МИР по России и СНГ. Перевод осуществляется по номеру карты, по нему же определяется платежная система.
Банковский перевод — это отдельный метод, используемый для отправки денег в некоторые банки, с которыми у нас реализован онлайн-протокол моментальных переводов. В отличие от обычных денежных переводов по банковским реквизитам, для этих банков можно использовать большее количество идентификаторов клиента (номер карты, договора, счета и т. п.).
Юридическая сторона вопроса
До последнего времени доступ по API был формально запрещен. Все, что выполнялось при помощи API, делалось на свой страх и риск. Если пользователь распарсил сайт, достал из него какие-то команды, провел операции с кошельком, и у него пропали деньги, всю ответственность за последствия своих действий нес он сам. Техническая поддержка никак не участвовала в решении подобных проблем.
Чтобы таких ситуаций больше не возникало, мы внесли в пользовательское соглашение соответствующие изменения. Теперь API имеет официальный статус наравне с сайтом и мобильным приложением.
Что будет дальше?
Перечисленные методы доступа к данным уже работают, а документация по ним опубликована на сайте developer.qiwi.com.
Завершено внутреннее тестирование, и, опубликовав API, мы перешли ко второму этапу — проверке работоспособности связки «пользователь + документация + API». Этот этап должен ответить на вопросы о том, насколько понятна документация, нужны ли какие-то дополнительные пояснения и т. п. Поэтому мы предлагаем пользователям направлять отзывы на наш адрес: api_help@qiwi.com.
В ближайшей перспективе мы планируем расширить возможности API, предоставив сторонним сервисам методы для регистрации новых и аутентификации существующих пользователей в системе, а также проведения от их имени финансовых операций. Это немного иная модель взаимодействия между нами, пользователем и третьей стороной — сторонним сервисом.
Если вам интересны детали разработки новой версии API, пишите и задавайте вопросы в комментариях — мы постараемся ответить на них в наших следующих публикациях.
Внимание, конкурс
Чтобы заинтересовать разработчиков в использовании нового API, мы проводим всероссийский QIWI API Contest. Это первый конкурс в рамках QIWI Open Platform, направленный на популяризацию API компании.
Для участия в конкурсе необходимо создать Mobile First решения — чат-боты, мобильные приложения и web-продукты c использованием API QIWI Кошелька. Наши эксперты отберут наиболее проработанные решения и пригласят до 15 участников в финал конкурса, который пройдет в Москве 23 сентября.
Конкурсанты из других городов могут принять участие дистанционно. Регистрация проектов открыта и продлится до 15 сентября. Заявку на участие можно сделать на сайте QIWI API Contest через Timepad или отправить на почту apimarket@qiwi.com. Для всех вопросов мы создали специальный чат в Telegram.
- теперь токены живут не 30, а 180 дней;
- запустили сайт конкурса QIWI API Contest.