Вопросы
bss@qiwi.com
NAV Navbar
shell Node.js SDK PHP SDK Java SDK Popup .Net SDK

Основные сведения

Последнее обновление: 2020-06-04 | Редактировать на GitHub

API P2P-счетов открывает доступ к операциям с выставляемыми счетами. Счет - универсальная заявка на перевод. По умолчанию пользователю доступно несколько способов перевода. В API поддерживаются операции выставления и отмены счетов, а также проверки статуса выполнения операций.

Для работы API потребуются публичный и секретный ключи. Ключи создаются в личном кабинете в разделе "API" (доступен после авторизации на сайте p2p.qiwi.com).

Схема работы

sequenceDiagram participant user as Пользователь participant rec as Получатель participant p2p as QIWI P2P API opt Основной сценарий user->>rec:Оформление заказа activate user activate rec opt Использование API rec->>p2p:Выставление счета p2p->>rec:Ссылка на платежную форму end rec->>user:Перенаправление на платежную форму
Выставление счета через форму
oplata.qiwi.com deactivate rec user->>p2p:Открытие платежной формы
Выбор способа оплаты и подтверждение платежа p2p->>p2p:Оплата счета opt Возврат на страницу партнера p2p->>user:Возврат на страницу партнера end deactivate user 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

Авторизация

const QiwiBillPaymentsAPI = require('bill-payments-node-js-sdk');

const SECRET_KEY = 'eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjUyNjgxMiwiYXBpX3VzZXJfaWQiOjcxNjI2MTk3LCJzZWNyZXQiOiJmZjBiZmJiM2UxYzc0MjY3YjIyZDIzOGYzMDBkNDhlYjhiNTnONPININONPN090MTg5Z**********************';

const qiwiApi = new QiwiBillPaymentsAPI(SECRET_KEY);
--header "Authorization: Bearer MjMyNDQxMjM6NDUzRmRnZDQ0M*******"
<?php

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 (SECRET_KEY). Параметр авторизации указывается в заголовке Authorization, значение которого формируется как "Bearer SECRET_KEY".

Публичный ключ (PUBLIC_KEY) используется для выставления счетов через форму.

Ключи создаются в личном кабинете на вкладке API после авторизации на p2p.qiwi.com.

Выставление счета через форму

Простой способ для интеграции. При открытии формы клиенту автоматически выставляется счет. Параметры счета передаются в открытом виде в ссылке. Далее клиенту отображается форма с выбором способа перевода. При использовании этого способа нельзя гарантировать, что все счета выставлены вами, в отличие от выставления по API.

REDIRECT →

const publicKey = 'Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******';

const params = {
    publicKey,
    amount: 42.24,
    billId: '893794793973',
    successUrl: 'http://test.ru/',
    email: 'm@ya.ru'
};

const link = qiwiApi.createPaymentForm(params);
curl https://oplata.qiwi.com/create?publicKey=Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******&amount=100&billId=893794793973&successUrl=http%3A%2F%2Ftest.ru%3F&email=m@ya.ru
<?php

$publicKey = '2tbp1WQvsgQeziGY9vTLe9vDZNg7tmCymb4Lh6STQokqKrpCC6qrUUKEDZAJ7mvFnzr1yTebUiQaBLDnebLMMxL8nc6FF5zf******';
$params = [
  'publicKey' => $publicKey,
  'amount' => 200,
  'billId' => '893794793973'
];

