Что такое api ключ киви
Перейти к содержимому

Что такое api ключ киви

  • автор:

Настройка приема оплаты через Qiwi (API)

  1. Для работы API потребуются публичный и секретный ключи. Ключи создаются в личном кабинете после регистрации и подключения на kassa.qiwi.com или p2p.qiwi.com.
  2. Зайдите в личный кабинет: раздел «Прием переводов» -> API.
  3. Кликните на кнопку «Создать пару ключей и настроить».
  4. Прежде чем заполнять данные в личном кабинете, откройте настройки оплаты «Qiwi (API)» в панели администратора Moguta.CMS («Настройки» -> «Оплата» -> «Qiwi API»).
  5. Заполняем в следующем порядке:
    • Для Qiwi:
      1. Название пары любое;
      2. Ставим галочку напротив «Использовать эту пару ключей для серверных оповещений».
      3. URL для оповещения: скопировать ссылку из раздела оплаты Moguta.CMS «Ссылки для указания в сервисе Qiwi (API)».
      4. Нажимаем кнопку «Сохранить«.
    • Для Moguta.CMS: скопировать публичный и серкретный ключи из Qiwi в соответствующие поля настроек.

    Оплата с формы QIWI с помощью API¶

    Партнёру доступны несколько сценариев приёма платежей с помощью формы и API QIWI:

    • одношаговый — когда авторизация и подтверждение платежа выполняются в рамках одного запроса;
    • двухшаговый — когда авторизация и подтверждение платежа выполняются двумя отдельными запросами.

    При выполнении одношагового сценария средства клиента холдируются и сразу же списываются после нажатия кнопки оплаты на форме QIWI. Отменить списание технически невозможно, доступен лишь возврат средств.

    При выполнении двухшагового сценария средства клиента холдируются после нажатия кнопки оплаты на форме QIWI и списываются только после получения подтверждения от партнёра. Холдирование средств можно отменить, списанные средства можно вернуть.

    Начало работы¶

    ① Выполните шаги, указанные в статье «Интернет-эквайринг» → «Начало работы»

    ② Выпустите ключ доступа к API приёма платежей

    Ключ доступа к API — cимвольная строка для авторизации запросов к API согласно стандарту OAuth 2.0 RFC 6749, RFC 6750В. Выпускается в личном кабинете в разделе «Настройки».

    Отправленный вам siteId по умолчанию находится в тестовом режиме. В этом режиме вы можете проводить операции без реального движения денежных средств. Подробности см. в статье «Тестовый режим».

    Одношаговый сценарий¶

    Пример успешной оплаты с помощью выполнения одношагового сценария описан и изображён ниже. В примере оплата совершается с банковской карты.

    Все способы оплаты, кроме оплаты с банковской карты, подключаются по запросу: оплата с банковской карты доступна по умолчанию, для подключения остальных способов обратитесь в службу поддержки.

    1. Клиент выбирает товар или услугу на торговой площадке партнёра, переходит к оплате.
    2. Партнёр отправляет QIWI запрос на создание счёта, в котором передаёт сумму платежа, срок жизни счёта и признак одношагового проведения платежа ( flags:[SALE] ).

    Если не передать flags:[SALE] , платёж будет проведён по двушаговому сценарию: средства клиента будут захолдированы после нажатия кнопки оплаты и списаны только после получения подтверждения от партнёра.

    Альтернативный вариант — использование библиотеки Checkout Popup для открытия формы во всплывающем окне.

    Опциональные шаги П.10 является опциональным и выполняется лишь в том случае, если для партнёра настроен successUrl . Подробности см. в статье «Платёжная форма» → «URL-адрес страницы для успешного платежа».

    %%>>%% sequenceDiagram participant С as Клиент participant P as Партнёр participant Q as QIWI participant B as Банк-эмитент С->>P: Выбор товара или услуги Note right of С: Переход к оплате P->>+Q: Запрос на создание счёта Note right of P: siteId, billId, amount, expirationDateTime, flags: SALE Q->>-P: Ответ на запрос создания счёта Note left of Q: siteId, billId, amount, invoiceUid, status:CREATED, expirationDateTime, payUrl P->>С: Направление на payUrl Note left of P: Платёжная форма rect rgb(230, 230, 230) С->>С: Заполнение данных на форме С->>Q: Выполнение кода (вызов API формой) rect rgb(255, 238, 223) Q->>+С: Аутентификация клиента с помощью 3D-Secure С->>-Q: end Q->>+B: Запрос на авторизацию и подтверждение платежа Note right of Q: Через платёжную систему B->>B: HOLD B->>B: CAPTURE B->>-Q: Ответ на запрос Note left of B: ОК Q->>Q: Завершение платежа (оплаты счёта) Q->>С: Отображение результата на форме Note right of С: «Платёж успешен» opt Направление на URL-адрес successUrl (опционально) С->>P: Note left of P: Страница статуса платежа в интерфейсе партнёра end end rect rgb(255, 238, 223) Q->>P: Сценарий «Принятие решения об успешности операции» P->>Q: end

    Элемент диаграммы QIWI — совокупность участников процесса проведения платежа. Указанные на диаграмме сценарии см. в статьях:

    • «3D-Secure»;
    • «Общие принципы и правила» → «Решение об успешности операции».

    Партнёр не получает, не обрабатывает и не хранит данные карты клиента. Это делает форма QIWI. Данный этап выделен на схеме серым цветом.

    Запрос на создание счёта Ответ на запрос создания счёта с payUrl

     PUT /partner/payin/v1/sites/test-00/bills/1234567890 HTTP/1.1  Accept: application/json  Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9  Content-type: application/json  Host: api.qiwi.com    "amount":   "currency": "RUB",  "value": 150.00  >,  "comment": "Spasibo",  "expirationDateTime": "2023-07-07T14:30:00+03:00",  "flags": [  "SALE"  ]  > 
     HTTP/1.1 200 OK  Content-Type: application/json    "billId": "1234567890",  "invoiceUid": "143a6822-6ef2-478f-a30b-4ad8c044d6d8",  "amount":   "currency": "RUB",  "value": "150.00"  >,  "expirationDateTime": "2023-07-07T14:30:00+03:00",  "status":   "value": "CREATED",  "changedDateTime": "2023-02-17T14:50:44+03:00"  >,  "comment": "Spasibo",  "flags": [  "SALE"  ],  "payUrl": "https://oplata.qiwi.com/form?invoiceUid=143a6822-6ef2-478f-a30b-4ad8c044d6d8"  > 

    Запросы и ответы приведены в качестве примера: актуальные формат и список параметров см. в разделе «Справочник методов API» документации API приёма платежей.

    Двухшаговый сценарий¶

    Пример успешной оплаты с помощью выполнения двухшагового сценария описан и изображён ниже. В примере оплата совершается с банковской карты.

    Двухшаговый сценарий позволяет использовать лишь один способ оплаты — с банковской карты.

    1. Клиент выбирает товар или услугу на торговой площадке партнёра, переходит к оплате.
    2. Партнёр отправляет QIWI запрос на создание счёта, в котором передаёт сумму платежа и срок жизни счёта.
    3. QIWI возвращает партнёру статус счёта ( CREATED — создан, ожидает оплаты), а также URL-адрес платёжной формы QIWI payUrl .
    4. Партнёр направляет клиента на полученный payUrl .

    Альтернативный вариант — использование библиотеки Checkout Popup для открытия формы во всплывающем окне.

    Опциональные шаги П.10 является опциональным и выполняется лишь в том случае, если для партнёра настроен successUrl . Подробности см. в статье «Платёжная форма» → «URL-адрес страницы для успешного платежа».

    На этапе получения уведомления у партнёра появляется идентификатор платежа, который он должен подтвердить — paymentId . Данный индентификатор также можно получить в ответ на запрос списка платежей по счёту.

    Сбор заказа и т.п.

    По умолчанию QIWI ожидает подтверждения платежа в течение 72 часов с момента его успешной авторизации — оплаты счёта. По истечении этого срока платёж подтверждается автоматически. Для изменения длительности ожидания или настройки автоматической отмены платежа обратитесь в службу поддержки. Длительность ожидания не может превышать 5 суток.

    %%>>%% sequenceDiagram participant С as Клиент participant P as Партнёр participant Q as QIWI participant B as Банк-эмитент С->>P: Выбор товара или услуги Note right of С: Переход к оплате P->>+Q: Запрос на создание счёта Note right of P: siteId, billId, amount, expirationDateTime, `flags: SALE` Q->>-P: Ответ на запрос создания счёта Note left of Q: siteId, billId, amount, invoiceUid, status:CREATED, expirationDateTime, payUrl P->>С: Направление на `payUrl` Note left of P: Платёжная форма rect rgb(230, 230, 230) С->>С: Заполнение данных на форме С->>Q: Выполнение кода (вызов API формой) rect rgb(255, 238, 223) Q->>+С: Аутентификация клиента с помощью 3D-Secure С->>-Q: end Q->>+B: Запрос на авторизацию платежа Note right of Q: Через платёжную систему B->>B: HOLD B->>-Q: Результат авторизации Note left of B: ОК Q->>Q: Статус оплаты счёта Note over Q: ОК Q->>С: Отображение результата на форме Note right of С: «Оплата успешна» opt Направление на URL-адрес successUrl (опционально) С->>P: Note left of P: Страница статуса оплаты в интерфейсе партнёра end end rect rgb(255, 238, 223) Q->>P: Сценарий «Принятие решения об успешности операции» Note left of Q: paymentId P->>Q: end P->>С: Коммуникация с клиентом Note left of P: Заказ собирается P->>P: Сбор заказа Note over P: Заказ готов к отправке P->>+Q: Запрос на подтверждение платежа Note right of P: siteId, paymentId, captureId Q->>+B: Запрос на подтверждение платежа Note right of Q: Через платёжную систему B->>B: CAPTURE B->>-Q: Результат Note left of B: ОК Q->>Q: Статус платежа Note over Q: COMPLETED Q->>-P: Ответ на запрос подтверждения Note left of Q: siteId, paymentId, captureId, amount, status: COMPLETED rect rgb(255, 238, 223) Q->>P: Сценарий «Принятие решения об успешности операции» Note left of Q: paymentId P->>Q: end P->>С: Коммуникация с клиентом Note left of P: Заказ отправлен

    Элемент диаграммы QIWI — совокупность участников процесса проведения платежа. Указанные на диаграмме сценарии см. в статьях:

    • «3D-Secure»;
    • «Общие принципы и правила» → «Решение об успешности операции».

    Партнёр не получает, не обрабатывает и не хранит данные карты клиента. Это делает форма QIWI. Данный этап выделен на схеме серым цветом.

    Запрос на создание счёта Запрос на подтверждение платежа

     PUT /partner/payin/v1/sites/test-00/bills/1234567890 HTTP/1.1  Accept: application/json  Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9  Content-type: application/json  Host: api.qiwi.com    "amount":   "currency": "RUB",  "value": 150.00  >,  "comment": "Spasibo",  "expirationDateTime": "2023-07-07T14:30:00+03:00"  > 
     PUT /partner/payin/v1/sites/test-00/payments/804900/capture/cap1234567890 HTTP/1.1  Accept: application/json  Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9  Content-type: application/json  Host: api.qiwi.com 

    Пример ответа на запрос создания счёта см. в разделе «Одношаговый сценарий».

    Запросы и ответы приведены в качестве примера: актуальные формат и список параметров см. в разделе «Справочник методов API» документации API приёма платежей.

    Способы оплаты¶

    Cпособы оплаты настраиваются для определённого siteId и отображаются на форме QIWI в зависимости от выполнения некоторых условий (см. таблицу ниже). Оплата с банковской карты доступна по умолчанию.

    Условие Результат
    • Служба поддержки не подключала никаких способов оплаты по запросу
    • При выполнении одношагового или двухшагового сценария в запросе на создание счёта отсутствует параметр billPaymentMethodsType
    На форме доступен лишь один способ оплаты — банковской картой
    • Служба поддержки не подключала никаких способов оплаты по запросу
    • При выполнении одношагового или двухшагового сценария в запросе на создание счёта передан параметр billPaymentMethodsType со списком способов оплаты
    На форме доступен лишь один способ оплаты — банковской картой. Способы из billPaymentMethodsType не учитываются при отображении формы
    • Служба поддержки получила запрос на подключение определённых способов оплаты и подключила запрошенные способы
    • При выполнении одношагового или двухшагового сценария в запросе на создание счёта отсутствует параметр billPaymentMethodsType
    На форме доступны все подключенные службой поддержки способы оплаты
    • Служба поддержки получила запрос на подключение определённых способов оплаты и подключила запрошенные способы
    • При выполнении одношагового или двухшагового сценария в запросе на создание счёта передан параметр billPaymentMethodsType со списком способов оплаты
    На форме доступны способы оплаты, указанные в billPaymentMethodsType . Подключенные службой поддержки способы оплаты не учитываются при отображении формы

    Оплата с помощью платёжного токена¶

    Клиент может оплатить заказ без ввода платёжных реквизитов. Оплата в этом случае совершается с помощью платёжного токена. Для подключения этого способа оплаты обратитесь в службу поддержки.

    Выпуск платёжного токена описан в статье «Платёжный токен».

    Клиент может оплатить заказ платёжным токеном только на том сайте, для которого токен был выпущен. Чтобы токен действовал на других сайтах, обратитесь в службу поддержки.

    Оплата с помощью платёжного токена может быть реализована путём выполнения одношагового или двухшагового сценария: в запросе на создание счёта необходимо передать идентификатор клиента, для которого выпущен токен (параметр customer.account ). Без указания customer.account оплата платёжным токеном невозможна.

    Запрос на создание счёта для оплаты токеном

     PUT /partner/payin/v1/sites/test-02/bills/1815 HTTP/1.1  Accept: application/json  Authorization: Bearer 7uc4b25xx93xxx5d9cb8cd17480356f9  Content-type: application/json  Host: api.qiwi.com    "amount":   "currency": "RUB",  "value": 100.00  >,  "comment": "Text comment",  "expirationDateTime": "2018-04-13T14:30:00+03:00",  "customer":   "account": "token234"  >,  "customFields":   "cf1": "Some data"  >  > 

    Запрос приведён в качестве примера: актуальные формат и список параметров см. в разделе «Справочник методов API» документации API приёма платежей.

    Если для клиента выпущен один или несколько токенов, на форме QIWI отображается список привязанных платёжных инструментов.

    PAY-FORM

    Клиент может выбрать нужную карту из списка. Указывать платёжные реквизиты и проходить проверку 3D-Secure не требуется.

    P2P-счета

    Чтобы подключить на свой сайт сервис приема p2p-переводов для физических лиц, вам необходим QIWI Кошелек со статусом идентификации Основной или Профессиональный. Если у вашего кошелька статус Анонимный, пройдите идентификацию удобным для вас способом:

    • Для получения статуса Основной достаточно указать паспортные данные.
    • Для получения статуса Профессиональный необходимо пройти очную идентификацию.

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

    Рекомендуем ознакомиться с частыми вопросами по нашему сервису, а также с информацией о том, как избежать блокировки кошелька.

    Активация доступа к сервису

    invoice-test

    1. Авторизуйтесь на p2p.qiwi.com
    2. Убедитесь, что вам доступно выставление счетов – в форме Выставить счет заполните поле Сумма и нажмите кнопку. Ниже должна появиться ссылка на счет и кнопка Скопировать ссылку

    Поздравляем! Вы можете приступить к интеграции.

    Как работать с сервисом

    1. Создайте публичный и секретный ключи. Подробнее см. в разделе Методы авторизации.
    2. Реализуйте взаимодействие через API или через вызов формы оплаты счета. Вы можете воспользоваться SDK или готовыми решениями для CMS.
    3. Для получения уведомлений после перевода по счету активируйте их отправку.
    4. Начните принимать платежи с банковских карт или 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

    1. Пользователь формирует счет на вашей стороне.
    2. Вы перенаправляете пользователя на платежную форму для выставления и оплаты счета в сервисе. Или выставляете счет по API и также перенаправляете пользователя на созданную платежную форму (ссылка на форму придет в ответе).
    3. Пользователь выбирает способ перевода и подтверждает перевод. По умолчанию на форме отображается оптимальный для пользователя способ перевода.
    4. После перевода по счету вы получите уведомление, если активировали отправку уведомлений. Уведомления о переводе по счету содержат цифровую подпись, которую необходимо проверять на вашем сервере.

    Также через 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 .
    • Публичный ключ — для авторизации при выставлении счетов через форму.

    Чтобы выпустить пару ключей и :

    1. Авторизуйтесь в личном кабинете https://p2p.qiwi.com/.
    2. Перейдите на вкладку API и нажмите кнопку Создать пару ключей и настроить. Если вы создаете пару ключей впервые, то нажмите кнопку Настроить. p2p API Settings
    3. Укажите название для пары ключей и нажмите кнопку Создать.
    4. Сохраните секретный ключ в безопасном месте — в дальнейшем он не будет отображаться в интерфейсе. Публичный ключ вы всегда можете скопировать из Личного кабинета.
    5. Нажмите кнопку Дальше. Пара ключей будет активирована.

    Не передавайте секретный ключ третьим лицам! При компрометации ключей необходимо перевыпустить их.

    Вы можете использовать секретный ключ также для автоматизации платежных операций по 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
    email 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.
    email
    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.
    email
    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. При этом выпускается новая пара ключей для авторизации. В каждый момент времени действует только одна пара ключей — старая пара ключей блокируется при выпуске новой пары ключей.

    1. Авторизуйтесь в Личном кабинете P2P.
    2. Перейдите на вкладку API и нажмите кнопку Создать пару ключей и настроить. Если вы настраиваете адрес сервера вместе с первичным созданием пары ключей впервые, то нажмите кнопку Настроить. p2p API Settings
    3. Укажите название для новой пары ключей.
    4. Выделите поле Использовать эту пару ключей для серверных уведомлений об изменении статусов счетов.
    5. В поле URL сервера для уведомлений укажите адрес вашего сервера для обработки уведомлений об оплате. Внимание! Сервер должен быть доступен из интернета.
    6. Нажмите кнопку Создать.
    7. Замените в настройках ваших приложений ключи для сервиса QIWI P2P на вновь созданные.

    Проверка подлинности уведомлений

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

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

    1. Объединить значения следующих параметров уведомления в одну строку с разделителем | : invoice_parameters = |||| где – значение параметра. Все значения при проверке подписи должны трактоваться как строки.
    2. Вычислить HMAC-хеш c алгоритмом хеширования SHA256: hash = HMAС(SHA256, invoice_parameters, ) Где:
      • – секретный ключ, при помощи которого был выставлен счёт;
      • 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 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.
    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" > 

    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 . Это можно сделать для всего сайта или только для страницы со ссылкой на форму оплаты.

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

    Вы можете настроить персонализированную форму оплаты: изменить свое имя на название магазина и настроить цвет фона и кнопок.

    Пример персонализированной формы оплаты:

    Customer form

    Чтобы настроить внешний вид формы оплаты:

    alt_text

    1. Авторизуйтесь в Личном кабинете P2P.
    2. Перейдите в раздел Форма приема переводов. Код вашего стиля для переменной themeCode (указывается в запросах API и вызовах SDK, см. далее) выделен жирным шрифтом в блоке серого цвета. Значение themeCode индивидуально для разных QIWI кошельков.
    3. Нажмите кнопку Настроить и выполните настройку формы.
    4. Нажмите кнопку Сохранить.

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

    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 Кассы

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

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

    Схема работы

    Operation Flow

    • Пользователь формирует заказ на сайте мерчанта.
    • Мерчант перенаправляет пользователя на Платежную форму для выставления счета по заказу. Или выставляет счет по API и перенаправляет пользователя на созданную платежную форму.
    • Пользователь выбирает способ оплаты и оплачивает счет. По умолчанию подбирается оптимальный для пользователя способ оплаты.
    • После оплаты счета мерчант получает уведомление (предварительно настройте отправку уведомлений в Личном кабинете). Уведомления об оплате счета содержат параметры авторизации, которые необходимо проверять на сервере мерчанта.
    • Также есть возможность
      • запросить текущий статус оплаты счета,
      • отменить неоплаченный счет.

      Авторизация

      Запросы мерчанта авторизуются посредством секретного ключа API (SECRET_KEY). Параметр авторизации указывается в заголовке Authorization, значение которого формируется как «Bearer SECRET_KEY».

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

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

      Важно! Не передавайте секретный ключ третьим лицам!.

      const QiwiBillPaymentsAPI = require('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

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

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

      Для тестирования вы можете выставлять и оплачивать счета на 1 рубль.

      Запрос → 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": 1.00 \ >, \ "comment": "test", \ "expirationDateTime": "2018-04-13T14:30:00+03:00", \ "customer": <>, \ "customFields": <> \ >' 
       $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" ), "" ); 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" >, >, customFields: new CustomFields  ThemeCode = "кодСтиля" > ); 
      Параметр Описание Тип Обяз.
      billId Уникальный идентификатор счета в системе мерчанта string +
      amount.value Сумма, на которую выставляется счет, округленная в меньшую сторону до 2 десятичных знаков Number(6.2) +
      amount.currency Валюта счета (Alpha-3 ISO 4217 код) +
      phone Номер телефона пользователя, на который выставляется счет (в международном формате) string
      email E-mail пользователя, куда будет отправлена ссылка для оплаты счета string
      account Идентификатор пользователя в системе мерчанта string
      comment Комментарий к счету String(255)
      customFields[] Дополнительные данные счета String(255)
      expirationDateTime Дата, до которой счет будет доступен для оплаты. Если счет не будет оплачен до этой даты, ему присваивается финальный статус EXPIRED и последующая оплата станет невозможна. URL-закодированная строка
      ГГГГ-ММ-ДДTччмм+\-чч:мм
      +

      HEADERS

      • Authorization: Bearer SECRET_KEY
      • Accept: application/json

      Ответ ←

       "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" > 

      HEADERS

      • Accept: application/json
      Параметр Тип Описание
      billId String Уникальный идентификатор счета в системе мерчанта
      siteId String Идентификатор сайта мерчанта в 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. Уведомления об оплате счетов

      Уведомление о платеже (callback) отправлялся только по протоколу HTTPS и только на 443 порт. Сертификат должен быть выдан доверенным центром сертификации (напр., Comodo, Verisign, Thawte и т.п.)

      Запрос ← 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":"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).

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

      HEADERS

      • X-Api-Signature-SHA256: XXX
      • Accept: application/json
      • Content-type: application/json

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

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

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

      1. Объединить значения параметров в одну строку с разделителем | : invoice_parameters = |||| где – значение параметра уведомления. Все значения при проверке подписи должны трактоваться как строки.
      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 
       $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 Идентификатор сайта мерчанта в 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" > 

      HEADERS

      • Content-type: application/json

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

      Если в ответе код состояния HTTP отличается от 200 (OK), это интерпретируется как временная ошибка мерчанта. Сервер QIWI будет повторять запрос с нарастающим интервалом в течение суток.

      3. Проверка статуса оплаты счета

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

      Запрос → 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***********************' 
       $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); 

      URL https://api.qiwi.com/partner/bill/v1/bills/

      • billId — уникальный идентификатор счета в системе мерчанта.

      HEADERS

      • Authorization: Bearer SECRET_KEY
      • Accept: application/json

      Ответ ←

       "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" : "" > 

      HEADERS

      • Accept: application/json
      Параметр Тип Описание
      billId String Уникальный идентификатор счета в системе мерчанта
      siteId String Идентификатор сайта мерчанта в 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чч:мм:сс+\-чч:мм

      4. Отмена неоплаченного счета

      Метод позволяет отменить неоплаченный счет.

      Запрос → 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***********************' 
       $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); 

      URL https://api.qiwi.com/partner/bill/v1/bills//reject

        Параметры:
      • billId — уникальный идентификатор счета в системе мерчанта.

      HEADERS

      • Authorization: Bearer SECRET_KEY
      • Accept: application/json

      Ответ ←

       "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" : "" > 

      HEADERS

      • Accept: application/json
      Параметр Тип Описание
      billId String Уникальный идентификатор счета в системе мерчанта
      siteId String Идентификатор сайта мерчанта в QIWI Кассе
      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чч:мм:сс+\-чч:мм

      5. Возврат средств

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

      Запрос → PUT

      const billId = '893794793973'; const refundId = '899343443'; const amount = 12; const currency = 'RUB' qiwiApi.refund(billId, refundId, amount, currency).then( data =>  //do with data >); 
      curl https://api.qiwi.com/partner/bill/v1/bills/893794793973/refunds/899343443 \ -X PUT \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjIwNDIsImFwaV91c2VyX2lkIjo1NjYwMzk3Miwic2VjcmV0IjoiQjIwODlDNkI5Q0NDNTdCNDQzNGHJK43JFJDK595FJFJMjlCRkFFRDM5OE***********************' \ -d ' < \ "amount": < \ "currency": "RUB", \ "value": 1 \ >\ >' 
       $billId = '893794793973'; $refundId = '899343443'; $amount = 12; $currency = 'RUB'; /** @var \Qiwi\Api\BillPayments $billPayments */ $response = $billPayments->refund($billId, $refundId, $amount, $currency); print_r($response); ?> 
      String billId = "fcb40a23-6733-4cf3-bacf-8e425fd1fc71"; String refundId = UUID.randomUUID().toString(); MoneyAmount amount = new MoneyAmount( BigDecimal.valueOf(104.90), Currency.getInstance("RUB") ); RefundResponse refundResponse = client.refundBill(paidBillId, refundId, amount); 
      var billId = "fcb40a23-6733-4cf3-bacf-8e425fd1fc71"; var refundId = Guid.NewGuid().ToString(); var amount = new MoneyAmount  ValueDecimal = 104.9m, CurrencyEnum = CurrencyEnum.Rub >; var refundResponse = client.refundBill(paidBillId, refundId, amount); 

      URL https://api.qiwi.com/partner/bill/v1/bills//refunds/

        Параметры:
      • billId — уникальный идентификатор счета в системе мерчанта.
      • refundId — уникальный идентификатор возврата в системе мерчанта.
      • в JSON-теле запроса:
        • amount.value — сумма возврата.
        • amount.currency — валюта возврата.

        HEADERS

        • Authorization: Bearer SECRET_KEY
        • Accept: application/json
        • Content-Type: application/json

        Ответ ←

         "amount":  "value": 50.50, "currency": "RUB" >, "datetime": "2018-03-01T16:06:57+03", "refundId": "1", "status": "PARTIAL" > 

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

         "serviceName": "invoicing", "errorCode": "refund.incorrect.amount", "description": "Неверная сумма возврата", "userMessage": "Неверная сумма возврата", "datetime": "2005-08-09T18:31:42+03:00", "traceId" : "" > 

        HEADERS

        • Accept: application/json
        Параметр Тип Описание
        datetime String Если ответ содержит ошибку: Системная дата обработки запроса
        refundId String Уникальный идентификатор возврата в системе мерчанта
        amount.value Number Сумма счета, округленная до 2 знаков после запятой в меньшую сторону
        amount.currency String Идентификатор валюты счета (Alpha-3 ISO 4217 код)
        status String Статус возврата
        datetime String Системная дата проведения возврата. Формат даты:
        ГГГГ-ММ-ДДTчч:мм:сс+hh

        6. Статус возврата

        Метод запрашивает статус возврата по оплаченному счету.

        Запрос → GET

        const billId = '893794793973'; const refundId = '899343443'; qiwiApi.getRefundInfo(billId, refundId).then( data =>  //do with data >); 
        curl https://api.qiwi.com/partner/bill/v1/893794793973/refund/899343443 \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer eyJ2ZXJzaW9uIjoicmVzdF92MyIsImRhdGEiOnsibWVyY2hhbnRfaWQiOjIwNDIsImFwaV91c2VyX2lkIjo1NjYwMzk3Miwic2VjcmV0IjoiQjIwODlDNkI5Q0NDNTdCNDQzNGHJK43JFJDK595FJFJMjlCRkFFRDM5OE***********************' 
         $billId = '893794793973'; $refundId = '899343443'; /** @var \Qiwi\Api\BillPayments $billPayments */ $response = $billPayments->getRefundInfo($billId, $refundId); print_r($response); ?> 
        String billId = "fcb40a23-6733-4cf3-bacf-8e425fd1fc71"; String refundId = '3444e8ca-cf68-4dbd-92ee-f68c4bf8f29b'; RefundResponse response = client.getRefundInfo(paidBillId, refundId); 
        var billId = "fcb40a23-6733-4cf3-bacf-8e425fd1fc71"; var refundId = "3444e8ca-cf68-4dbd-92ee-f68c4bf8f29b"; var response = client.getRefundInfo(paidBillId, refundId); 

        URL https://api.qiwi.com/partner/bill/v1/bills//refunds/

          Параметры:
        • billId — уникальный идентификатор счета в системе мерчанта.
        • refundId — уникальный идентификатор возврата в системе мерчанта.

        HEADERS

        • Authorization: Bearer SECRET_KEY
        • Accept: application/json

        Ответ ←

         "amount":  "value": 50.50, "currency": "RUB" >, "datetime": "2018-03-01T16:06:57+03", "refundId": "1", "status": "PARTIAL" > 

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

         "serviceName": "invoicing", "errorCode": "refund.incorrect.amount", "description": "Неверная сумма возврата", "userMessage": "Неверная сумма возврата", "datetime": "2005-08-09T18:31:42+03:00", "traceId" : "" > 

        HEADERS

        • Accept: application/json
        Параметр Тип Описание
        datetime String Если ответ содержит ошибку: Системная дата обработки запроса
        refundId String Уникальный идентификатор возврата в системе мерчанта
        amount.value Number Сумма счета, округленная до 2 знаков после запятой в меньшую сторону
        amount.currency String Идентификатор валюты счета (Alpha-3 ISO 4217 код)
        status String Статус возврата
        datetime String Системная дата проведения возврата. Формат даты:
        ГГГГ-ММ-ДДTчч:мм:сс+hh

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

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

        Статусы операции возврата

        Статус Описание Финальный
        PARTIAL Частичный возврат суммы
        FULL Полный возврат суммы +

        Дополнительно

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

        При открытии формы в webview на android обязательно включать settings.setDomStorageEnabled(true)

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

        REDIRECT →

        URL https://oplata.qiwi.com/create

        const publicKey = 'Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******'; const params =  publicKey, amount: 42.24, billId: '893794793973', email: 'm@ya.ru' >; const link = qiwiApi.createPaymentForm(params); 
        curl https://oplata.qiwi.com/create?publicKey=Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******&amount=100&billId=893794793973&email=m@ya.ru 
         $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 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 Ключ идентификации мерчанта, полученный в QIWI Кассе 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ччмм

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

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

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

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

        Для пользователей p2p: вы можете настроить наименование, которое будет отображаться на форме оплаты, в личном кабинете p2p.qiwi.com. Наименование также привязано к стилю.

        Пример передачи параметра при работе с формой

        curl https://oplata.qiwi.com/create?publicKey=Fnzr1yTebUiQaBLDnebLMMxL8nc6FF5zfmGQnypc*******&amount=100&billId=893794793973&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": \ >' 

        Customer form

        Checkout Popup

        Пример работы popup

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

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

        Пример выставления счета через 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 Ключ идентификации мерчанта, полученный в QIWI Кассе String +
        amount Сумма, на которую выставляется счет, округленная в меньшую сторону до 2 десятичных знаков Number(6.2) +
        phone Номер телефона пользователя, на который выставляется счет (в международном формате) String
        email E-mail пользователя, куда будет отправлена ссылка для оплаты счета String
        account Идентификатор пользователя в системе мерчанта String
        comment Комментарий к счету String(255)
        customFields Дополнительные данные счета Object
        lifetime Дата, до которой счет будет доступен для оплаты. Если счет не будет оплачен до этой даты, ему присваивается финальный статус EXPIRED и последующая оплата станет невозможна. Строка в виде ГГГГ-ММ-ДДTччмм

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

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

        params = < payUrl: 'https://oplata.qiwi.com/form?invoiceUid=06df838c-0f86-4be3-aced-a950c244b5b1' >QiwiCheckout.openInvoice(params) .then(data => < // . >) .catch(error => < // . >) 
        Параметр Описание Тип Обязательное
        payUrl URL инвойса String +

        Возможности при открытии ссылки счета

        При открытии формы в webview на android обязательно включать settings.setDomStorageEnabled(true)

        При выставлении счета через 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 — карта СОВЕСТЬ
        Строка с разделителями-запятыми
        lifetime Дата, до которой счет будет доступен для оплаты. Если счет не будет оплачен до этой даты, ему присваивается финальный статус EXPIRED и последующая оплата станет невозможна. Строка формата
        ГГГГ-ММ-ДДTччмм

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

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

        • NODE JS SDK — Готовое решение для разработки server2server интеграции c помощью Node.js.
        • PHP SDK — Готовое решение для разработки server2server интеграции c помощью PHP.
        • Java SDK — Готовое решение для разработки server2server интеграции c помощью Java.
        • .Net SDK — Готовое решение для разработки server2server интеграции c помощью C# .Net.

        Решения для CMS

        • WordPress — расширение под Woocommerce для работы с заказами
        • Онлайн Лейка — WordPress расширение для благотворительности
        • 1С-Битрикс — решение для работы с заказами
        • Opencart — решение для работы с заказами
        • PrestaShop — решение для работы с заказами

        Рекомендации к оформлению

        Иконки

        Данные рекомендации помогут вашим пользователям быстрее сориентироваться на странице выбора способов оплаты.

        • Если платежный протокол QIWI — один из способов оплаты на вашем сайте, то мы рекомендуем выводить иконки всех способов оплаты, доступных на форме:

        Operation Flow

        Допустимо отображение QIWI Кассы текстом, без логотипа. Иконки способов оплаты выводятся:

        Operation Flow

        • Если платежный протокол QIWI Кассы — единственный способ оплаты на вашем сайте, то упоминание QIWI Кассы в этом случае необязательно. Иконки способов оплаты, доступных на форме, в этом случае надо размещать под кнопкой оплаты:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *