Skip to content

Commit 7861e60

Browse files
committed
Merge branch 'readme_update2' into 'main'
QR code example See merge request ypmn-public/php-api-client!28
2 parents 16f6150 + b7c0922 commit 7861e60

File tree

8 files changed

+203
-53
lines changed

8 files changed

+203
-53
lines changed

README.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
- [Запуск встроенного сервера](#запуск-встроенного-сервера)
1212
- [Запуск в контейнере docker](#запуск-в-контейнере-docker)
1313
- [Примеры использования](#примеры-использования)
14-
- [Начало работы: настройка интеграции](#1-начало-работы--настройка-интеграции)
14+
- [Начало работы: настройка интеграции](#1-начало-работы-настройка-интеграции)
1515
- [Приём платежей](#2-приём-платежей)
1616
- [Подписки](#3-подписки) (рекуррентные платежи)
1717
- [Токенизация](#4-токенизация) (запомнить данные плательщика, чтобы не запрашивать и не вводить их повторно)
@@ -21,7 +21,7 @@
2121
- [Подключение продавцов](#8-подключение-продавцов)
2222
- [Обработка вебхуков](#9-обработка-вебхуков)
2323
- [Страница после оплаты](#10-страница-после-оплаты)
24-
- [Безопасные поля](#11-безопасные-поля--secure-fields-) (отдельный вид интеграции карточной формы)
24+
- [Безопасные поля](#11-безопасные-поля-secure-fields) (отдельный вид интеграции карточной формы)
2525
- [Обработка ошибок](#12-обработка-ошибок)
2626
- [Обновление библиотеки](#обновление)
2727
- [Поддержка и контакты](#ссылки-поддержка-и-контакты)
@@ -91,17 +91,18 @@ docker compose up --detach
9191

9292
##### 2. Приём платежей
9393
1. [Cамый простой платёж](src/Examples/simpleGetPaymentLink.php)
94-
2. [Подробный платёж](src/Examples/getPaymentLink.php)
95-
4. [Платёж со сплитом (разделением платежа для нескольких получателей)](src/Examples/getPaymentLinkMarketplace.php)
96-
3. [Платёж через СБП (Систему Быстрых Платежей)](src/Examples/getFasterPayment.php)
97-
5. [Списание средств (только для двустадийной оплаты)](src/Examples/paymentCapture.php)
94+
1. [Подробный платёж](src/Examples/getPaymentLink.php)
95+
1. [Платёж со сплитом (разделением платежа для нескольких получателей)](src/Examples/getPaymentLinkMarketplace.php)
96+
1. [Платёж через СБП (Систему Быстрых Платежей)](src/Examples/getFasterPayment.php)
97+
1. [Списание средств (только для двустадийной оплаты)](src/Examples/paymentCapture.php)
98+
1. [Встраивание QR-кода без страницы оплаты](/src/Examples/payQrCode.php)
9899

99100
##### 3. Подписки
100101
Рекуррентные платежи
101102
1. [Создание подписки СБП](src/Examples/getBindingFasterPayment.php)
102-
2. [Оплата по подписке СБП](src/Examples/paymentByFasterBinding.php)
103+
1. [Оплата по подписке СБП](src/Examples/paymentByFasterBinding.php)
103104
1. [Создание подписки SberPay, T-Pay, Картой не РФ](src/Examples/getBindingPays.php)
104-
2. [Оплата по подписке SberPay, T-Pay, Картой не РФ](src/Examples/paymentByBindingPays.php)
105+
1. [Оплата по подписке SberPay, T-Pay, Картой не РФ](src/Examples/paymentByBindingPays.php)
105106

106107
##### 4. Токенизация
107108
Запомнить данные клиента, чтобы не запрашивать и не вводить их повторно

example.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
case 'SOMGetPaymentLink':
5252
case 'qstList':
5353
case 'webhookProcessing':
54+
case 'payQrCode':
5455
require './src/Examples/start.php';
5556
@include './src/Examples/'.$_GET['function'] . '__prepend.php';
5657
require './src/Examples/'.$_GET['function'] . '.php';

example_list.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,19 @@
3131
'getFasterPayment' => [
3232
'name' => 'Оплата через СБП',
3333
'about' => 'Пример платежа через систему быстрых платежей',
34-
'docLink' => 'https://ypmn.ru/ru/documentation/',
34+
'docLink' => 'https://ypmn.ru/ru/documentation/#tag/payment-api/paths/~1v4~1payments~1authorize/post',
3535
'link' => '',
3636
],
3737
'getFasterPaymentWithReceipts' => [
3838
'name' => 'Оплата через СБП с регистрацией чека',
3939
'about' => 'Пример платежа через систему быстрых платежей с регистрацией чека',
40-
'docLink' => 'https://ypmn.ru/ru/documentation/',
40+
'docLink' => 'https://ypmn.ru/ru/documentation/#tag/payment-api/paths/~1v4~1payments~1authorize/post',
41+
'link' => '',
42+
],
43+
'payQrCode' => [
44+
'name' => 'QR-код на примере TPay',
45+
'about' => 'Пример отображение QR-кода Pay-метода без платёжной формы',
46+
'docLink' => 'https://ypmn.ru/ru/documentation/#tag/payment-api/paths/~1v4~1payments~1authorize/post',
4147
'link' => '',
4248
],
4349
'getBindingFasterPayment' => [
@@ -196,12 +202,6 @@
196202
'docLink' => 'https://ypmn.ru/ru/documentation/#tag/qst-api/paths/~1v4~1qst~1list/get',
197203
'link' => '',
198204
],
199-
'getWidget' => [
200-
'name' => 'Получение виджета',
201-
'about' => 'В этом примере показано получение виджета.',
202-
'docLink' => 'https://ypmn.ru/ru/documentation/#tag/widget-integration',
203-
'link' => '',
204-
],
205205
'webhookProcessing' => [
206206
'name' => 'Обработка вебхука',
207207
'about' => 'В этом примере показана обработка вебхука IPN',

src/Authorization.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public function setPaymentMethod(?string $paymentMethod = null) : self
4949
switch ($paymentMethod) {
5050
case PaymentMethods::CCVISAMC:
5151
case PaymentMethods::FASTER_PAYMENTS:
52-
case PaymentMethods::SOM:
52+
case PaymentMethods::INTCARD:
5353
case PaymentMethods::MIRPAY:
5454
case PaymentMethods::ALFAPAY:
5555
case PaymentMethods::TPAY:
@@ -70,7 +70,7 @@ public function setPaymentMethod(?string $paymentMethod = null) : self
7070
}
7171

7272
/** @inheritDoc */
73-
public function setUsePaymentPage(bool $isUsed) : self
73+
public function setUsePaymentPage(?bool $isUsed) : self
7474
{
7575
if ($isUsed === true) {
7676
if (is_null($this->merchantToken) && is_null($this->cardDetails)) {

src/AuthorizationInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ public function getPaymentMethod(): ?string;
2020

2121
/**
2222
* Установить Использование платёжной страницы
23-
* @param bool $isUsed Использовать платёжную страницу
23+
* @param null|bool $isUsed Использовать платёжную страницу
2424
* @return AuthorizationInterface
2525
*/
26-
public function setUsePaymentPage(bool $isUsed): self;
26+
public function setUsePaymentPage(?bool $isUsed): self;
2727

2828
/**
2929
* Получить Данные Карты

src/Examples/payQrCode.php

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Ypmn\Authorization;
6+
use Ypmn\Payment;
7+
use Ypmn\Client;
8+
use Ypmn\Billing;
9+
use Ypmn\ApiRequest;
10+
use Ypmn\PaymentException;
11+
use Ypmn\PaymentMethods;
12+
use Ypmn\Product;
13+
use Ypmn\Std;
14+
15+
// Подключим файл, в котором заданы параметры мерчанта
16+
include_once 'start.php';
17+
18+
// Оплата по ссылке Ypmn
19+
// Минимальный набор полей
20+
21+
// Представим, что мы не хотим передавать товары, только номер заказа и сумму
22+
// Установим номер (ID) заказа (номер заказа в вашем магазине, должен быть уникален в вашей системе)
23+
$merchantPaymentReference = "order_id_" . time();
24+
25+
$orderAsProduct = new Product([
26+
'name' => 'Заказ №' . $merchantPaymentReference,
27+
'sku' => $merchantPaymentReference,
28+
'unitPrice' => 20.42,
29+
'quantity' => 1,
30+
]);
31+
32+
// Опишем Биллинговую (платёжную) информацию
33+
$billing = new Billing;
34+
// Установим Код страны
35+
$billing->setCountryCode('RU');
36+
// Установим Имя Плательщика
37+
$billing->setFirstName('Иван');
38+
// Установим Фамилия Плательщика
39+
$billing->setLastName('Петров');
40+
// Установим Email Плательщика (необязательно)
41+
$billing->setEmail('[email protected]');
42+
// Установим Телефон Плательщика
43+
$billing->setPhone('+7-800-555-35-35');
44+
// Установим Город
45+
$billing->setCity('Москва');
46+
47+
// Создадим клиентское подключение
48+
$client = new Client;
49+
// Установим биллинг
50+
$client->setBilling($billing);
51+
52+
// Создадим платёж
53+
$payment = new Payment;
54+
// Присвоим товарные позиции
55+
$payment->addProduct($orderAsProduct);
56+
// Создадим запрос на авторизацию платежа
57+
// здесь первым параметром можно передать конкретный способ оплаты из справочника
58+
// PaymentMethods.php
59+
$payment->setAuthorization(
60+
(new Authorization())
61+
->setPaymentMethod(PaymentMethods::TPAY)
62+
->setUsePaymentPage(false)
63+
);
64+
// Установим номер заказа (должен быть уникальным в вашей системе)
65+
$payment->setMerchantPaymentReference($merchantPaymentReference);
66+
// Установим адрес перенаправления пользователя после оплаты
67+
$payment->setReturnUrl('https://test.u2go.ru/php-api-client/?function=returnPage');
68+
// Установим клиентское подключение
69+
$payment->setClient($client);
70+
71+
// Создадим HTTP-запрос к API
72+
$apiRequest = new ApiRequest($merchant);
73+
// Включить режим отладки (закомментируйте или удалите в рабочей программе!)
74+
$apiRequest->setDebugMode();
75+
// Переключиться на тестовый сервер (закомментируйте или удалите в рабочей программе!)
76+
$apiRequest->setSandboxMode();
77+
// Отправим запрос
78+
$responseData = $apiRequest->sendAuthRequest($payment, $merchant);
79+
// Преобразуем ответ из JSON в массив
80+
// TODO: перенести валидацию в функцию ApiClient
81+
try {
82+
$responseData = json_decode((string) $responseData["response"], true);
83+
84+
if (isset($responseData['code'])
85+
&& $responseData['code'] === 429
86+
&& $responseData['status'] === 'LIMIT_CALLS_EXCEEDED'
87+
) {
88+
throw new PaymentException('YPMN-002: LIMIT_CALLS_EXCEEDED (превышена частота запросов к серверу)');
89+
}
90+
91+
if (isset($responseData["paymentResult"])) {
92+
if (!empty($responseData['paymentResult']['bankResponseDetails']['customBankNode']['qr'])) {
93+
$qr = $responseData['paymentResult']['bankResponseDetails']['customBankNode']['qr'];
94+
}
95+
96+
// Выведем кнопку оплаты
97+
echo Std::drawYpmnButton([
98+
'qr' => ($qr ?? null),
99+
'url' => $responseData["paymentResult"]['url'],
100+
'sum' => $payment->sumProductsAmount(),
101+
'newpage' => true,
102+
]);
103+
104+
// ...или просто картинка без кнопки:
105+
// Std::data_img_tag($responseData['paymentResult']['bankResponseDetails']['customBankNode']['qr']);
106+
}
107+
} catch (Exception $exception) {
108+
//TODO: обработка исключения
109+
echo Std::alert([
110+
'text' => '
111+
Извините, платёжный метод временно недоступен.<br>
112+
Вы можете попробовать другой способ оплаты, либо свяжитесь с продавцом.<br>
113+
<br>
114+
<pre>' . $exception->getMessage() . '</pre>',
115+
'type' => 'danger',
116+
]);
117+
118+
throw new PaymentException('Платёжный метод временно недоступен');
119+
}

src/PaymentMethods.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ class PaymentMethods
1111
public const FASTER_PAYMENTS = 'FASTER_PAYMENTS'; // СБП
1212
public const PAYOUT = 'PAYOUT'; // Выплата по номеру карты
1313
public const PAYOUT_FP = 'PAYOUT_FP'; // Выплата по номеру телефона
14-
public const MIRPAY = 'MIRPAY'; // MIR PAY
1514
public const BNPL = 'BNPL'; // Рассрочка
16-
public const SOM = 'SOM';
15+
public const INTCARD = 'INTCARD';
16+
17+
public const ALFAPAY = 'ALFAPAY';
1718
public const SBERPAY = 'SBERPAY';
19+
public const MIRPAY = 'MIRPAY'; // MIR PAY
1820
public const TPAY = 'TPAY';
19-
public const ALFAPAY = 'ALFAPAY';
2021
}

0 commit comments

Comments
 (0)