/** @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 successUrl = "https://merchant.com/payment/success?billId=893794793973";
 String paymentUrl = client.createPaymentForm(new PaymentInfo(key, amount, billId, successUrl));
var publicKey = "2tbp1WQvsgQeziGY9vTLe9vDZNg7tmCymb4Lh6STQokqKrpCC6qrUUKEDZAJ7mvFnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypdXCbQJqHEJW5RJmKfj8nvgc";

var amount = new MoneyAmount
{
    ValueDecimal = 499.9m,
    CurrencyEnum = CurrencyEnum.Rub
};
var billId = Guid.NewGuid().ToString();
var successUrl = "https://merchant.com/payment/success?billId=893794793973";

var paymentUrl = client.createPaymentForm(new PaymentInfo(key, amount, billId, successUrl));
Параметр Описание Тип Обяз.
publicKey Ваш ключ идентификации полученный в p2p.qiwi.com String +
billId Уникальный идентификатор выставляемого счета в вашей системе URL-закодированная строка String(200) -
amount Сумма, на которую выставляется счет, округленная в меньшую сторону до 2 десятичных знаков Number(6.2) -
phone Номер телефона пользователя (в международном формате) URL-закодированная строка -
email E-mail пользователя URL-закодированная строка -
account Идентификатор пользователя в вашей системе URL-закодированная строка -
comment Комментарий к счету URL-закодированная строка String(255) -
customFields[] Дополнительные данные счета URL-закодированная строка String(255) -
lifetime Дата, до которой счет будет доступен для перевода. Если перевод по счету не будет произведен до этой даты, ему присваивается финальный статус EXPIRED и последующий перевод станет невозможен.
Внимание! По истечении 45 суток от даты выставления счет автоматически будет переведен в финальный статус
URL-закодированная строка
ГГГГ-ММ-ДДTччмм
-
successUrl URL для переадресации в случае успешного перевода с баланса QIWI Кошелька. При ином способе оплаты переадресация не выполняется. Ссылка должна вести на ваш сайт. URL-закодированная строка -

Взаимодействие через API

1. Выставление счета

Надежный способ для интеграции. Параметры передаются server2server с использованием авторизации. Метод позволяет выставить счет: при успешном выполнении запроса в ответе вернется параметр payUrl - ссылка для редиректа пользователя на форму.

Настройки формы и счета

Запрос → PUT

const billId = '893794793973';

const fields = {
    amount: 1.00,
    currency: 'RUB',
    comment: 'Hello world',
    expirationDateTime: '2018-03-02T08:44:07+03:00'
};

qiwiRestApi.createBill( billId, fields ).then( data => {
    //do with data
});
curl https://api.qiwi.com/partner/bill/v1/bills/893794793973 \
-X PUT \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjIwNDIsImFwaV91c2VyX2lkIjo1NjYwMzk3Miwic2VjcmV0IjoiQjIwODlDNkI5Q0NDNTdCNDQzNGHJK43JFJDK595FJFJMjlCRkFFRDM5OE***********************' \
-d '{ \
   "amount": {  \
     "currency": "RUB",  \
     "value": 100.00 \
   }, \
   "comment": "Text comment", \
   "expirationDateTime": "2018-04-13T14:30:00+03:00", \
   "customer": {}, \
   "customFields": {}  \
   }'
<?php

$billId = '893794793973';
$fields = [
  'amount' => 1.00,
  'currency' => 'RUB',
  'comment' => 'test',
  'expirationDateTime' => '2018-03-02T08:44:07+03:00',
  'email' => 'example@mail.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(
                        "example@mail.org",
                        UUID.randomUUID().toString(),
                        "79123456789"
                ),
                "http://merchant.ru/success"
        );
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 = "example@mail.org",
            Account = Guid.NewGuid().ToString(),
            Phone = "79123456789"
        },
        SuccessUrl = new Uri("http://merchant.ru/success")
    },
    customFields: new CustomFields
    {
        ThemeCode = "кодСтиля"
    }
);
Параметр Описание Тип Обяз.
billId Уникальный идентификатор выставляемого счета в вашей системе string +
amount Данные о сумме счета Object +
amount.value Сумма, на которую выставляется счет, округленная в меньшую сторону до 2 десятичных знаков Number(6.2) +
amount.currency Валюта суммы счета. Доступна только Рубли (RUB) Alpha-3 ISO 4217 код +
expirationDateTime Дата, до которой счет будет доступен для оплаты. Если перевод не будет совершен до этой даты, ему присваивается финальный статус EXPIRED и последующий перевод станет невозможен.
URL-закодированная строка
ГГГГ-ММ-ДДTччмм+\-чч:мм
+
customer Идентификаторы пользователя Object -
customer.phone Номер телефона пользователя (в международном формате) string -
customer.email E-mail пользователя string -
customer.account Идентификатор пользователя в вашей системе string -
comment Комментарий к счету String(255) -
customFields[] Дополнительные данные счета String(255) -

Ответ ←

Пример тела ответа

  {
    "siteId": "23044",
    "billId": "893794793973",
    "amount": {
      "value": 100,
      "currency": "RUB"
    },
    "status": {
      "value": "WAITING",
      "changedDateTime": "2018-03-05T11:27:41+03:00"
    },
    "comment": "Text comment",
    "creationDateTime": "2018-03-05T11:27:41",
    "expirationDateTime": "2018-04-13T14:30:00+03:00",
    "payUrl": "https://oplata.qiwi.com/form/?invoice_uid=d875277b-6f0f-445d-8a83-f62c7c07be77"
  }

Пример тела ответа при ошибке

{
	"serviceName": "invoicing-api",
	"errorCode": "auth.unauthorized",
	"description": "Неверные аутентификационные данные",
	"userMessage": "",
	"datetime": "2018-04-09T18:31:42+03:00",
	"traceId" : "48485a395dfsdf34v124"
}

Параметр Тип Описание
billId String Уникальный идентификатор выставляемого счета в вашей системе
siteId String Ваш идентификатор в системе p2p.qiwi
amount Object Данные о сумме счета
amount.value Number Сумма счета, округленная до 2 знаков после запятой в меньшую сторону
amount.currency String Валюта суммы счета (Alpha-3 ISO 4217 код)
status Object Данные о статусе счета
status.value String Текущий статус счета
status.changedDateTime String Дата обновления статуса. Формат даты:
YYYY-MM-DDThh:mm:ss±hh
customFields Object Дополнительные поля
customer Object Идентификаторы пользователя. Возможные опции: email, phone, account
comment String Комментарий к счету
creationDateTime String Системная дата создания счета. Формат даты:
YYYY-MM-DDThh:mm:ss
payUrl String Ссылка на созданную форму
expirationDateTime String Срок действия созданной формы для перевода. Формат даты:
YYYY-MM-DDThh:mm:ss+\-hh:mm

2. Проверка статуса перевода по счету

Метод позволяет проверить статус перевода по счету. Рекомендуется его использовать после получения уведомления о переводе.

Запрос → GET

const billId = '893794793973';

qiwiApi.getBillInfo(billId).then( data => {
    //do smth with data
});
curl https://api.qiwi.com/partner/bill/v1/bills/893794793973 \
-X GET \
-H 'Accept: application/json' \
-H 'Authorization: Bearer eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjIwNDIsImFwaV91c2VyX2lkIjo1NjYwMzk3Miwic2VjcmV0IjoiQjIwODlDNkI5Q0NDNTdCNDQzNGHJK43JFJDK595FJFJMjlCRkFFRDM5OE***********************'
<?php

$billId = '893794793973';

/** @var \Qiwi\Api\BillPayments $billPayments */
$response = $billPayments->getBillInfo($billId);

