Прием платежей
Редактировать на GitHub
QIWI Wallet Pull API открывает доступ к операциям со счетами в системе QIWI Wallet из вашего приложения. Поддерживаются следующие операции:
- выставление счетов
- отмена неоплаченных счетов
- возврат средств по оплаченным счетам (пользователь отказался от услуги)
- проверка статуса выполнения операции
- оплата счета на Платежной форме QIWI
Способы оплаты
- Пользователи могут оплачивать счета QIWI Wallet
- в интерфейсах платежной формы QIWI (oplata.qiwi.com)
- на сайте qiwi.com
- с баланса своего QIWI Кошелька
- с баланса мобильного телефона или с любой карты Visa/MasterCard.
- в мобильных приложениях QIWI
- с баланса своего QIWI Кошелька
- с баланса мобильного телефона или с любой карты Visa/MasterCard.
- Также доступна оплата счетов наличными в QIWI Терминалах.
Для использования API пройдите регистрацию и подключение.
Способы интеграции
Для работы с QIWI Wallet Pull API доступны следующие способы:
- Веб-форма выставления счета - Не требует сложной реализации и дополнительной переадресации пользователя на Платежную форму. Ограничена по функциональности - поддерживает только выставление счета. Вы можете вызвать веб-форму двумя способами:
- с авторизацией по API_ID и цифровой подписи запроса,
- без авторизации (не рекомендуется).
- Pull REST API - Полнофункциональное API для всех операций со счетами.
Pull REST API
Редактировать на GitHub
Последовательность операций
-
Пользователь формирует заказ на сайте провайдера.
-
Сервис провайдера выставляет счет.
-
Для повышения конверсии оплаты счетов рекомендуется перенаправлять пользователя на платежную форму QIWI Wallet. Также пользователь может оплатить счет через любой другой интерфейс QIWI Кошелька (сайт qiwi.com, платежный терминал QIWI, мобильное приложение Android или iOS).
-
Если сервис провайдера использует уведомления, то после проведения платежа система QIWI Wallet высылает уведомление на сервер провайдера об оплате данного счета, либо, если пользователь отклонил счет, о неоплате. Уведомления об оплате счета содержат параметры авторизации, которые необходимо проверять на сервере провайдера.
- В любом случае, провайдер может:
- запросить текущий статус оплаты счета,
- отменить счет (если пользователь еще не инициировал оплату).
- После подтверждения оплаты счета провайдер исполняет заказ пользователя.
Средства для разработки
- NODE JS SDK - Пакет готовых решений для разработки server2server интеграций для приема платежей на вашем сайте c помощью Node.js.
Авторизация
Все запросы мерчанта к Pull REST API авторизуются посредством HTTP basic-авторизации. Для авторизации используются API ID и API password. Заголовок представляет собой параметр Authorization
, значение которого представлено как: Basic Base64(API_ID:API_PASSWORD)
const prv_id = 21379721;
const api_id = 62573819;
const api_password = '**********';
const qiwiRestApi = new QiwiPullAPI(prv_id, api_id, api_password);
user@server:~$ curl "адрес сервера"
Авторизация и работа с формами
Данные могут быть получены на сайте QIWI Кассы
Параметр | Описание | Тип | Обяз. |
---|---|---|---|
API_ID | Идентификатор для авторизации провайдера в API | Integer | + |
API_PASSWORD | Пароль для авторизации в API | String | + |
ID проекта | Числовой идентификатор сервиса провайдера | Integer | + |
Выставление счета за покупку
Запрос выставляет новый счет на указанный номер телефона (номер кошелька QIWI Wallet).
Запрос → PUT
<?php
//Пример реализации запроса на PHP
//Идентификатор магазина из вкладки "Данные магазина"
$SHOP_ID = "21379721";
//API ID из вкладки "Данные магазина"
$REST_ID = "62573819";
//API пароль из вкладки "Данные магазина"
$PWD = "**********";
//ID счета
$BILL_ID = "99111-ABCD-1-2-1";
$PHONE = "79191234567";
$data = array(
"user" => "tel:+" . $PHONE,
"amount" => "1000.00",
"ccy" => "RUB",
"comment" => "Товар из корзины",
"lifetime" => "2015-01-30T15:35:00",
"pay_source" => "qw",
"prv_name" => "Магазин"
);
$ch = curl_init('https://api.qiwi.com/api/v2/prv/'.$SHOP_ID.'/bills/'.$BILL_ID);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $REST_ID.":".$PWD);
curl_setopt($ch, CURLOPT_HTTPHEADER,array (
"Accept: application/json"
));
$results = curl_exec ($ch) or die(curl_error($ch));
echo $results;
echo curl_error($ch);
curl_close ($ch);
//Необязательный редирект пользователя
$url = 'https://oplata.qiwi.com/order/external/main.action?shop='.$SHOP_ID.'&
transaction='.$BILL_ID.'&pay_source=card';
echo '<br><br><b><a href="'.$url.'">Ссылка переадресации для оплаты счета</a></b>';
?>
const bill_id = '99111-ABCD-1-2-1';
const fields = {
amount: 1000.00,
ccy: 'RUB',
comment: 'Все очень хорошо',
lifetime: '2015-01-30T15:35:00',
user: 'tel:+79191234567',
pay_source: 'qw',
prv_name: 'Хороший магазин'
};
qiwiRestApi.createBill( bill_id, fields ).then( data => {
//do with data
});
user@server:~$ curl "https://api.qiwi.com/api/v2/prv/373712/bills/99111-ABCD-1-2-1"
-X PUT --header "Accept: text/json"
--header "Authorization: Basic ***"
-d "user=tel%3A%2B79031234567&amount=10.00&ccy=RUB&comment=test&lifetime=2016-09-25T15:00:00"
URL https://api.qiwi.com/api/v2/prv/prv_id/bills/bill_id
-
В pathname PUT-запроса используются два параметра счета:
- prv_id - числовой идентификатор провайдера (идентификатор, который отображается в пункте "ID проекта" на партнерском сайте kassa.qiwi.com)
- bill_id - уникальный идентификатор счета в системе провайдера. Уникальность означает, что идентификатор должен отличаться от идентификаторов всех ранее выставленных счетов провайдера.
HEADERS
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
- Content-type: application/x-www-form-urlencoded; charset=utf-8
- Authorization: Basic ***
Параметры
Параметры передаются в теле запроса как formdata
Параметр | Описание | Тип | Обяз. |
---|---|---|---|
user | Идентификатор номера QIWI Wallet, на который выставляется счет (в международном формате), с префиксом tel: |
String(20) | + |
amount | Сумма, на которую выставляется счет. Округляется в меньшую сторону до двух десятичных знаков | Number(6.2) | + |
ccy | Идентификатор валюты (Alpha-3 ISO 4217 код). Может использоваться любая валюта, предусмотренная договором с КИВИ | String(3) | + |
comment | Комментарий к счету | String(255) | + |
lifetime | Дата/время с точностью до секунд в формате ISO 8601 (ГГГГ-ММ-ДДTчч:мм:сс ). Указывается московское время. Если счет не будет оплачен до этого времени, ему присваивается финальный статус и последующая оплата станет невозможна.Внимание! По истечении 45 суток от даты выставления счет автоматически будет переведен в финальный статус. |
dateTime | + |
pay_source | mobile - оплата счета будет выполнена с баланса мобильного телефона пользователя, qw – оплата любым способом через интерфейс QIWI Кошелька.По умолчанию qw |
String | - |
prv_name | Название провайдера. | String(100) | - |
Для просмотра примера PHP-скрипта выставления счета и перенаправления на Платежную форму QIWI откройте вкладку PHP справа.
Данный пример иллюстрирует, когда и где в запросах к системе QIWI Wallet используются авторизационные данные провайдера, а именно, идентификатор магазина, API ID и пароль к API.
Ответ ←
HTTP/1.1 200 OK
Content-Type: text/json
{
"response": {
"result_code": 0,
"bill": {
"bill_id": "99111-ABCD-1-2-1",
"amount": "1000.00",
"ccy": "RUB",
"status": "waiting",
"error": 0,
"user": "tel:+79191234567",
"comment": "Счет от магазина"
}
}
}
HTTP/1.1 401 Unauthorized
Content-Type: text/json
{
"response": {
"result_code": 150,
"description": "Authorization failed"
}
}
Формат ответа зависит от заголовка "Accept" в исходном запросе:
HEADERS
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
Параметры
Параметр | Тип | Описание |
---|---|---|
result_code | Integer | Код результата |
description | String | Описание ошибки. Передается в случае ошибки (ненулевой result_code ) |
bill | Object | Данные о счете. Передается в случае успешного результата (result_code = 0). Параметры: |
bill.bill_id | String | Уникальный идентификатор счета в системе провайдера |
bill.amount | String | Сумма, на которую выставлен счет. Округляется в меньшую сторону до двух десятичных знаков. |
bill.ccy | String | Идентификатор валюты (Alpha-3 ISO 4217 код) |
bill.status | String | Текущий статус счета |
bill.error | Integer | Константа, всегда 0 |
bill.user | String | Идентификатор кошелька пользователя, которому выставлен счет (номер телефона в международном формате с префиксом tel: ) |
bill.comment | String | Комментарий к счету |
Проверка статуса оплаты счета
Метод для проверки текущего статуса счета.
const bill_id = '99111-ABCD-1-2-1';
qiwiRestApi.getStatus(bill_id).then( data => {
//do with data
});
Запрос → GET
user@server:~$ curl "https://api.qiwi.com/api/v2/prv/21379721/bills/99111-ABCD-1-2-1"
--header "Authorization: Basic ***"
--header "Accept: text/json"
URL https://api.qiwi.com/api/v2/prv/prv_id/bills/bill_id
-
Параметры передаются в pathname.
- prv_id - числовой идентификатор провайдера (идентификатор, который отображается в пункте "ID проекта" на партнерском сайте kassa.qiwi.com)
- bill_id - уникальный идентификатор счета в системе провайдера.
HEADERS
- Authorization: Basic ***
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
Ответ ←
HTTP/1.1 200 OK
Content-Type: text/json
{
"response": {
"result_code": 0,
"bill": {
"bill_id": "99111-ABCD-1-2-1",
"amount": "1000.00",
"ccy": "RUB",
"status": "waiting",
"error": 0,
"user": "tel:+79031234567",
"comment": "Счет от магазина"
}
}
}
HTTP/1.1 401 Unauthorized
Content-Type: text/json
{
"response": {
"result_code": 150,
"description": "Authorization failed"
}
}
HEADERS
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
Параметры
Параметр | Тип | Описание |
---|---|---|
result_code | Integer | Код результата |
description | String | Описание ошибки. Передается в случае ошибки (ненулевой result_code ) |
bill | Object | Данные о счете. Передается в случае успешного результата (result_code = 0). Параметры: |
bill.bill_id | String | Уникальный идентификатор счета в системе провайдера |
bill.amount | String | Сумма, на которую выставлен счет. Округляется в меньшую сторону до двух десятичных знаков. |
bill.originAmount | String | Сумма счета в валюте баланса, с которого оплачивался счета (см. параметр originCcy ). Округляется в меньшую сторону до двух десятичных знаков. Возвращается только для счетов, по которым пользователь инициировал оплату. |
bill.ccy | String | Идентификатор валюты, в которой выставлен счет (Alpha-3 ISO 4217 код) |
bill.originCcy | String | Идентификатор валюты баланса, с которого оплачивался счет (Alpha-3 ISO 4217 код). Возвращается только для счетов, по которым пользователь инициировал оплату. |
bill.status | String | Текущий статус счета |
bill.error | Integer | Константа, всегда 0 |
bill.user | String | Идентификатор кошелька пользователя, которому выставлен счет (номер телефона в международном формате с префиксом tel: ) |
bill.comment | String | Комментарий к счету |
Отмена неоплаченного счета
Метод для отмены неоплаченного клиентом счета до наступления предельной даты оплаты счета (см. параметр lifetime
).
const bill_id = '99111-ABCD-1-2-1';
qiwiRestApi.cancel(bill_id).then( data => {
//do with data
});
Запрос → PATCH
user@server:~$ curl "https://api.qiwi.com/api/v2/prv/373712/bills/99111-ABCD-1-2-1"
-X PATCH
--header "Authorization: Basic ***"
--header "Accept: text/json"
--header "Content-type: application/x-www-form-urlencoded; charset=utf-8"
-d "status=rejected"
URL https://api.qiwi.com/api/v2/prv/prv_id/bills/bill_id
-
Параметры передаются в pathname.
- prv_id - числовой идентификатор провайдера (идентификатор, который отображается в пункте "ID проекта" на партнерском сайте kassa.qiwi.com)
- bill_id - уникальный идентификатор счета в системе провайдера.
-
Параметр передается в body запроса.
- status - строка "rejected" (статус для отмены).
HEADERS
- Authorization: Basic ***
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
- Content-type: application/x-www-form-urlencoded; charset=utf-8
Ответ ←
HTTP/1.1 200 OK
Content-Type: text/json
{
"response": {
"result_code": 0,
"bill": {
"bill_id": "99111-ABCD-1-2-1",
"amount": "1000.00",
"ccy": "RUB",
"status": "rejected",
"error": 0,
"user": "tel:+79031234567",
"comment": "Счет от магазина"
}
}
}
HTTP/1.1 401 Unauthorized
Content-Type: text/json
{
"response": {
"result_code": 150,
"description": "Authorization failed"
}
}
HEADERS
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
Параметры
Параметр | Тип | Описание |
---|---|---|
result_code | Integer | Код результата |
description | String | Описание ошибки. Передается в случае ошибки (ненулевой result_code ) |
bill | Object | Данные об отмененном счете. Передается в случае успешного результата (result_code = 0). Параметры: |
bill.bill_id | String | Уникальный идентификатор счета в системе провайдера |
bill.amount | String | Сумма, на которую выставлен счет. Округляется в меньшую сторону до двух десятичных знаков. |
bill.ccy | String | Идентификатор валюты, в которой выставлен счет (Alpha-3 ISO 4217 код) |
bill.status | String | Текущий статус счета |
bill.error | Integer | Константа, всегда 0 |
bill.user | String | Идентификатор кошелька пользователя, которому выставлен счет (номер телефона в международном формате с префиксом tel: ) |
bill.comment | String | Комментарий к счету |
Возврат оплаченного счета
Метод выполняет полный или частичный возврат средств по счету, оплаченному клиентом, на его QIWI Кошелек. При этом создается платеж, обратный платежу на оплату счета. Валюта платежа совпадает с валютой исходного счета.
По одному и тому же счету можно выполнять несколько операций возврата, при условии что:
- сумма всех операций возврата не превышает суммы исходного счета;
- для разных операций возврата одного счета используются разные идентификаторы.
Последовательность операций
-
Провайдер отправляет запрос на осуществление возврата.
-
Если финальный статус возврата не получен в ответе, провайдер периодически опрашивает систему QIWI Wallet о текущем статусе возврата до получения финального статуса.
-
Данный сценарий можно повторять несколько раз до тех пор, пока счет не будет полностью отменен (возвращена вся сумма).
const bill_id = '893794793973';
const refund_id = '899343443';
const amount = 5.0;
qiwiRestApi.refund(bill_id, refund_id, amount).then( data => {
//do with data
});
Запрос → PUT
user@server:~$ curl "https://api.qiwi.com/api/v2/prv/373712/bills/893794793973/refund/899343443"
-v -w "%{http_code}"
-X PUT
--header "Accept: text/json"
--header "Authorization: Basic ***"
--header "Content-type: application/x-www-form-urlencoded; charset=utf-8"
-d "amount=5.0"
URL https://api.qiwi.com/api/v2/prv/prv_id/bills/bill_id/refund/refund_id
-
Параметры передаются в pathname.
- prv_id - числовой идентификатор провайдера (идентификатор, который отображается в пункте "ID проекта" на партнерском сайте kassa.qiwi.com)
- bill_id - уникальный идентификатор счета в системе провайдера.
- refund_id - идентификатор операции, уникальный в рамках операций возврата счета bill_id. Формат идентификатора: строка от 1 до 9 символов, содержащая только прописные или строчные латинские буквы (a-z, A-Z) и цифры от 0 до 9.
-
Параметр передается в body запроса.
- amount - сумма возврата. Должна быть меньше либо равна сумме счета {bill_id}, по которому производится возврат. Округляется в меньшую сторону до двух десятичных знаков.
HEADERS
- Authorization: Basic ***
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
- Content-Type: application/x-www-form-urlencoded; charset=utf-8
Ответ ←
HTTP/1.1 200 OK
Content-Type: text/json
{
"response": {
"result_code": 0,
"refund": {
"refund_id": "899343443",
"amount": "5.00",
"status": "success",
"error": 0
}
}
}
HTTP/1.1 401 Unauthorized
Content-Type: text/json
{
"response": {
"result_code": 150,
"description": "Authorization failed"
}
}
HEADERS
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
Параметры
Параметр | Тип | Описание |
---|---|---|
result_code | Integer | Код результата |
description | String | Описание ошибки. Передается в случае ошибки (ненулевой result_code ) |
refund | Object | Данные об операции возврата. Передается в случае успешного результата (result_code = 0). Параметры: |
refund.refund_id | String | Уникальный идентификатор операции возврата счета в системе провайдера |
refund.amount | String | Сумма к возврату. Положительное число, округляется в меньшую сторону до двух десятичных знаков. |
refund.status | String | Текущий статус операции возврата |
refund.error | Integer | Код ошибки при проведении возврата платежа. В случае если сумма, переданная в запросе, превышает сумму самого счета либо сумму счета, оставшуюся после предыдущих возвратов, в ответе будет возвращен код ошибки 242 . |
Проверка статуса возврата
Метод для проверки текущего статуса операции возврата средств по оплаченному счету.
const bill_id = '893794793973';
const refund_id = '899343443';
qiwiApi.getRefundStatus(bill_id, refund_id).then( data => {
//do with data
});
Запрос → GET
user@server:~$ curl "https://api.qiwi.com/api/v2/prv/373712/bills/893794793973/refund/899343443"
-v -w "%{http_code}"
--header "Accept: text/json"
--header "Authorization: Basic ***"
URL https://api.qiwi.com/api/v2/prv/prv_id/bills/bill_id/refund/refund_id
-
Параметры передаются в pathname.
- prv_id - числовой идентификатор провайдера (идентификатор, который отображается на партнерском сайте kassa.qiwi.com)
- bill_id - уникальный идентификатор счета в системе провайдера.
- refund_id - идентификатор операции, уникальный в рамках операций возврата счета bill_id. Формат идентификатора: строка от 1 до 9 символов, содержащая только прописные или строчные латинские буквы (a-z, A-Z) и цифры от 0 до 9
HEADERS
- Authorization: Basic ***
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
Ответ ←
HTTP/1.1 200 OK
Content-Type: text/json
{
"response": {
"result_code": 0,
"refund": {
"refund_id": "899343443",
"amount": "5.00",
"status": "success",
"error": 0
}
}
}
HTTP/1.1 401 Unauthorized
Content-Type: text/json
{
"response": {
"result_code": 150,
"description": "Authorization failed"
}
}
HEADERS
- Accept: text/json или Accept: application/json - формат ответа JSON
- Accept: text/xml или Accept: application/xml - формат ответа XML
Параметры
Параметр | Тип | Описание |
---|---|---|
result_code | Integer | Код результата |
description | String | Описание ошибки. Передается в случае ошибки (ненулевой result_code ) |
refund | Object | Данные об операции возврата. Передается в случае успешного результата (result_code = 0). Параметры: |
refund.refund_id | String | Уникальный идентификатор операции возврата счета в системе провайдера |
refund.amount | String | Сумма к возврату. Положительное число, округляется в меньшую сторону до двух десятичных знаков. |
refund.status | String | Текущий статус операции возврата |
refund.error | Integer | Код ошибки при проведении возврата платежа. В случае если сумма, переданная в запросе, превышает сумму самого счета либо сумму счета, оставшуюся после предыдущих возвратов, в ответе будет возвращен код ошибки 242. |
Статусы операций
Статусы оплаты счетов
Статус | Описание | Финальный |
---|---|---|
waiting | Счет выставлен, ожидает оплаты или оплачивается | - |
paid | Счет оплачен | + |
rejected | Счет отклонен | + |
unpaid | Ошибка при проведении оплаты. Счет не оплачен | + |
expired | Время жизни счета истекло. Счет не оплачен | + |
Статусы операции возврата
Статус | Описание | Финальный |
---|---|---|
processing | Платеж в проведении | - |
success | Платеж проведен | + |
fail | Платеж неуспешен | + |
Список ошибок
Код | Описание | Fatal* |
---|---|---|
0 | Успех | |
5 | Неверные данные в параметрах запроса | + |
13 | Сервер занят, повторите запрос позже | - |
78 | Недопустимая операция | + |
150 | Ошибка авторизации | + |
152 | Не подключен или отключен протокол | - |
155 | Данный идентификатор провайдера (API ID) заблокирован | + |
210 | Счет не найден | + |
215 | Счет с таким bill_id уже существует | + |
241 | Сумма слишком мала | + |
242 | Сумма слишком велика, или сумма, переданная в запросе возврата средств, превышает сумму самого счета либо сумму счета, оставшуюся после предыдущих возвратов | + |
298 | Кошелек с таким номером не зарегистрирован | + |
300 | Техническая ошибка | - |
303 | Неверный номер телефона | + |
316 | Попытка авторизации заблокированным провайдером | - |
319 | Нет прав на данную операцию | - |
339 | Ваш IP-адрес или массив адресов заблокирован | + |
341 | Обязательный параметр указан неверно или отсутствует в запросе | + |
700 | Превышен месячный лимит на операции | + |
774 | Кошелек временно заблокирован | - |
934 | Регион не поддерживается | + |
1001 | Запрещенная валюта для провайдера | + |
1003 | Не удалось получить курс конвертации для данной пары валют | - |
1018 | Страна не поддерживается | + |
1019 | Не удалось определить сотового оператора для мобильной коммерции | + |
1419 | Нельзя изменить данные счета – он уже оплачивается или оплачен | + |
- Признак означает, что при повторном запросе результат не изменится (ошибка не временная, проанализируйте данные запроса или обратитесь в Support).
Форма выставления счета
Редактировать на GitHub
Клиенту отображается платежная форма с выбором способа оплаты выставленного счета.
Вызов веб-формы выполняется без авторизации провайдера. Номер телефона и сумму счета клиент может указать непосредственно на веб-форме.
Последовательность операций
-
Пользователь формирует заказ на сайте провайдера.
-
Провайдер выполняет вызов веб-формы. При отсутствии номера телефона в параметрах вызова пользователь указывает номер на форме.
-
В случае успешного создания счета пользователь автоматически переходит на платежную форму QIWI Wallet.
-
Если провайдер включил отправку уведомлений на сервер провайдера, то после проведения платежа система QIWI Wallet высылает уведомление на сервер провайдера об оплате данного счета, либо, если пользователь отклонил счет, о неоплате. Уведомления об оплате счета содержат параметры авторизации, которые необходимо проверять на сервере провайдера.
-
После подтверждения оплаты счета провайдер исполняет заказ пользователя.
Запрос → REDIRECT
URL https://bill.qiwi.com/order/external/create.action
GET /order/external/create.action?txn_id=10000&from=11223&summ=1.11¤cy=643 HTTP/1.1
Host: bill.qiwi.com
Параметры
В ссылке на веб-форму указываются параметры счета.
Параметр | Описание | Тип | Обяз. |
---|---|---|---|
from | Идентификатор провайдера. Идентификатор указан в настройках HTTP-протокола в личном кабинете провайдера на сайте kassa.qiwi.com | Integer | + |
currency | Идентификатор валюты (Alpha-3 ISO 4217 код). Может использоваться любая валюта, предусмотренная договором с КИВИ | String(3) | + |
to | Идентификатор номера QIWI Wallet, на который выставляется счет (в международном формате). Если не указан, то пользователю на веб-форме отображается поле ввода номера телефона. Счет выставляется только после заполнения номера | String(20) | - |
summ | Сумма, на которую выставляется счет. Если параметр не указан, то на веб-форме отображается поле ввода суммы и счет выставляется только после заполнения суммы. | Number(6.2) | - |
txn_id | Уникальный идентификатор счета в системе провайдера (например, номер заказа в интернет-магазине). Используется для идентификации конкретного счета. | String(30) | - |
comm | Комментарий к счету. Если не указаны данный параметр и параметр to , то на веб-форме пользователю отображается поля ввода номера телефона и комментария. Счет выставляется только после заполнения номера |
String(255) | - |
lifetime | Время жизни счёта. Формат: ГГГГ-ММ-ДДTЧЧММ. По истечении этого времени оплата станет невозможна (счет будет отменен). Внимание! Если параметр отсутствует, по истечении 28 суток от даты выставления счет автоматически будет отменен. | Integer | - |
pay_source | Способ оплаты по умолчанию, который необходимо отобразить пользователю при открытии платежной формы. Возможные значения:qw – оплата с баланса QIWI Кошелька;mobile – оплата с баланса мобильного телефона;card – оплата банковской картой;wm – оплата с привязанного кошелька WebMoney;ssk – оплата наличными в терминале QIWI.Если способ оплаты не доступен, пользователю отображается предупреждение, при этом на странице можно выбрать другие способы оплаты. |
String | - |
Форма оплаты
Редактировать на GitHub
Провайдер может предложить пользователю немедленно оплатить счет с помощью переадресации на платежную форму.
GET /form?shop=2042&transaction=893794793973&pay_source=qw HTTP/1.1
Host: oplata.qiwi.com
const bill_id = '893794793973';
const options = {
transaction: billId,
pay_source: 'qw'
};
const link = qiwiRestApi.createPaymentForm(options);
Запрос → REDIRECT
URL https://oplata.qiwi.com/form
Параметры
Параметр | Тип | Описание | Обяз. |
---|---|---|---|
shop | Строка | Идентификатор провайдера. Соответствует параметру prv_id из запроса на выставление счета. | + |
transaction | Строка | Идентификатор счета в информационной системе провайдера. Соответствует параметру bill_id из запроса на выставление счета. | + |
embedded | Логический, true/false | более компактный вид, удобный для встраивания ее в сайт провайдера. По умолчанию false |
- |
pay_source | Строка | Способ оплаты по умолчанию, который необходимо отобразить пользователю при открытии платежной формы. Возможные значения:qw – оплата с баланса QIWI Кошелька;mobile – оплата с баланса мобильного телефона;card – оплата банковской картой;wm – оплата с привязанного кошелька WebMoney;ssk – оплата наличными в терминале QIWI.Если способ оплаты не доступен, пользователю отображается предупреждение, при этом на странице можно выбрать другие способы оплаты. |
- |
Возврат на сайт провайдера
Возврат клиента после успешного создания транзакции
GET /success?a=1&b=2&order=1234567 HTTP/1.1
Host: example.com
Возврат клиента в случае неуспеха при создании транзакции
GET /fail?a=1&b=2&order=1234567 HTTP/1.1
Host: example.com
При переадресации в ссылку добавляется параметр order, в котором будет передан исходный идентификатор счета у провайдера. Используя этот параметр, провайдер может отобразить необходимую информацию на своей стороне.
Уведомления об оплате счетов
Редактировать на GitHub
Уведомление представляет собой POST-запрос. Тело запроса содержит сериализованные данные счета в теле запроса (кодировка UTF-8), и параметр command=bill
.
Запрос → POST
Пример
user@server:~$ curl "https://example.com/qiwi-notify.php"
-v -w "%{http_code}"
-X POST --header "Accept: text/xml"
--header "Content-Type: application/x-www-form-urlencoded; charset=utf-8"
--Authorization: "Basic MjA0Mjp0ZXN0Cg=="
-d "bill_id=BILL-1%26status=paid%26amount=1.00%26user=tel%3A%2B79031811737%26prv_name=TEST%26ccy=RUB%26comment=test%26command=bill"
URL
HEADERS
- Authorization: Basic XXX - для авторизации по логину/паролю
- X-Api-Signature: XXX - для авторизации по цифровой подписи
- Accept: text/xml
- Content-type: application/x-www-form-urlencoded
Параметры
В теле запроса уведомления указываются параметры счета.
Параметр | Описание | Тип | Обяз. |
---|---|---|---|
bill_id | Уникальный идентификатор счета в системе провайдера | String | + |
status | Текущий статус счета | String | + |
amount | Сумма, на которую выставлялся счет, округленная до двух десятичных знаков | Number(6.2) | + |
user | Номер QIWI Кошелька, на который был выставлен счет, с префиксом tel: |
String | + |
prv_name | Название проекта, указанное на сайте kassa.qiwi.com в разделе:"Настройки" | String | + |
ccy | Идентификатор валюты (Alpha-3 ISO 4217 код) | String(3) | + |
comment | Комментарий к счету | String(255) | + |
command | bill - всегда по умолчанию |
String | + |
Ответ ←
Пример ответа на уведомление
HTTP/1.1 200 OK
Content-Type: text/xml
<?xml version="1.0"?>
<result>
<result_code>0</result_code>
</result>
Ответ на запрос должен быть в формате XML.
HEADERS
- Content-type: text/xml
Параметры
result
- Группирующий тег. Содержит описание результата обработки уведомления.result_code
- Код результата обработки уведомления (целое положительное число). Рекомендуется возвращать коды результата в соответствии с таблицей кодов завершения.
Авторизация уведомлений
Для авторизации можно использовать basic-авторизацию или авторизацию подписи. При запросах уведомлений на сервер провайдера также можно использовать SSL (в том числе самоподписанный сертификат). В HTTPS-запросах необходимо проверять серверный сертификат QIWI Wallet.
Basic-авторизация
Пример уведомления с Basic-авторизацией
POST /qiwi-notify.php HTTP/1.1
Accept: text/xml
Content-type: application/x-www-form-urlencoded
Authorization: Basic ***
Host: example.com
command=bill&bill_id=BILL-1&status=paid&error=0&amount=1.00&user=tel%3A%2B79031811737&prv_name=Retail_Store&ccy=RUB&comment=test
Логин равен ID проекта.
Для первичного получения или смены пароля на сайте QIWI Касса, нажмите кнопку "Создать пароль и сохранить" или "Сменить пароль оповещения", соответственно.
Подробнее
Авторизация по подписи
Пример уведомления с подписью
POST /qiwi-notify.php HTTP/1.1
Accept: text/xml
Content-type: application/x-www-form-urlencoded
X-Api-Signature: J4WNfNZd***V5mv2w=
Host: example.com
command=bill&bill_id=LocalTest17&status=paid&error=0&amount=0.01&user=tel%3A%2B78000005122&prv_name=Test&ccy=RUB&comment=Some+Descriptor
Для использования этого способа авторизации уведомлений, на сайте QIWI Касса достаточно активировать флаг "Использовать HMAC подпись вместо basic-авторизации".
Подробнее
Подпись уведомления отправляется в заголовке X-Api-Signature
. Для формирования подписи используется механизм проверки целостности HMAC с хэш-функцией SHA1.
- В качестве разделителей параметров используется символ
|
. - В подписи участвуют все параметры, которые присутствуют в исходном запросе выставления счета.
- Параметры для подписи переводятся в байт-представление с UTF-8 и располагаются в алфавитном порядке.
- Ключ подписи равен паролю для basic-авторизации уведомления.
Алгоритм проверки подписи:
-
Получить строку, содержащую значения всех параметров POST-запроса в алфавитном порядке перечисления параметров, разделенных символами
|
:{parameter1}|{parameter2}|…
где
{parameter1}
– значение параметра уведомления. Все значения при проверке подписи должны трактоваться как строки. - Строку и пароль для basic-авторизации уведомления преобразовать в байты с UTF-8.
-
Вычислить HMAC-хэш c шифрованием SHA1:
hash = HMAС(SHA1, Notification_password_bytes, Invoice_parameters_bytes)
где:Notification_password_bytes
– ключ функции (байт-представление basic-пароля для уведомлений);Invoice_parameters_bytes
– байт-представление тела POST-запроса;hash
– результат хэш-функции.
- HMAC-хэш преобразовать из строк в байты с использованием кодировки UTF-8 и base64-преобразовать.
- Сравнить значение заголовка
X-Api-Signature
с результатом 4.
Пример реализации
<?php
function hexToStr($hex){
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2){
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
//функция генерации подписи по ключу и строке параметров
function checkSign($key, $req){
$sign_hash = hash_hmac("sha1", $req, $key);
$sign_tr = hexToStr($sign_hash);
$sign = base64_encode($sign_tr);
return $sign;
}
//Функция возвращает упорядоченную строку значений параметров POST-запроса
function getReqParams(){
$reqparams = "";
ksort($_POST);
foreach ($_POST as $param => $valuep) {
$reqparams = "$reqparams|$valuep";
}
return substr($reqparams,1);
}
//Извлечение цифровой подписи из заголовков запроса
function getSign(){
$HEADERS = getallheaders();
foreach ($HEADERS as $header => $value) {
if ($header == 'X-Api-Signature') {
$SIGN_REQ = $value;
}
}
return $SIGN_REQ;
}
// Сортировка параметров
$Request = getReqParams();
// Пароль для уведомлений магазина
$NOTIFY_PWD = "***";
// Вычисляем подпись
$reqres = checkSign($NOTIFY_PWD, $Request);
// Подпись из запроса
$SIGN_REQ = getSign();
if ($reqres == $SIGN_REQ) {
$error = 0;
}
else $error = 151;
//Ответ
header('Content-Type: text/xml');
$xmlres = <<<XML
<?xml version="1.0"?>
<result>
<result_code>$error</result_code>
</result>
XML;
echo $xmlres;
?>
Пример на языке PHP реализует авторизацию уведомлений системы QIWI Wallet с проверкой цифровой подписи. Откройте вкладку PHP справа.
Коды уведомлений
Код завершения | Описание |
---|---|
0 | Успех |
5 | Ошибка формата параметров запроса |
13 | Ошибка соединения с базой данных |
150 | Ошибка проверки пароля |
151 | Ошибка проверки подписи |
300 | Ошибка связи с сервером |