diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..7568f7d
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,11 @@
+# Main project pipeline
+variables:
+ GIT_STRATEGY: none
+
+stages:
+ - code-approve-reset
+ - mr-approve-check
+
+include:
+ - local: 'ci/code-approve-reset.yml'
+ - local: 'ci/mr-approve-check.yml'
diff --git a/README.md b/README.md
index 6ff08af..b598cd9 100644
--- a/README.md
+++ b/README.md
@@ -1,89 +1,169 @@
# «Твои Платежи»: Интеграция на PHP
-Готовая библиотека + подробные примеры с комментариями. Требования: [PHP 7.4 и выше](https://github.com/yourpayments/php-api-client/blob/main/composer.json)
+Готовая библиотека PHP API Client для YourPayments +
+подробные примеры с комментариями

-[Пакет Composer](https://packagist.org/packages/yourpayments/php-api-client) может
-использоваться с любыми фреймворками, платформами и CMS, включая, но не ограничиваясь: Laravel, Bitrix, Wordpress, Yii, Symfony, и др.
+## Оглавление
+- [Описание](#описание)
+- [Требования](#требования)
+- [Установка](#установка)
+ - [Запуск встроенного сервера](#запуск-встроенного-сервера)
+ - [Запуск в контейнере docker](#запуск-в-контейнере-docker)
+- [Примеры использования](#примеры-использования)
+ - [Начало работы: настройка интеграции](#1-начало-работы-настройка-интеграции)
+ - [Приём платежей](#2-приём-платежей)
+ - [Подписки](#3-подписки) (рекуррентные платежи)
+ - [Токенизация](#4-токенизация) (запомнить данные плательщика, чтобы не запрашивать и не вводить их повторно)
+ - [Отчёты и статусы платежей](#5-отчёты)
+ - [Возврат средств плательщику](#6-возврат-средств-плательщику-refund) (refunds, рефанды)
+ - [Выплаты](#7-выплаты) (отправка денег по номеру карты или телефона)
+ - [Подключение продавцов](#8-подключение-продавцов)
+ - [Обработка вебхуков](#9-обработка-вебхуков)
+ - [Страница после оплаты](#10-страница-после-оплаты)
+ - [Безопасные поля](#11-безопасные-поля-secure-fields) (отдельный вид интеграции карточной формы)
+ - [Обработка ошибок](#12-обработка-ошибок)
+- [Обновление библиотеки](#обновление)
+- [Поддержка и контакты](#ссылки-поддержка-и-контакты)
+
+## Описание
+`yourpayments/php-api-client` — это PHP библиотека для быстрой и удобной интеграции с платежным шлюзом YourPayments.
+С её помощью можно принимать оплаты и создавать выплаты, получать отчёты, делать возвраты и работать с подпискам.
+
+Библиотека ориентирована на простое и надёжное использование, подходит как для опытных, так и для начинающих разработчиков.
+
+Особенностями этой системы являются:
+- мульти-эквайринг (работа сразу со многими банками)
+- поддержка сплитования (много получателей платежа в одном чеке)
+- безопасность и точность расчётов
+
+Библиотека содержит:
+- Сам клиент API
+- Простой встроенный сервер с примерами
+- Описание контейнера для запуска в Docker
+
+---
+
+## Требования
+
+- PHP 7.4 и выше (рекомендуется PHP 8.1+)
+- Расширения PHP: `curl`, `json`, `mbstring`
+- Рекомендуется: Composer для управления зависимостями
+
+---
+
+## Установка
+Установка с [пакета composer](https://packagist.org/packages/yourpayments/php-api-client) -- самый простой и рекомендуемый способ:
-## Установка и обновление за 1 минуту
```shell
composer require yourpayments/php-api-client
```
+
+Если на вашем проекте нет Composer,
+склонируйте или скачайте, а затем подключите файлы этого репозитория,
+([пример](src/Examples/autoload.php))
+
+### Запуск встроенного сервера
```shell
-composer update yourpayments/php-api-client
+php -S localhost:8081 index.php
```
-(если на вашем проекте нет composer, слонируйте или скачайте, а затем подключите ([require](https://www.php.net/manual/ru/function.require.php)) файлы этого репозитория)
-## Запуск в контейнере docker
+После запуска по адресу http://localhost:8081 будут доступны интерактивные примеры в следующем виде:
+
+
+
+### Запуск в контейнере docker
Создайте и запустите docker контейнер следующей командой:
```shell
docker compose up
```
-либо в фоновом режиме командой:
+
+Либо в фоновом режиме командой:
```shell
docker compose up --detach
```
После выполнения сервис с документацией и примерами будет доступен по адресу http://localhost:8080/
+
+---
-## Примеры с комментариями на русском языке:
+## Примеры использования:
##### 1. [Начало работы: настройка интеграции](src/Examples/start.php)
-##### 2. Платежи
+##### 2. Приём платежей
1. [Cамый простой платёж](src/Examples/simpleGetPaymentLink.php)
-2. [Подробный платёж](src/Examples/getPaymentLink.php)
-3. [Платёж через СБП (Систему Быстрых Платежей)](src/Examples/getFasterPayment.php)
-4. [Платёж со сплитом (разделением платежа)](src/Examples/getPaymentLinkMarketplace.php)
-5. [Списание средств](src/Examples/paymentCapture.php)
+1. [Подробный платёж](src/Examples/getPaymentLink.php)
+1. [Платёж со сплитом (разделением платежа для нескольких получателей)](src/Examples/getPaymentLinkMarketplace.php)
+1. [Платёж через СБП (Систему Быстрых Платежей)](src/Examples/getFasterPayment.php)
+1. [Списание средств (только для двустадийной оплаты)](src/Examples/paymentCapture.php)
+1. [Встраивание QR-кода без страницы оплаты](/src/Examples/payQrCode.php)
-##### 3. Подписки СБП
+##### 3. Подписки
+Рекуррентные платежи
1. [Создание подписки СБП](src/Examples/getBindingFasterPayment.php)
-2. [Оплата по подписке СБП](src/Examples/paymentByFasterBinding.php)
-
-##### 4. Подписки SberPay, T-Pay
-1. [Создание подписки](src/Examples/getBindingPays.php)
-2. [Оплата по подписке](src/Examples/paymentByBindingPays.php)
+1. [Оплата по подписке СБП](src/Examples/paymentByFasterBinding.php)
+1. [Создание подписки SberPay, T-Pay, Картой не РФ](src/Examples/getBindingPays.php)
+1. [Оплата по подписке SberPay, T-Pay, Картой не РФ](src/Examples/paymentByBindingPays.php)
-##### 5. Токенизация карты (чтобы запомнить карту клиента и не вводить повторно)
+##### 4. Токенизация
+Запомнить данные клиента, чтобы не запрашивать и не вводить их повторно
1. [Создание платёжного токена ](src/Examples/getToken.php)
2. [Оплата токеном](src/Examples/paymentByToken.php)
-##### 6. Отчёты
+##### 5. Отчёты
1. [Проверка статуса платежа](src/Examples/paymentGetStatus.php)
2. [Запрос детального отчета по заказу](src/Examples/getReportOrderDetails.php)
3. [Запрос быстрого отчёта по заказам для сверки](src/Examples/getReportOrder.php)
4. [Запрос отчёта по заказам](src/Examples/getReportGeneral.php)
5. [Запрос отчёта в виде графика](src/Examples/getReportChart.php)
-##### 7. Возврат средств плательщику (Refund)
+##### 6. Возврат средств плательщику (Refund)
1. [Возврат средств](src/Examples/paymentRefund.php)
2. [Возврат средств со сплитом (разделением платежа)](src/Examples/paymentRefundMarketplace.php)
-##### 8. Выплаты
+##### 7. Выплаты
1. [Выплаты на банковские карты](src/Examples/payoutCreate.php)
2. [Запрос баланса для выплаты](src/Examples/payoutGetBalance.php)
-##### 9. [Безопасные поля (Secure fields)](src/Examples/secureFields.php)
-2. [Создание сессии](src/Examples/getSession.php)
-3. [Оплата одноразовым токеном](src/Examples/oneTimeTokenPayment.php)
-
-##### 10. [Страница после оплаты](src/Examples/returnPage.php)
-
-##### 11. Подключение продавцов (сабмерчантов маркетплейсов)
+##### 8. Подключение продавцов
+Добавление сабмерчантов маркетплейсов по API
1. [Подключение продавца-юридического лица (отправка анкеты)](src/Examples/qstCreateOrg.php)
2. [Подключение продавца-ИП (отправка анкеты)](src/Examples/qstCreateIp.php)
3. [Получение статуса анкеты](src/Examples/qstStatus.php)
4. [Печать анкеты](src/Examples/qstPrint.php)
5. [Список анкет](src/Examples/qstList.php)
-##### 12. Виджет
-- [Подключение виджета](src/Examples/getWidget.php)
+##### 9. [Обработка вебхуков](src/Examples/webhookProcessing.php)
+Вебхуки -- HTTP запросы, оповещающие ваш сервер о событиях (успешные и неуспешные оплаты, списания)
+
+##### 10. [Страница после оплаты](src/Examples/returnPage.php)
+
+##### 11. [Безопасные поля (Secure fields)](src/Examples/secureFields.php)
+2. [Создание сессии](src/Examples/getSession.php)
+3. [Оплата одноразовым токеном](src/Examples/oneTimeTokenPayment.php)
+
+##### 12. Обработка ошибок
+Библиотека выбрасывает один вид исключений: [Ypmn\PaymentException](/src/PaymentException.php).
+
+Пример перехвата исключения можно посмотреть в примере: [Cамый простой платёж](src/Examples/simpleGetPaymentLink.php)
+
+---
+
+## Обновление
+
+Обновления библиотеки позволяют быстро исправлять ошибки и получать доступ к новым функциям
+
+```shell
+composer update yourpayments/php-api-client
+```
+
+---
-## Ссылки
-- [НКО «Твои Платежи»](https://YPMN.ru/)
-- [Докуметация API](https://ypmn.ru/ru/documentation/)
-- [Тестовые банковские карты](https://ypmn.ru/ru/documentation/#tag/testing)
+## Ссылки, поддержка и контакты
+- [НКО «Твои Платежи»](https://YPMN.ru/?utm_source=php-api-client)
+- [Докуметация API](https://ypmn.ru/ru/documentation/?utm_source=php-api-client)
+- [Тестовые банковские карты](https://ypmn.ru/ru/documentation/?utm_source=php-api-client#tag/testing)
+- [FAQ, ответы на частые вопросы](https://ypmn.ru/ru/support/?utm_source=php-api-client)
- [Задать вопрос или сообщить о проблеме](https://github.com/yourpayments/php-api-client/issues/new)
--------------
-🟢 [«Твои Платежи»](https://YPMN.ru/ "Платёжная система для сайтов, платформ и приложений") -- финтех-составляющая для сайтов, платформ и приложений
+---
+🟢 [«Твои Платежи»](https://YPMN.ru/ "Платёжная система для сайтов, платформ и приложений") -- финтех для сайтов, платформ и приложений
diff --git a/ci/code-approve-reset.yml b/ci/code-approve-reset.yml
new file mode 100644
index 0000000..e994d37
--- /dev/null
+++ b/ci/code-approve-reset.yml
@@ -0,0 +1,7 @@
+## Removes all previously applied approvers in MR
+clear_code_approved:
+ stage: code-approve-reset
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+ script:
+ - 'curl -f -X PUT -H "PRIVATE-TOKEN: $REMOVE_APPROVE_TOKEN" -H "Content-Type: application/json" "http://gtl01.dev.ruo.payudc.net/api/v4/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/reset_approvals"'
diff --git a/ci/mr-approve-check.yml b/ci/mr-approve-check.yml
new file mode 100644
index 0000000..592fbb8
--- /dev/null
+++ b/ci/mr-approve-check.yml
@@ -0,0 +1,48 @@
+## Blocks the pipeline if MR is not approved by any
+## of defined gitlab users (ALLOWED_APPROVERS)
+
+mr-approve-check:
+ stage: mr-approve-check
+ needs: ["clear_code_approved"]
+ tags:
+ - mr-check
+ variables:
+ TARGET_BRANCH: main
+ script:
+ - |
+ # Fetch the merge request ID from the environment variable
+ # $merge_request_iid variable is set in gitlab webhook payload
+ if [[ "$CI_PIPELINE_SOURCE" == "trigger" ]]; then
+ MR_ID=${merge_request_iid}
+ else
+ MR_ID=${CI_MERGE_REQUEST_IID}
+ fi
+
+ # Check if MR_ID is set
+ if [ -z "$MR_ID" ]; then
+ echo "This job is not running in a merge request context."
+ exit 0
+ fi
+
+ # Get the list of approvals for the merge request
+ APPROVALS=$(curl --silent -H "PRIVATE-TOKEN: $REMOVE_APPROVE_TOKEN" -H "Content-Type: application/json" "http://gtl01.dev.ruo.payudc.net/api/v4/projects/$CI_PROJECT_ID/merge_requests/$MR_ID/approvals")
+
+ # Define a list of allowed approvers
+ ALLOWED_APPROVERS=("alexander.viktorchik" "alexey.babak" "roman.zimin")
+
+ # Check if any of the allowed users have approved the merge request
+ APPROVED=false
+ for USER in "${ALLOWED_APPROVERS[@]}"; do
+ if echo "$APPROVALS" | grep -q "$USER"; then
+ APPROVED=true
+ echo "Merge request approved by allowed user: $USER."
+ break
+ fi
+ done
+
+ if [ "$APPROVED" = false ]; then
+ echo "Merge request not approved by any allowed users. Blocking the merge request."
+ exit 1
+ fi
+ rules:
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $TARGET_BRANCH'
diff --git a/example.php b/example.php
index ccf56a7..92f5b53 100644
--- a/example.php
+++ b/example.php
@@ -50,6 +50,8 @@
case 'qstPrint':
case 'SOMGetPaymentLink':
case 'qstList':
+ case 'webhookProcessing':
+ case 'payQrCode':
require './src/Examples/start.php';
@include './src/Examples/'.$_GET['function'] . '__prepend.php';
require './src/Examples/'.$_GET['function'] . '.php';
diff --git a/example_list.php b/example_list.php
index 9d410b5..7f9b537 100644
--- a/example_list.php
+++ b/example_list.php
@@ -31,13 +31,19 @@
'getFasterPayment' => [
'name' => 'Оплата через СБП',
'about' => 'Пример платежа через систему быстрых платежей',
- 'docLink' => 'https://ypmn.ru/ru/documentation/',
+ 'docLink' => 'https://ypmn.ru/ru/documentation/#tag/payment-api/paths/~1v4~1payments~1authorize/post',
'link' => '',
],
'getFasterPaymentWithReceipts' => [
'name' => 'Оплата через СБП с регистрацией чека',
'about' => 'Пример платежа через систему быстрых платежей с регистрацией чека',
- 'docLink' => 'https://ypmn.ru/ru/documentation/',
+ 'docLink' => 'https://ypmn.ru/ru/documentation/#tag/payment-api/paths/~1v4~1payments~1authorize/post',
+ 'link' => '',
+ ],
+ 'payQrCode' => [
+ 'name' => 'QR-код на примере TPay',
+ 'about' => 'Пример отображение QR-кода Pay-метода без платёжной формы',
+ 'docLink' => 'https://ypmn.ru/ru/documentation/#tag/payment-api/paths/~1v4~1payments~1authorize/post',
'link' => '',
],
'getBindingFasterPayment' => [
@@ -196,10 +202,10 @@
'docLink' => 'https://ypmn.ru/ru/documentation/#tag/qst-api/paths/~1v4~1qst~1list/get',
'link' => '',
],
- 'getWidget' => [
- 'name' => 'Получение виджета',
- 'about' => 'В этом примере показано получение виджета.',
- 'docLink' => 'https://ypmn.ru/ru/documentation/#tag/widget-integration',
- 'link' => '',
- ],
+ 'webhookProcessing' => [
+ 'name' => 'Обработка вебхука',
+ 'about' => 'В этом примере показана обработка вебхука IPN',
+ 'docLink' => 'https://ypmn.ru/ru/documentation/#tag/webhooks',
+ 'link' => '',
+ ]
];
diff --git a/screenshot2.jpg b/screenshot2.jpg
new file mode 100644
index 0000000..2c5e9b4
Binary files /dev/null and b/screenshot2.jpg differ
diff --git a/src/Authorization.php b/src/Authorization.php
index 791a76a..7cbf549 100644
--- a/src/Authorization.php
+++ b/src/Authorization.php
@@ -49,7 +49,7 @@ public function setPaymentMethod(?string $paymentMethod = null) : self
switch ($paymentMethod) {
case PaymentMethods::CCVISAMC:
case PaymentMethods::FASTER_PAYMENTS:
- case PaymentMethods::SOM:
+ case PaymentMethods::INTCARD:
case PaymentMethods::MIRPAY:
case PaymentMethods::ALFAPAY:
case PaymentMethods::TPAY:
@@ -70,7 +70,7 @@ public function setPaymentMethod(?string $paymentMethod = null) : self
}
/** @inheritDoc */
- public function setUsePaymentPage(bool $isUsed) : self
+ public function setUsePaymentPage(?bool $isUsed) : self
{
if ($isUsed === true) {
if (is_null($this->merchantToken) && is_null($this->cardDetails)) {
diff --git a/src/AuthorizationInterface.php b/src/AuthorizationInterface.php
index f51e3ff..8f5d7df 100644
--- a/src/AuthorizationInterface.php
+++ b/src/AuthorizationInterface.php
@@ -20,10 +20,10 @@ public function getPaymentMethod(): ?string;
/**
* Установить Использование платёжной страницы
- * @param bool $isUsed Использовать платёжную страницу
+ * @param null|bool $isUsed Использовать платёжную страницу
* @return AuthorizationInterface
*/
- public function setUsePaymentPage(bool $isUsed): self;
+ public function setUsePaymentPage(?bool $isUsed): self;
/**
* Получить Данные Карты
diff --git a/src/Billing.php b/src/Billing.php
index 3f4c0a9..faa2594 100644
--- a/src/Billing.php
+++ b/src/Billing.php
@@ -47,9 +47,9 @@ class Billing implements BillingInterface
private ?IdentityDocumentInterface $identityDocument = null;
/** @inheritDoc */
- public function getFirstName(): string
+ public function getFirstName(): ?string
{
- return $this->firstName;
+ return $this->firstName ?? null;
}
/** @inheritDoc */
@@ -60,9 +60,9 @@ public function setFirstName(string $firstName): self
}
/** @inheritDoc */
- public function getLastName(): string
+ public function getLastName(): ?string
{
- return $this->lastName;
+ return $this->lastName ?? null;
}
/** @inheritDoc */
@@ -75,7 +75,7 @@ public function setLastName(string $lastName): self
/** @inheritDoc */
public function getEmail(): ?string
{
- return $this->email;
+ return $this->email ?? null;
}
/** @inheritDoc */
@@ -218,7 +218,7 @@ public function getIdentityDocument(): ?IdentityDocumentInterface
}
/** @inheritdoc */
- public function getType(): string
+ public function getType(): ?string
{
return $this->type;
}
diff --git a/src/BillingInterface.php b/src/BillingInterface.php
index 45f1aa3..18d6fd3 100644
--- a/src/BillingInterface.php
+++ b/src/BillingInterface.php
@@ -13,9 +13,9 @@ public function setFirstName(string $firstName) : self;
/**
* Получить Имя
- * @return string
+ * @return string|null
*/
- public function getFirstName() : string;
+ public function getFirstName() : ?string;
/**
* Установить Фамилия
@@ -26,9 +26,9 @@ public function setLastName(string $lastName) : self;
/**
* Получить Фамилия
- * @return string
+ * @return string|null
*/
- public function getLastName() : string;
+ public function getLastName() : ?string;
/**
* Установить Email
@@ -52,7 +52,7 @@ public function setPhone(string $phone) : self;
/**
* Получить Номер Телефона
- * @return string
+ * @return string|null
*/
public function getPhone() : ?string;
@@ -65,7 +65,7 @@ public function setCountryCode(string $countryCode) : self;
/**
* Получить Код Страны
- * @return string
+ * @return string|null
*/
public function getCountryCode() : ?string;
@@ -78,7 +78,7 @@ public function setCity(string $city) : self;
/**
* Получить Город
- * @return string
+ * @return string|null
*/
public function getCity() : ?string;
@@ -91,7 +91,7 @@ public function setState(string $state) : self;
/**
* Получить Регион
- * @return string
+ * @return string|null
*/
public function getState() : ?string;
@@ -176,9 +176,9 @@ public function getIdentityDocument(): ?IdentityDocumentInterface;
/**
* Получить тип биллинга
- * @return string
+ * @return string|null
*/
- public function getType(): string;
+ public function getType(): ?string;
/**
* Установить тип биллинга
diff --git a/src/CardDetails.php b/src/CardDetails.php
index a3994ff..1f0515e 100644
--- a/src/CardDetails.php
+++ b/src/CardDetails.php
@@ -38,7 +38,7 @@ class CardDetails implements CardDetailsInterface
private string $cardIssuerBank;
/** @inheritDoc */
- public function getNumber(): string
+ public function getNumber(): ?string
{
return $this->number;
}
@@ -53,9 +53,9 @@ public function setNumber(string $number): self
}
/** @inheritDoc */
- public function getExpiryMonth(): int
+ public function getExpiryMonth(): ?int
{
- return $this->expiryMonth;
+ return $this->expiryMonth ?? null;
}
/** @inheritDoc */
@@ -66,9 +66,9 @@ public function setExpiryMonth(int $expiryMonth): self
}
/** @inheritDoc */
- public function getYear(): int
+ public function getYear(): ?int
{
- return $this->year;
+ return $this->year ?? null;
}
/** @inheritDoc */
@@ -83,9 +83,9 @@ public function setYear(int $year): self
}
/** @inheritDoc */
- public function getExpiryYear(): int
+ public function getExpiryYear(): ?int
{
- return $this->expiryYear;
+ return $this->expiryYear ?? null;
}
/** @inheritDoc */
@@ -96,9 +96,9 @@ public function setExpiryYear(int $expiryYear): self
}
/** @inheritDoc */
- public function getCvv(): string
+ public function getCvv(): ?string
{
- return $this->cvv;
+ return $this->cvv ?? null;
}
/** @inheritDoc */
@@ -109,9 +109,9 @@ public function setCvv(string $cvv): self
}
/** @inheritDoc */
- public function getOwner(): string
+ public function getOwner(): ?string
{
- return $this->owner;
+ return $this->owner ?? null;
}
/** @inheritDoc */
@@ -122,9 +122,9 @@ public function setOwner(string $owner): self
}
/** @inheritDoc */
- public function getTimeSpentTypingNumber(): int
+ public function getTimeSpentTypingNumber(): ?int
{
- return $this->timeSpentTypingNumber;
+ return $this->timeSpentTypingNumber ?? null;
}
/** @inheritDoc */
@@ -135,9 +135,9 @@ public function setTimeSpentTypingNumber(int $timeSpentTypingNumber): self
}
/** @inheritDoc */
- public function getTimeSpentTypingOwner(): int
+ public function getTimeSpentTypingOwner(): ?int
{
- return $this->timeSpentTypingOwner;
+ return $this->timeSpentTypingOwner ?? null;
}
/** @inheritDoc */
@@ -148,9 +148,9 @@ public function setTimeSpentTypingOwner(int $timeSpentTypingOwner): self
}
/** @inheritDoc */
- public function getBin(): int
+ public function getBin(): ?int
{
- return $this->bin;
+ return $this->bin ?? null;
}
/** @inheritDoc */
@@ -161,9 +161,9 @@ public function setBin(int $bin): self
}
/** @inheritDoc */
- public function getPan(): string
+ public function getPan(): ?string
{
- return $this->pan;
+ return $this->pan ?? null;
}
/** @inheritDoc */
@@ -174,9 +174,9 @@ public function setPan(string $pan): self
}
/** @inheritDoc */
- public function getType(): string
+ public function getType(): ?string
{
- return $this->type;
+ return $this->type ?? null;
}
/** @inheritDoc */
@@ -187,9 +187,9 @@ public function setType(string $type): self
}
/** @inheritDoc */
- public function getCardIssuerBank(): string
+ public function getCardIssuerBank(): ?string
{
- return $this->cardIssuerBank;
+ return $this->cardIssuerBank ?? null;
}
/** @inheritDoc */
diff --git a/src/CardDetailsInterface.php b/src/CardDetailsInterface.php
index 13f3e35..73fae78 100644
--- a/src/CardDetailsInterface.php
+++ b/src/CardDetailsInterface.php
@@ -14,9 +14,9 @@ public function setExpiryMonth(int $expiryMonth) : self;
/**
* Получить Месяц прекращения действия Карты
- * @return int
+ * @return int|null
*/
- public function getExpiryMonth() : int;
+ public function getExpiryMonth() : ?int;
/**
* Установить Год прекращения действия Карты
@@ -28,9 +28,9 @@ public function setExpiryYear(int $expiryYear) : self;
/**
* Получить Год прекращения действия Карты
- * @return int Год прекращения действия Карты
+ * @return int|null Год прекращения действия Карты
*/
- public function getExpiryYear() : int;
+ public function getExpiryYear() : ?int;
/**
* Установить CVV Карты
@@ -41,9 +41,9 @@ public function setCvv(string $cvv) : self;
/**
* Получить CVV Карты
- * @return string CVV Карты
+ * @return string|null CVV Карты
*/
- public function getCvv() : string;
+ public function getCvv() : ?string;
/**
* Установить Имя Владельца Карты
@@ -54,9 +54,9 @@ public function setOwner(string $owner) : self;
/**
* Получить Имя Владельца Карты
- * @return string Имя Владельца Карты
+ * @return string|null Имя Владельца Карты
*/
- public function getOwner() : string;
+ public function getOwner() : ?string;
/**
* Установить Время набора Номера Карты (сек)
@@ -67,9 +67,9 @@ public function setTimeSpentTypingNumber(int $timeSpentTypingNumber) : self;
/**
* Получить Время набора номера Карты (сек)
- * @return int Время набора Номера Карты (сек)
+ * @return int|null Время набора Номера Карты (сек)
*/
- public function getTimeSpentTypingNumber() : int;
+ public function getTimeSpentTypingNumber() : ?int;
/**
* Установить Время набора Имени Владельца Карты (сек)
@@ -80,9 +80,9 @@ public function setTimeSpentTypingOwner(int $timeSpentTypingOwner) : self;
/**
* Получить Время набора Имени Владельца Карты
- * @return int Время набора Имени Владельца Карты (сек)
+ * @return int|null Время набора Имени Владельца Карты (сек)
*/
- public function getTimeSpentTypingOwner() : int;
+ public function getTimeSpentTypingOwner() : ?int;
/**
* Установить BIN (Bank Identification Number)
@@ -93,9 +93,9 @@ public function setBin(int $bin) : self;
/**
* Получить BIN (Bank Identification Number)
- * @return int BIN (Bank Identification Number)
+ * @return int|null BIN (Bank Identification Number)
*/
- public function getBin() : int;
+ public function getBin() : ?int;
/**
* Установить PAN (Permanent Account Number)
@@ -106,9 +106,9 @@ public function setPan(string $pan) : self;
/**
* Получить PAN (Permanent Account Number)
- * @return string PAN (Permanent Account Number)
+ * @return string|null PAN (Permanent Account Number)
*/
- public function getPan() : string;
+ public function getPan() : ?string;
/**
* Установить Тип Карты (например, Visa, MIR)
@@ -119,9 +119,9 @@ public function setType(string $type) : self;
/**
* Получить Тип Карты (например, Visa, MIR)
- * @return string Тип Карты
+ * @return string|null Тип Карты
*/
- public function getType() : string;
+ public function getType() : ?string;
/**
* Установить Банк, выпустивший карту
@@ -132,15 +132,15 @@ public function setCardIssuerBank(string $cardIssuerBank) : self;
/**
* Получить Банк, выпустивший карту
- * @return string Банк, выпустивший карту
+ * @return string|null Банк, выпустивший карту
*/
- public function getCardIssuerBank() : string;
+ public function getCardIssuerBank() : ?string;
/**
* Получить Год Карты
- * @return int Год Карты
+ * @return int|null Год Карты
*/
- public function getYear(): int;
+ public function getYear(): ?int;
/**
*
diff --git a/src/DetailsInterface.php b/src/DetailsInterface.php
index 175e52f..28c1baa 100644
--- a/src/DetailsInterface.php
+++ b/src/DetailsInterface.php
@@ -13,7 +13,7 @@ public function setNumber(string $number) : self;
/**
* Получить Номер карты
- * @return string Номер карты
+ * @return string|null Номер карты
*/
- public function getNumber() : string;
+ public function getNumber() : ?string;
}
diff --git a/src/Examples/autoload.php b/src/Examples/autoload.php
new file mode 100644
index 0000000..74eb8b6
--- /dev/null
+++ b/src/Examples/autoload.php
@@ -0,0 +1,125 @@
+/src");
+
+if (!$baseDir) {
+ throw new RuntimeException("Папка src не найдена!");
+}
+
+// Перечисление всех файлов в SDK
+$files = [
+ 'AirlineInfoInterface',
+ 'AmountInterface',
+ 'ApiCpanelArraySerializeInterface',
+ 'ApiRequestInterface',
+ 'AuthorizationInterface',
+ 'BillingInterface',
+ 'CaptureInterface',
+ 'ClientInterface',
+ 'DeliveryInterface',
+ 'DestinationInterface',
+ 'DetailsInterface',
+ 'CardDetailsInterface',
+ 'IdentityDocumentInterface',
+ 'MarketplaceSubmerchantInterface',
+ 'MerchantInterface',
+ 'MerchantTokenInterface',
+ 'OrderDataInterface',
+ 'PaymentDetailsInterface',
+ 'PaymentInterface',
+ 'PaymentPageOptionsInterface',
+ 'PaymentResultInterface',
+ 'PayoutDestinationInterface',
+ 'PayoutInterface',
+ 'PayoutSourceInterface',
+ 'ProductInterface',
+ 'QstInterface',
+ 'QstToArrayInterface',
+ 'QstSchemaAddressInterface',
+ 'QstSchemaBankAccountInterface',
+ 'QstSchemaCeoInterface',
+ 'QstSchemaIdentityDocInterface',
+ 'QstSchemaInterface',
+ 'QstSchemaOwnerInterface',
+ 'RefundInterface',
+ 'StoredCredentialsInterface',
+ 'TransactionInterface',
+ 'WebhookAuthorizationInterface',
+ 'WebhookInterface',
+ 'WebhookStoredCredentialsInterface',
+ 'Payout/PayoutCommissionInterface',
+ 'Payout/PayoutOrderDataInterface',
+ 'Payout/PayoutPaymentResultInterface',
+ 'Payout/PayoutRecipientInterface',
+ 'Payout/PayoutWebhookInterface',
+ 'ApiRequest',
+ 'Amount',
+ 'ApiCpanelUserException',
+ 'ApiCpanelUserRequest',
+ 'Authorization',
+ 'Billing',
+ 'Capture',
+ 'CaptureApiRequest',
+ 'CardDetails',
+ 'Client',
+ 'CpanelUser',
+ 'Delivery',
+ 'Details',
+ 'Group',
+ 'IdentityDocument',
+ 'MarketplaceSubmerchant',
+ 'Merchant',
+ 'MerchantToken',
+ 'OneTimeUseToken',
+ 'OrderData',
+ 'Payment',
+ 'PaymentException',
+ 'PaymentMethods',
+ 'PaymentPageOptions',
+ 'PaymentReference',
+ 'PaymentResult',
+ 'Payout',
+ 'PayoutDestination',
+ 'PayoutMobileDestination',
+ 'PayoutSource',
+ 'PhoneDetails',
+ 'PodeliMerchant',
+ 'PodeliMerchantAddress',
+ 'PodeliMerchantBankDetails',
+ 'Privilege',
+ 'Product',
+ 'Qst',
+ 'QstSchema',
+ 'QstSchemaAddressAbstract',
+ 'QstSchemaCheckableTrait',
+ 'QstSchemaActualAddress',
+ 'QstSchemaBankAccount',
+ 'QstSchemaCeo',
+ 'QstSchemaIdentityDoc',
+ 'QstSchemaLegalAddress',
+ 'QstSchemaOwner',
+ 'QstSchemaPostAddress',
+ 'Refund',
+ 'Role',
+ 'SessionRequest',
+ 'Std',
+ 'StoredCredentials',
+ 'SubmerchantReceipt',
+ 'Webhook',
+ 'WebhookAuthorization',
+ 'WebhookStoredCredentials',
+ 'Widget',
+ 'Payout/PayoutCommission',
+ 'Payout/PayoutPaymentResult',
+ 'Payout/PayoutPayoutOrderData',
+ 'Payout/PayoutRecipient',
+ 'Payout/PayoutWebhook'
+];
+
+// Подключение файлов к проекту
+foreach ($files as $file) {
+ require_once $baseDir . "/" . $file . ".php";
+}
+
+unset ($files);
+unset ($file);
\ No newline at end of file
diff --git a/src/Examples/payQrCode.php b/src/Examples/payQrCode.php
new file mode 100644
index 0000000..2a534d4
--- /dev/null
+++ b/src/Examples/payQrCode.php
@@ -0,0 +1,119 @@
+ 'Заказ №' . $merchantPaymentReference,
+ 'sku' => $merchantPaymentReference,
+ 'unitPrice' => 20.42,
+ 'quantity' => 1,
+]);
+
+// Опишем Биллинговую (платёжную) информацию
+$billing = new Billing;
+// Установим Код страны
+$billing->setCountryCode('RU');
+// Установим Имя Плательщика
+$billing->setFirstName('Иван');
+// Установим Фамилия Плательщика
+$billing->setLastName('Петров');
+// Установим Email Плательщика (необязательно)
+$billing->setEmail('test1@ypmn.ru');
+// Установим Телефон Плательщика
+$billing->setPhone('+7-800-555-35-35');
+// Установим Город
+$billing->setCity('Москва');
+
+// Создадим клиентское подключение
+$client = new Client;
+// Установим биллинг
+$client->setBilling($billing);
+
+// Создадим платёж
+$payment = new Payment;
+// Присвоим товарные позиции
+$payment->addProduct($orderAsProduct);
+// Создадим запрос на авторизацию платежа
+// здесь первым параметром можно передать конкретный способ оплаты из справочника
+// PaymentMethods.php
+$payment->setAuthorization(
+ (new Authorization())
+ ->setPaymentMethod(PaymentMethods::TPAY)
+ ->setUsePaymentPage(false)
+);
+// Установим номер заказа (должен быть уникальным в вашей системе)
+$payment->setMerchantPaymentReference($merchantPaymentReference);
+// Установим адрес перенаправления пользователя после оплаты
+$payment->setReturnUrl('https://test.u2go.ru/php-api-client/?function=returnPage');
+// Установим клиентское подключение
+$payment->setClient($client);
+
+// Создадим HTTP-запрос к API
+$apiRequest = new ApiRequest($merchant);
+// Включить режим отладки (закомментируйте или удалите в рабочей программе!)
+$apiRequest->setDebugMode();
+// Переключиться на тестовый сервер (закомментируйте или удалите в рабочей программе!)
+$apiRequest->setSandboxMode();
+// Отправим запрос
+$responseData = $apiRequest->sendAuthRequest($payment, $merchant);
+// Преобразуем ответ из JSON в массив
+// TODO: перенести валидацию в функцию ApiClient
+try {
+ $responseData = json_decode((string) $responseData["response"], true);
+
+ if (isset($responseData['code'])
+ && $responseData['code'] === 429
+ && $responseData['status'] === 'LIMIT_CALLS_EXCEEDED'
+ ) {
+ throw new PaymentException('YPMN-002: LIMIT_CALLS_EXCEEDED (превышена частота запросов к серверу)');
+ }
+
+ if (isset($responseData["paymentResult"])) {
+ if (!empty($responseData['paymentResult']['bankResponseDetails']['customBankNode']['qr'])) {
+ $qr = $responseData['paymentResult']['bankResponseDetails']['customBankNode']['qr'];
+ }
+
+ // Выведем кнопку оплаты
+ echo Std::drawYpmnButton([
+ 'qr' => ($qr ?? null),
+ 'url' => $responseData["paymentResult"]['url'],
+ 'sum' => $payment->sumProductsAmount(),
+ 'newpage' => true,
+ ]);
+
+ // ...или просто картинка без кнопки:
+ // Std::data_img_tag($responseData['paymentResult']['bankResponseDetails']['customBankNode']['qr']);
+ }
+} catch (Exception $exception) {
+ //TODO: обработка исключения
+ echo Std::alert([
+ 'text' => '
+ Извините, платёжный метод временно недоступен.
+ Вы можете попробовать другой способ оплаты, либо свяжитесь с продавцом.
+
+
' . $exception->getMessage() . '', + 'type' => 'danger', + ]); + + throw new PaymentException('Платёжный метод временно недоступен'); +} diff --git a/src/Examples/webhookProcessing.php b/src/Examples/webhookProcessing.php new file mode 100644 index 0000000..76a9315 --- /dev/null +++ b/src/Examples/webhookProcessing.php @@ -0,0 +1,76 @@ +catchJsonRequest(); + + $paymentResult = $webhookHandler->getPaymentResult(); + $orderData = $webhookHandler->getOrderData(); + $authorization = $webhookHandler->getAuthorization(); + + + // Обозначим путь до папки и запишем вебхук в лог + $folder = __DIR__ . "/../../webhooks_log/"; + $filename = $folder . "ypmn" . date("Y-m-d H:i:s") ."_" . uniqid() . ".log"; + + if (!file_exists($folder)) { + mkdir($folder, 0777, true); + } + + file_put_contents($filename, json_encode([ + "orderData" => [ + "orderDate" => $orderData->getOrderDate(), + "payuPaymentReference" => $orderData->getPayuPaymentReference(), + "merchantPaymentReference" => $orderData->getMerchantPaymentReference(), + "status" => $orderData->getStatus(), + "currency" => $orderData->getCurrency(), + "amount" => $orderData->getAmount() ?? "null", + "commission" => $orderData->getCommission() ?? "null", + "loyaltyPointsAmount" => $orderData->getLoyaltyPointsAmount() ?? "null", + "loyaltyPointsDetails" => $orderData->getLoyaltyPointsDetails() ?? "null", + ], + + "paymentResult" => [ + "cardDetails" => [ + "bin" => $paymentResult->getCardDetails()->getBin(), + "owner" => $paymentResult->getCardDetails()->getOwner(), + "pan" => $paymentResult->getCardDetails()->getPan(), + "type" => $paymentResult->getCardDetails()->getType(), + "cardIssuerBank" => $paymentResult->getCardDetails()->getCardIssuerBank(), + ], + "paymentMethod" => $paymentResult->getPaymentMethod(), + "paymentDate" => $paymentResult->getPaymentDate(), + "authCode" => $paymentResult->getAuthCode(), + "merchantId" => $paymentResult->getMerchantId(), + ], + ])); + + +} catch (\Ypmn\PaymentException $e) { + // YourLogger::log(...); +} + diff --git a/src/OrderData.php b/src/OrderData.php index d6ad7d2..8ebdc96 100644 --- a/src/OrderData.php +++ b/src/OrderData.php @@ -35,9 +35,9 @@ class OrderData implements OrderDataInterface private array $loyaltyPointsDetails; /** @inheritDoc */ - public function getOrderDate(): string + public function getOrderDate(): ?string { - return $this->orderDate; + return $this->orderDate ?? null; } /** @inheritDoc */ @@ -57,9 +57,9 @@ public function setYpmnPaymentReference(string $ypmnPaymentReference): self } /** @inheritDoc */ - public function getYpmnPaymentReference(): string + public function getYpmnPaymentReference(): ?string { - return $this->payUPaymentReference; + return $this->payUPaymentReference ?? null; } /** @inheritDoc */ @@ -71,15 +71,15 @@ public function setPayUPaymentReference(string $payUPaymentReference): self } /** @inheritDoc */ - public function getPayUPaymentReference(): string + public function getPayUPaymentReference(): ?string { - return $this->payUPaymentReference; + return $this->payUPaymentReference ?? null; } /** @inheritDoc */ - public function getMerchantPaymentReference(): string + public function getMerchantPaymentReference(): ?string { - return $this->merchantPaymentReference; + return $this->merchantPaymentReference ?? null; } /** @inheritDoc */ @@ -91,9 +91,9 @@ public function setMerchantPaymentReference(string $merchantPaymentReference): s } /** @inheritDoc */ - public function getStatus(): string + public function getStatus(): ?string { - return $this->status; + return $this->status ?? null; } /** @inheritDoc */ @@ -105,9 +105,9 @@ public function setStatus(string $status): self } /** @inheritDoc */ - public function getCurrency(): string + public function getCurrency(): ?string { - return $this->currency; + return $this->currency ?? null; } /** @inheritDoc */ @@ -121,7 +121,7 @@ public function setCurrency(string $currency): self /** @inheritDoc */ public function getAmount(): ?float { - return $this->amount; + return $this->amount ?? null; } /** @inheritDoc */ @@ -135,7 +135,7 @@ public function setAmount(float $amount): self /** @inheritDoc */ public function getCommission(): ?float { - return $this->commission; + return $this->commission ?? null; } /** @inheritDoc */ @@ -151,7 +151,7 @@ public function setCommission(float $commission): self /** @inheritDoc */ public function getRefundRequestId(): ?string { - return $this->refundRequestId; + return $this->refundRequestId ?? null; } /** @inheritDoc */ @@ -164,7 +164,7 @@ public function setRefundRequestId(string $refundRequestId): self /** @inheritDoc */ public function getLoyaltyPointsAmount(): ?int { - return $this->loyaltyPointsAmount; + return $this->loyaltyPointsAmount ?? null; } /** @inheritDoc */ @@ -178,7 +178,7 @@ public function setLoyaltyPointsAmount(int $loyaltyPointsAmount): self /** @inheritDoc */ public function getLoyaltyPointsDetails(): ?array { - return $this->loyaltyPointsDetails; + return $this->loyaltyPointsDetails ?? null; } /** @inheritDoc */ diff --git a/src/OrderDataInterface.php b/src/OrderDataInterface.php index 6921b88..f2cc060 100644 --- a/src/OrderDataInterface.php +++ b/src/OrderDataInterface.php @@ -7,9 +7,9 @@ interface OrderDataInterface /** * Получить Дату Заказа - * @return string Дата Заказа + * @return string|null Дата Заказа */ - public function getOrderDate(): string; + public function getOrderDate(): ?string; /** * Установть Дату Заказа @@ -20,11 +20,11 @@ public function setOrderDate(string $orderDate): self; /** * Получить Номер Заказа в Ypmn - * @return string Номер Заказа в Ypmn + * @return string|null Номер Заказа в Ypmn * * @deprecated Используйте getPayUPaymentReference */ - public function getYpmnPaymentReference(): string; + public function getYpmnPaymentReference(): ?string; /** * Установить Номер Заказа в Ypmn @@ -37,9 +37,9 @@ public function setYpmnPaymentReference(string $ypmnPaymentReference): self; /** * Получить Номер Заказа в Ypmn - * @return string Номер Заказа в Ypmn + * @return string|null Номер Заказа в Ypmn */ - public function getPayUPaymentReference(): string; + public function getPayUPaymentReference(): ?string; /** * Установить Номер Заказа в Ypmn * @param string $payUPaymentReference Номер Заказа в Ypmn @@ -49,9 +49,9 @@ public function setPayUPaymentReference(string $payUPaymentReference): self; /** * Получить Номер Заказа у Мерчанта - * @return string Номер Заказа у Мерчанта + * @return string|null Номер Заказа у Мерчанта */ - public function getMerchantPaymentReference(): string; + public function getMerchantPaymentReference(): ?string; /** * Установить Номер Заказа у Мерчанта @@ -62,9 +62,9 @@ public function setMerchantPaymentReference(string $merchantPaymentReference): s /** * Получить Состояние Платежа - * @return string Состояние Платежа + * @return string|null Состояние Платежа */ - public function getStatus(): string; + public function getStatus(): ?string; /** * Установить Состояние Платежа @@ -75,9 +75,9 @@ public function setStatus(string $status): self; /** * Получить Валюту Платежа - * @return string Валюта Платежа + * @return string|null Валюта Платежа */ - public function getCurrency(): string; + public function getCurrency(): ?string; /** * Установить Валюту Платежа @@ -113,13 +113,13 @@ public function getCommission(): ?float; public function setCommission(float $commission): self; /** - * Получить - * @return string + * Получить ID запроса возврата + * @return string|null */ public function getRefundRequestId(): ?string; /** - * Установить + * Установить ID запроса возврата * @param string $refundRequestId * @return $this */ diff --git a/src/PaymentMethods.php b/src/PaymentMethods.php index 809f6c6..06995ab 100644 --- a/src/PaymentMethods.php +++ b/src/PaymentMethods.php @@ -11,10 +11,11 @@ class PaymentMethods public const FASTER_PAYMENTS = 'FASTER_PAYMENTS'; // СБП public const PAYOUT = 'PAYOUT'; // Выплата по номеру карты public const PAYOUT_FP = 'PAYOUT_FP'; // Выплата по номеру телефона - public const MIRPAY = 'MIRPAY'; // MIR PAY public const BNPL = 'BNPL'; // Рассрочка - public const SOM = 'SOM'; + public const INTCARD = 'INTCARD'; + + public const ALFAPAY = 'ALFAPAY'; public const SBERPAY = 'SBERPAY'; + public const MIRPAY = 'MIRPAY'; // MIR PAY public const TPAY = 'TPAY'; - public const ALFAPAY = 'ALFAPAY'; } diff --git a/src/PaymentResult.php b/src/PaymentResult.php index 917c93b..9cc21fc 100644 --- a/src/PaymentResult.php +++ b/src/PaymentResult.php @@ -41,9 +41,9 @@ class PaymentResult implements PaymentResultInterface private CardDetailsInterface $cardDetails; /** @inheritDoc */ - public function getPaymentMethod(): string + public function getPaymentMethod(): ?string { - return $this->paymentMethod; + return $this->paymentMethod ?? null; } /** @inheritDoc */ @@ -54,9 +54,9 @@ public function setPaymentMethod(string $paymentMethod): self } /** @inheritDoc */ - public function getPaymentDate(): string + public function getPaymentDate(): ?string { - return $this->paymentDate; + return $this->paymentDate ?? null; } /** @inheritDoc */ @@ -67,9 +67,9 @@ public function setPaymentDate(string $paymentDate): self } /** @inheritDoc */ - public function getCaptureDate(): string + public function getCaptureDate(): ?string { - return $this->captureDate; + return $this->captureDate ?? null; } /** @inheritDoc */ @@ -80,9 +80,9 @@ public function setCaptureDate(string $captureDate): self } /** @inheritDoc */ - public function getCardProgramName(): string + public function getCardProgramName(): ?string { - return $this->cardProgramName; + return $this->cardProgramName ?? null; } /** @inheritDoc */ @@ -93,9 +93,9 @@ public function setCardProgramName(string $cardProgramName): self } /** @inheritDoc */ - public function getAuthCode(): string + public function getAuthCode(): ?string { - return $this->authCode; + return $this->authCode ?? null; } /** @inheritDoc */ @@ -106,9 +106,9 @@ public function setAuthCode(string $authCode): self } /** @inheritDoc */ - public function getMerchantId(): string + public function getMerchantId(): ?string { - return $this->merchantId; + return $this->merchantId ?? null; } /** @inheritDoc */ @@ -119,9 +119,9 @@ public function setMerchantId(string $merchantId): self } /** @inheritDoc */ - public function getRrn(): int + public function getRrn(): ?int { - return $this->rrn; + return $this->rrn ?? null; } /** @inheritDoc */ @@ -132,9 +132,9 @@ public function setRrn(int $rrn): self } /** @inheritDoc */ - public function getInstallmentsNumber(): string + public function getInstallmentsNumber(): ?string { - return $this->installmentsNumber; + return $this->installmentsNumber ?? null; } /** @inheritDoc */ @@ -152,15 +152,15 @@ public function setCardDetails(CardDetailsInterface $cardDetails): self } /** @inheritDoc */ - public function getCardDetails($cardDetails) : CardDetailsInterface + public function getCardDetails() : CardDetailsInterface { - return $this->cardDetails; + return $this->cardDetails ?? new CardDetails(); } /** @inheritDoc */ - public function getPaymentBankShortName(): string + public function getPaymentBankShortName(): ?string { - return $this->paymentBankShortName; + return $this->paymentBankShortName ?? null; } /** @inheritDoc */ @@ -171,9 +171,9 @@ public function setPaymentBankShortName(string $paymentBankShortName): self } /** @inheritDoc */ - public function getServiceProcessingType(): string + public function getServiceProcessingType(): ?string { - return $this->serviceProcessingType; + return $this->serviceProcessingType ?? null; } /** @inheritDoc */ diff --git a/src/PaymentResultInterface.php b/src/PaymentResultInterface.php index 75132a5..f82cfbc 100644 --- a/src/PaymentResultInterface.php +++ b/src/PaymentResultInterface.php @@ -6,9 +6,9 @@ interface PaymentResultInterface { /** * Получить Метод Оплаты - * @return string Метод Оплаты + * @return string|null Метод Оплаты */ - public function getPaymentMethod(): string; + public function getPaymentMethod(): ?string; /** * Установить Метод Оплаты @@ -19,9 +19,9 @@ public function setPaymentMethod(string $paymentMethod): self; /** * Получить Дату Авторизации платежа - * @return string Дата Авторизации платежа + * @return string|null Дата Авторизации платежа */ - public function getPaymentDate(): string; + public function getPaymentDate(): ?string; /** * Установить Дату Авторизации платежа @@ -32,9 +32,9 @@ public function setPaymentDate(string $paymentDate): self; /** * Получить Дату Списания денежных средств - * @return string Дата Списания денежных средств + * @return string|null Дата Списания денежных средств */ - public function getCaptureDate(): string; + public function getCaptureDate(): ?string; /** * Установить Дату Списания денежных средств @@ -44,9 +44,9 @@ public function getCaptureDate(): string; public function setCaptureDate(string $captureDate): self; /** - * @return string + * @return string|null */ - public function getCardProgramName(): string; + public function getCardProgramName(): ?string; /** * @param string $cardProgramName @@ -56,9 +56,9 @@ public function setCardProgramName(string $cardProgramName): self; /** * Получить Код Авторизации - * @return string Код Авторизации + * @return string|null Код Авторизации */ - public function getAuthCode(): string; + public function getAuthCode(): ?string; /** * Установить Код Авторизации @@ -69,9 +69,9 @@ public function setAuthCode(string $authCode): self; /** * Получить Идентификатор марчанта (Merchant ID) - * @return string Идентификатор марчанта (Merchant ID) + * @return string|null Идентификатор марчанта (Merchant ID) */ - public function getMerchantId(): string; + public function getMerchantId(): ?string; /** * Установить Идентификатор марчанта (Merchant ID) @@ -81,9 +81,9 @@ public function getMerchantId(): string; public function setMerchantId(string $merchantId): self; /** - * @return int + * @return int|null */ - public function getRrn(): int; + public function getRrn(): ?int; /** * @param int $rrn @@ -92,9 +92,9 @@ public function getRrn(): int; public function setRrn(int $rrn): self; /** - * @return string + * @return string|null */ - public function getInstallmentsNumber(): string; + public function getInstallmentsNumber(): ?string; /** * @param string $installmentsNumber @@ -110,18 +110,17 @@ public function setInstallmentsNumber(string $installmentsNumber): self; public function setCardDetails(CardDetailsInterface $cardDetails): self; /** - * Установить Информацию о Карте - * @param $cardDetails + * Получить информацию о Карте * @return CardDetailsInterface */ - public function getCardDetails($cardDetails) : CardDetailsInterface; + public function getCardDetails() : CardDetailsInterface; /** * Получить Краткую запись Названия Банка Плательщика - * @return string Краткая запись Названия Банка Плательщика + * @return string|null Краткая запись Названия Банка Плательщика */ - public function getPaymentBankShortName(): string; + public function getPaymentBankShortName(): ?string; /** * Установить Краткую запись Названия Банка Плательщика @@ -132,9 +131,9 @@ public function setPaymentBankShortName(string $paymentBankShortName): self; /** * Получить Тип Сервиса Процессинга - * @return string Тип Сервиса Процессинга + * @return string|null Тип Сервиса Процессинга */ - public function getServiceProcessingType(): string; + public function getServiceProcessingType(): ?string; /** * Установить Тип Сервиса Процессинга diff --git a/src/Std.php b/src/Std.php index c53d323..9b25d60 100644 --- a/src/Std.php +++ b/src/Std.php @@ -75,6 +75,7 @@ public static function drawYpmnButton(array $params): string } $allowedParams = [ + 'qr', 'url', 'shadow', 'currency', @@ -89,6 +90,39 @@ public static function drawYpmnButton(array $params): string } } + if (!empty($params['qr'])) { + $inner_block = self::data_img_tag($params['qr']); + } else { + $inner_block = ' +