print_r($response);

?>
String billId = "fcb40a23-6733-4cf3-bacf-8e425fd1fc71";
 BillResponse response = client.getBillInfo(billId);
var billId = "fcb40a23-6733-4cf3-bacf-8e425fd1fc71";

var response = client.getBillInfo(billId);

Ответ ←

Пример тела ответа

  {
    "siteId": "23044",
    "billId": "893794793973",
    "amount": {
      "value": 100,
      "currency": "RUB"
    },
    "status": {
      "value": "WAITING",
      "changedDateTime": "2018-03-05T11:27:41+03:00"
    },
    "comment": "Text comment",
    "creationDateTime": "2018-03-05T11:27:41",
    "expirationDateTime": "2018-04-13T14:30:00+03:00",
    "payUrl": "https://oplata.qiwi.com/form/?invoice_uid=d875277b-6f0f-445d-8a83-f62c7c07be77"
  }

Пример тела ответа при ошибке

{
	"serviceName": "invoicing",
	"errorCode": "auth.unauthorized",
	"description": "Неверные аутентификационные данные",
	"userMessage": "",
	"datetime": "2018-04-09T18:31:42+03:00",
	"traceId" : ""
}
Параметр Тип Описание
billId String Уникальный идентификатор выставляемого счета в вашей системе
siteId String Ваш идентификатор в системе p2p.qiwi
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.email String E-mail пользователя (если был указан при выставлении счета)
customer.account String Идентификатор пользователя в вашей системе (если был указан при выставлении счета)
comment String Комментарий к счету
creationDateTime String Системная дата создания счета. Формат даты:
ГГГГ-ММ-ДДTчч:мм:сс
payUrl String Ссылка для переадресации пользователя на созданную форму
expirationDateTime String Срок действия созданной формы для перевода. Формат даты:
ГГГГ-ММ-ДДTчч:мм:сс+\-чч:мм

3. Отмена счета

Метод позволяет отменить счет, по которому не совершен перевод.

Запрос → POST

const bill_id = '893794793973';

qiwiApi.cancelBill(billId).then( data => {
    //do with data
});
curl https://api.qiwi.com/partner/bill/v1/bills/893794793973/reject \
-X POST \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjIwNDIsImFwaV91c2VyX2lkIjo1NjYwMzk3Miwic2VjcmV0IjoiQjIwODlDNkI5Q0NDNTdCNDQzNGHJK43JFJDK595FJFJMjlCRkFFRDM5OE***********************'
<?php

$billId = '893794793973';

/** @var \Qiwi\Api\BillPayments $billPayments */
$response = $billPayments->cancelBill($billId);

print_r($response);

?>
String billId = "fcb40a23-6733-4cf3-bacf-8e425fd1fc71";
 BillResponse response = client.cancelBill(billId);
var billId = "fcb40a23-6733-4cf3-bacf-8e425fd1fc71";

var response = client.cancelBill(billId);

Ответ ←

Пример тела ответа

 {
    "siteId": "23044",
    "billId": "893794793973",
    "amount": {
      "value": 2.42,
      "currency": "RUB"
    },
    "status": {
      "value": "REJECTED",
      "changedDateTime": "2018-02-28T11:43:23.386+03:00"
    },
    "customer": {
      "email": "test@qiwi.com",
      "phone": "79191234567",
      "account": "user_account"
    },
    "customFields": {
      "city": "Moscow"
    },
    "comment": "Text comment",
    "creationDateTime": "2018-02-28T11:43:23.612+03:00",
    "expirationDateTime": "2018-04-14T11:43:23+03:00",
    "payUrl": "https://oplata.qiwi.com/form/?invoice_uid=6848dd49-e260-4343-b258-62199cffe8c1"
  }

Пример тела ответа при ошибке

{
	"serviceName": "invoicing",
	"errorCode": "auth.unauthorized",
	"description": "Неверные аутентификационные данные",
	"userMessage": "",
	"datetime": "2018-04-09T18:31:42+03:00",
	"traceId" : ""
}
Параметр Тип Описание
billId String Уникальный идентификатор выставляемого счета в вашей системе
siteId String Ваш идентификатор в p2p.qiwi
amount Object Данные о сумме счета
amount.value Number Сумма счета, округленная до 2 знаков после запятой в меньшую сторону
amount.currency String Идентификатор валюты суммы счета (Alpha-3 ISO 4217 код)
status Object Данные о статусе счета
status.value String Текущий статус счета
status.changedDateTime String Дата обновления статуса. Формат даты:
ГГГГ-ММ-ДДTчч:мм:сс+\-чч:мм
customFields Object Объект строковых дополнительных параметров, переданных партнером
customer Object Идентификаторы пользователя. Возможные опции: email, phone, account
comment String Комментарий к счету
creationDateTime String Системная дата создания счета. Формат даты:
ГГГГ-ММ-ДДTчч:мм:сс
payUrl String Ссылка на созданную платежную форму
expirationDateTime String Срок действия созданной формы для перевода. Формат даты:
ГГГГ-ММ-ДДTчч:мм:сс+\-чч:мм

Статусы оплаты счетов

Статус Описание Финальный
WAITING Счет выставлен, ожидает оплаты -
PAID Счет оплачен +
REJECTED Счет отклонен +
EXPIRED Время жизни счета истекло. Счет не оплачен +

Уведомления о переводе по счету

Запрос ← POST

Пример уведомления

POST /qiwi-notify.php HTTP/1.1
Accept: application/json
Content-type: application/json
X-Api-Signature-SHA256: J4WNfNZd***V5mv2w=
Host: server.ru

{ "bill":
  {  
     "siteId":"23044",
     "billId":"1519892138404fhr7i272a2",
     "amount":{  
        "value":"100",
        "currency":"RUB"
     },
     "status":{  
        "value":"PAID",
        "datetime":"2018-03-01T11:16:12"
     },
     "customer":{},
     "customFields":{},
     "creationDateTime":"2018-03-01T11:15:39",
     "expirationDateTime":"2018-04-01T11:15:39+03:00"
   },
  "version":"1"
}

Уведомление представляет собой входящий POST-запрос.

Тело запроса содержит JSON-сериализованные данные счета (кодировка UTF-8).

Адрес сервера для уведомлений вы указываете на p2p.qiwi.com при генерации ключей.

Авторизация уведомлений

После получения входящего уведомления необходимо проверить его подлинность. Для этого используется механизм цифровой подписи. Подпись уведомления отправляется в HTTP заголовке X-Api-Signature-SHA256. Для формирования подписи используется механизм проверки целостности HMAC с хэш-функцией SHA256.

Алгоритм проверки подписи:

  1. Объединить значения следующих параметров уведомления в одну строку с разделителем |:

    invoice_parameters = {amount.currency}|{amount.value}|{billId}|{siteId}|{status.value}

    где {*} – значение параметра. Все значения при проверке подписи должны трактоваться как строки.

  2. Вычислить HMAC-хэш c алгоритмом хэширования SHA256:

    hash = HMAС(SHA256, invoice_parameters, secret_key) Где:

    • secret_key – ключ функции ;
    • invoice_parameters – строка из п.1;
  3. Сравнить значение заголовка 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 merchantSecret = 'test-merchant-secret-for-signature-check';

qiwiApi.checkNotificationSignature(
    validSignatureFromNotificationServer, notificationData, merchantSecret
); // true
<?php

$validSignatureFromNotificationServer = '07e0ebb10916d97760c196034105d010607a6c6b7d72bfa1c3451448ac484a3b';
$notificationData = [
  'bill' => [
    'siteId' => 'test',
    'billId' => 'test_bill',
    'amount' => ['value' => 1, 'currency' => 'RUB'],
    'status' => ['value' => 'PAID']
  ],
  'version' => '3'
];
$merchantSecret = 'test-merchant-secret-for-signature-check';

/** @var \Qiwi\Api\BillPayments $billPayments */
$billPayments->checkNotificationSignature(
  $validSignatureFromNotificationServer, $notificationData, $merchantSecret
); // true

?>
String merchantSecret = "test-merchant-secret-for-signature-check";
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, merchantSecret); //true

Строка и ключ подписи кодируются в UTF-8.

Параметр Описание Тип
bill Данные о счете Object
billId Уникальный идентификатор выставляемого счета в вашей системе String(200)
siteId Ваш идентификатор в системе p2p.qiwi 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.email 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"
}

После того, как был получен входящий запрос-уведомление, необходимо проверить подлинность цифровой подписи и отправить ответ.

Персонализация

Персонализация позволяет адаптировать платежную форму под ваш стиль. Настраивается наименование, фон и цвет кнопок.

Создать стили можно в личном кабинете на p2p.qiwi.com. Возможно создать несколько стилей.

При настройке задается код, привязанный к стилю (например, кодСтиля). Для использования стиля на платежной форме необходимо передать в параметре customFields запроса создания счета или вызова платежной формы переменную: "themeCode":"кодСтиля" с соответствующим кодом стиля.

Пример передачи параметра при вызове платежной формы

curl https://oplata.qiwi.com/create?publicKey=Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******&amount=100&billId=893794793973&successUrl=http%3A%2F%2Ftest.ru%3F&customFields%5BthemeCode%5D=кодСтиля

Пример передачи параметра в запросе к API

curl https://api.qiwi.com/partner/bill/v1/bills/893794793973 \
-X PUT \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjIwNDIsImFwaV91c2VyX2lkIjo1NjYwMzk3Miwic2VjcmV0IjoiQjIwODlDNkI5Q0NDNTdCNDQzNGHJK43JFJDK595FJFJMjlCRkFFRDM5OE***********************'
-d '{ \
   "amount": {  \
     "currency": "RUB",  \
     "value": 100.00 \
   }, \
   "comment": "Text comment", \
   "expirationDateTime": "2018-04-13T14:30:00+03:00", \
   "customer": {}, \
   "customFields": {"themeCode":"кодСтиля"} \
 }'

Customer form

Checkout Popup

Всплывающее окно (popup) позволяет открыть форму перевода поверх вашего сайта. В библиотеке доступно два метода: создание нового счета и открытие существующего.

Скачать библиотеку QIWI Checkout Popup

Установка и подключение:
<script src='https://oplata.qiwi.com/popup/v1.js'></script>

Выставление нового счета

Метод QiwiCheckout.createInvoice

Пример выставления счета через popup

QiwiCheckout.createInvoice({
    publicKey: '5nAq6abtyCz4tcDj89e5w7Y5i524LAFmzrsN6bQTQ3c******',
    amount: 1.23,
    phone: '79123456789',
})
    .then(data => {
        //  data === {
        //    publicKey: '5nAq6abtyCz4tcDj89e5w7Y5i524LAFmzrsN6bQTQ3c******',
        //    amount: 1.23,
        //    phone: '79123456789',
        //  }
    })
    .catch(error => {
        //  error === {
        //      reason: "PAYMENT_FAILED"
        //  }
    })
Параметр Описание Тип Обязательное
publicKey Ваш ключ идентификации , полученный в p2p.qiwi String +
amount Сумма, на которую выставляется счет, округленная в меньшую сторону до 2 десятичных знаков Number(6.2) +
phone Номер телефона пользователя (в международном формате) String -
email E-mail пользователя String -
account Идентификатор пользователя в вашей системе String -
comment Комментарий к счету String(255) -
customFields Дополнительные данные счета Object -
lifetime Дата, до которой счет будет доступен для перевода. Если перевод не будет осуществлен до этой даты, ему присваивается финальный статус EXPIRED и последующая оплата станет невозможна. Строка в виде ГГГГ-ММ-ДДTччмм -

Открытие существующего счета

Метод QiwiCheckout.openInvoice

Пример открытия уже созданного счета в popup

params = {
    payUrl: 'https://oplata.qiwi.com/form?invoiceUid=06df838c-0f86-4be3-aced-a950c244b5b1'
}

QiwiCheckout.openInvoice(params)
    .then(data => {
        // ...
    })
    .catch(error => {
        // ...
    })
Параметр Описание Тип Обязательное
payUrl URL инвойса String +

Настройки формы и счета

При выставлении счета через API в ответе приходит payUrl с ссылкой на форму. К ссылке можно добавить следующие параметры:

Пример ссылки

curl https://oplata.qiwi.com/form?invoiceUid=606a5f75-4f8e-4ce2-b400-967179502275&allowedPaySources=card
Параметр Описание Тип
paySource При открытии формы сразу будет выбран указанный способ перевода. Возможные значения:
qw - QIWI Кошелек
card - банковская карта
mobile - платеж со счета мобильного телефона
sovest - карта СОВЕСТЬ
Если способ перевода недоступен - выбирается рекомендуемый для данного пользователя способ
String
allowedPaySources При открытии формы будут отображаться только указанные способы перевода. (Если они доступны) Возможные значения:
qw - QIWI Кошелек
card - банковская карта
mobile - платеж со счета мобильного телефона
sovest - карта СОВЕСТЬ
Строка с разделителями-запятыми
successUrl URL для переадресации в случае успешного перевода с баланса QIWI Кошелька. При ином способе перевода переадресация не выполняется. Ссылка должна вести на ваш сайт. URL-закодированная строка
lifetime Дата, до которой счет будет доступен для перевода. Если перевод не будет осуществлен до этой даты, ему присваивается финальный статус EXPIRED и последующая оплата станет невозможна. Строка формата
ГГГГ-ММ-ДДTччмм

Готовые решения

SDK и библиотеки

Решения для CMS