diff --git "a/.github/ISSUE_TEMPLATE/\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\265-\320\276\320\261-\320\276\321\210\320\270\320\261\320\272\320\265.md" "b/.github/ISSUE_TEMPLATE/\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\265-\320\276\320\261-\320\276\321\210\320\270\320\261\320\272\320\265.md"
new file mode 100644
index 0000000..92b4896
--- /dev/null
+++ "b/.github/ISSUE_TEMPLATE/\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\265-\320\276\320\261-\320\276\321\210\320\270\320\261\320\272\320\265.md"
@@ -0,0 +1,27 @@
+---
+name: Сообщение об ошибке
+about: Сообщение об ошибке
+title: ''
+labels: ''
+assignees: yourpayments
+
+---
+
+**Опишите ошибку**
+Понятное и полное описание проблемы
+
+**Как воспроизвести**
+Шаги для воспроизведения проблемы:
+1.
+2.
+3.
+
+**Скриншоты и вывод программы**
+Приведите скриншоты и/или тексты ошибок
+
+**Окружение: ваше ПО, например:**
+ - Версия PHP
+ - OS
+ - Браузер
+
+**Дополнительная информация**
diff --git a/.gitignore b/.gitignore
index a67d42b..ff93c1b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,9 @@
composer.phar
/vendor/
+.idea
# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock
+
+.ai
\ No newline at end of file
diff --git a/README.md b/README.md
index f8f8d4b..e5abb5b 100644
--- a/README.md
+++ b/README.md
@@ -1,378 +1,55 @@
-# php-payu4
-Примеры использования PayU API v4.
-
-PayU - многофункциональная платёжная система, поддерживающая не только простые платежи с банковских карт, но и множество
-форм оплаты, а также подписки и выплаты на карты.
-
-Данный репозиторий написан по принципам SOLID, и каждый программный интерфейс снабжен подробной документацией на
-русском языке.
-
-Репозиторий также содержит примеры по принципу "одна строка кода - одна строка документации".
-
-Репозиторий опубликован в виде [пакета Composer](https://packagist.org/packages/payuru/php-payu4) и может использоваться со всеми современными
-фреймворками: Laravel, Symfony, Yii и другими.
-
-Для работы рекомендуется использовать любую современную IDE (VS Code, Intellij Idea/PHPStorm,
-Eclipse, Netbeans, etc), чтобы получать подробные подсказки прямо во время редактирования кода.
-
+# Твои Платежи, интеграция на PHP
+PHP SDK, готовый клиент для нашего API + примеры использования платёжной системы
+
+
+Эта библиотека содержит подробные [примеры](src/Examples/) с комментариями на русском языке
+и предназначена для быстрой интеграции. Подходит для сайтов, платформ и приложений.
-## Требования
-Актуальные требования для использования пакета можно посмотреть
-в файле [composer.json](https://github.com/payuru/php-payu4/blob/main/composer.json)
-в секции "require"
+Репозиторий опубликован в виде [пакета Composer](https://packagist.org/packages/yourpayments/php-api-client) и может
+использоваться с любыми фреймворками и CMS.
+
+Требования: [PHP 7.4 и выше](https://github.com/yourpayments/php-api-client/blob/main/composer.json)
## Установка
### Composer
-[Composer](https://getcomposer.org/) - это инструмент для управления зависимостями в PHP. Он позволяет вам объявить
-библиотеки, от которых зависит ваш проект, и он будет управлять ими (устанавливать/обновлять) за вас.
```shell
-composer require payuru/php-payu4
+$ composer require yourpayments/php-api-client
```
```php
-// Для использования классов, например:
-use payuru\phpPayu4\Authorization;
-use payuru\phpPayu4\Delivery;
-use payuru\phpPayu4\IdentityDocument;
-use payuru\phpPayu4\Merchant;
-use payuru\phpPayu4\Payment;
-use payuru\phpPayu4\Client;
-use payuru\phpPayu4\Billing;
-use payuru\phpPayu4\ApiRequest;
-use payuru\phpPayu4\PaymentException;
-use payuru\phpPayu4\Product;
-use payuru\phpPayu4\Capture;
-use payuru\phpPayu4\Refund;
-use payuru\phpPayu4\Std;
+ 'Заказ №' . $merchantPaymentReference,
- 'sku' => $merchantPaymentReference,
- 'unitPrice' => 1.42,
- 'quantity' => 2,
-]);
-
-// Опишем Биллинговую (платёжную) информацию
-$billing = new Billing;
-// Установим Код страны
-$billing->setCountryCode('RU');
-// Установим Имя Плательщика
-$billing->setFirstName('Иван');
-// Установим Фамилия Плательщика
-$billing->setLastName('Петров');
-// Установим Email Плательщика
-$billing->setEmail('test1@payu.ru');
-// Установим Телефон Плательщика
-$billing->setPhone('+7-800-555-35-35');
-// Установим Город
-$billing->setCity('Москва');
-
-// Создадим клиентское подключение
-$client = new Client;
-// Установим биллинг
-$client->setBilling($billing);
-
-// Создадим платёж
-$payment = new Payment;
-// Установим позиции
-$payment->addProduct($orderAsProduct);
-// Установим валюту
-$payment->setCurrency('RUB');
-// Создадим и установим авторизацию по типу платежа
-$payment->setAuthorization(new Authorization('CCVISAMC',true));
-// Установим номер заказа (должен быть уникальным в вашей системе)
-$payment->setMerchantPaymentReference($merchantPaymentReference);
-// Установим адрес перенаправления пользователя после оплаты
-$payment->setReturnUrl('http://127.0.0.1:8080/?function=returnPage');
-// Установим клиентское подключение
-$payment->setClient($client);
-
-// Создадим HTTP-запрос к API
-$apiRequest = new ApiRequest($merchant);
-// Включить режим отладки (удалите в рабочей программе!)
-$apiRequest->setDebugMode();
-// Переключиться на тестовый сервер (удалите в рабочей программе!)
-$apiRequest->setSandboxMode();
-// Отправим запрос
-$responseData = $apiRequest->sendAuthRequest($payment, $merchant);
-// Преобразуем ответ из JSON в массив
-try {
- $responseData = json_decode((string) $responseData["response"], true);
-
- // Нарисуем кнопку оплаты
- echo Std::drawPayuButton([
- 'url' => $responseData["paymentResult"]['url'],
- 'sum' => $payment->sumProductsAmount(),
- ]);
-
- // .. или сделаем редирект на форму оплаты (опционально)
- // Std::redirect($responseData["paymentResult"]['url']);
-} catch (Exception $exception) {
- //TODO: обработка исключения
- echo Std::alert([
- 'text' => '
- Извините, платёжный метод временно недоступен.
- Вы можете попробовать другой способ оплаты, либо свяжитесь с продавцом.
-
-
' . $exception->getMessage() . '
',
- 'type' => 'danger',
- ]);
-}
-```
-#### Расширенные возможности, полный набор полей
-```php
-setName('Синий Мяч');
-// Установим Артикул
-$product1->setSku('ball-05');
-// Установим Стоимость за единицу
-$product1->setUnitPrice('500');
-// Установим Количество
-$product1->setQuantity(1);
-// Установим НДС
-$product1->setVat(20);
-
-//Опишем вторую позицию с помощью сокращённого синтаксиса:
-$product2 = new Product([
- 'name' => 'Жёлтый Круг',
- 'sku' => 'toy-15',
- 'unitPrice' => '1600',
- 'quantity' => '3',
- 'vat' => 0,
-]);
-
-// Опишем Биллинговую (платёжную) информацию
-$billing = new Billing;
-// Установим Код страны
-$billing->setCountryCode('RU');
-// Установим Город
-$billing->setCity('Москва');
-// Установим Регион
-$billing->setState('Центральный регион');
-// Установим Адрес Плательщика (первая строка)
-$billing->setAddressLine1('Улица Старый Арбат, дом 10');
-// Установим Адрес Плательщика (вторая строка)
-$billing->setAddressLine1('Офис PayU');
-// Установим Почтовый Индекс Плательщика
-$billing->setZipCode('121000');
-// Установим Имя Плательщика
-$billing->setFirstName('Иван');
-// Установим Фамилия Плательщика
-$billing->setLastName('Петров');
-// Установим Телефон Плательщика
-$billing->setPhone('+79670660742');
-// Установим Email Плательщика
-$billing->setEmail('test1@payu.ru');
-
-// (необязательно) Опишем Доствку и принимающее лицо
-$delivery = new Delivery;
-// Установим документ, подтверждающий право приёма доставки
-$delivery->setIdentityDocument(
- new IdentityDocument('123456', 'PERSONALID')
-);
-// Установим Код страны
-$delivery->setCountryCode('RU');
-// Установим Город
-$delivery->setCity('Москва');
-// Установим Регион
-$delivery->setState('Центральный регион');
-// Установим Адрес Лица, принимающего заказ (первая строка)
-$delivery->setAddressLine1('Улица Старый Арбат, дом 10');
-// Установим Адрес Лица, принимающего заказ (вторая строка)
-$delivery->setAddressLine1('Офис PayU');
-// Установим Почтовый Индекс Лица, принимающего заказ
-$delivery->setZipCode('121000');
-// Установим Имя Лица, принимающего заказ
-$delivery->setFirstName('Мария');
-// Установим Фамилия Лица, принимающего заказ
-$delivery->setLastName('Петрова');
-// Установим Телефон Лица, принимающего заказ
-$delivery->setPhone('+79670660743');
-// Установим Email Лица, принимающего заказ
-$delivery->setEmail('test2@payu.ru');
-// Установим Название Компании, в которой можно оставить заказ
-$delivery->setCompanyName('ООО "Вектор"');
-
-// Создадим клиентское подключение
-$client = new Client;
-// Установим биллинг
-$client->setBilling($billing);
-// Установим доставку
-$client->setDelivery($delivery);
-// Установим IP (автоматически)
-$client->setCurrentClientIp();
-// И Установим время (автоматически)
-$client->setCurrentClientTime();
-
-// Создадим платёж
-$payment = new Payment;
-// Установим позиции
-$payment->addProduct($product1);
-$payment->addProduct($product2);
-// Установим валюту
-$payment->setCurrency('RUB');
-// Создадим и установим авторизацию по типу платежа
-$payment->setAuthorization(new Authorization('CCVISAMC',true));
-// Установим номер заказа (должен быть уникальным в вашей системе)
-$payment->setMerchantPaymentReference('primer_nomer__' . time());
-// Установим адрес перенаправления пользователя после оплаты
-$payment->setReturnUrl('http://127.0.0.1:8080/?function=returnPage');
-// Установим клиентское подключение
-$payment->setClient($client);
-
-// Создадим HTTP-запрос к API
-$apiRequest = new ApiRequest($merchant);
-// Включить режим отладки (удалите в рабочей программе!)
-$apiRequest->setDebugMode();
-// Переключиться на тестовый сервер (удалите в рабочей программе!)
-$apiRequest->setSandboxMode();
-// Отправим запрос
-$responseData = $apiRequest->sendAuthRequest($payment, $merchant);
-// Преобразуем ответ из JSON в массив
-try {
- $responseData = json_decode((string) $responseData["response"], true);
-
- // Нарисуем кнопку оплаты
- echo Std::drawPayuButton([
- 'url' => $responseData["paymentResult"]['url'],
- 'sum' => $payment->sumProductsAmount(),
- ]);
-
- // .. или сделаем редирект на форму оплаты (опционально)
- // Std::redirect($responseData["paymentResult"]['url']);
-} catch (Exception $exception) {
- //TODO: обработка исключения
- echo Std::alert([
- 'text' => '
- Извините, платёжный метод временно недоступен.
- Вы можете попробовать другой способ оплаты, либо свяжитесь с продавцом.
-
-
',
- 'type' => 'danger',
- ]);
-
- throw new PaymentException('Платёжный метод временно недоступен');
- }
+ case 'start':
+ include './src/Examples/'.$_GET['function'] . '.php';
break;
+ case 'simpleGetPaymentLink':
case 'getPaymentLink':
- // Оплата по ссылке PayU
- // Представим, что нам надо оплатить пару позиций: Синий Мяч и Жёлтый Круг
-
- // Опишем первую позицию
- $product1 = new Product;
- // Установим Наименование (название товара или услуги)
- $product1->setName('Синий Квадрат');
- // Установим Артикул
- $product1->setSku('ball-05');
- // Установим Стоимость за единицу
- $product1->setUnitPrice('500');
- // Установим Количество
- $product1->setQuantity(1);
- // Установим НДС
- $product1->setVat(20);
-
- //Опишем вторую позицию с помощью сокращённого синтаксиса:
- $product2 = new Product([
- 'name' => 'Оранжевый Круг',
- 'sku' => 'toy-15',
- 'unitPrice' => 160000,
- 'quantity' => 3,
- 'vat' => 0,
- ]);
-
- // Опишем Биллинговую (платёжную) информацию
- $billing = new Billing;
- // Установим Код страны
- $billing->setCountryCode('RU');
- // Установим Город
- $billing->setCity('Москва');
- // Установим Регион
- $billing->setState('Центральный регион');
- // Установим Адрес Плательщика (первая строка)
- $billing->setAddressLine1('Улица Старый Арбат, дом 10');
- // Установим Адрес Плательщика (вторая строка)
- $billing->setAddressLine1('Офис PayU');
- // Установим Почтовый Индекс Плательщика
- $billing->setZipCode('121000');
- // Установим Имя Плательщика
- $billing->setFirstName('Иван');
- // Установим Фамилия Плательщика
- $billing->setLastName('Петров');
- // Установим Телефон Плательщика
- $billing->setPhone('+79670660742');
- // Установим Email Плательщика
- $billing->setEmail('test1@payu.ru');
-
- // (необязательно) Опишем Доствку и принимающее лицо
- $delivery = new Delivery;
- // Установим документ, подтверждающий право приёма доставки
- $delivery->setIdentityDocument(
- new IdentityDocument('123456', 'PERSONALID')
- );
- // Установим Код страны
- $delivery->setCountryCode('RU');
- // Установим Город
- $delivery->setCity('Москва');
- // Установим Регион
- $delivery->setState('Центральный регион');
- // Установим Адрес Лица, принимающего заказ (первая строка)
- $delivery->setAddressLine1('Улица Старый Арбат, дом 10');
- // Установим Адрес Лица, принимающего заказ (вторая строка)
- $delivery->setAddressLine1('Офис PayU');
- // Установим Почтовый Индекс Лица, принимающего заказ
- $delivery->setZipCode('121000');
- // Установим Имя Лица, принимающего заказ
- $delivery->setFirstName('Мария');
- // Установим Фамилия Лица, принимающего заказ
- $delivery->setLastName('Петрова');
- // Установим Телефон Лица, принимающего заказ
- $delivery->setPhone('+79670660743');
- // Установим Email Лица, принимающего заказ
- $delivery->setEmail('test2@payu.ru');
- // Установим Название Компании, в которой можно оставить заказ
- $delivery->setCompanyName('ООО "Вектор"');
-
- // Создадим клиентское подключение
- $client = new Client;
- // Установим биллинг
- $client->setBilling($billing);
- // Установим доставку
- $client->setDelivery($delivery);
- // Установим IP (автоматически)
- $client->setCurrentClientIp();
- // И Установим время (автоматически)
- $client->setCurrentClientTime();
-
- // Создадим платёж
- $payment = new Payment;
- // Установим позиции
- $payment->addProduct($product1);
- $payment->addProduct($product2);
- // Установим валюту
- $payment->setCurrency('RUB');
- // Создадим и установим авторизацию по типу платежа
- $payment->setAuthorization(new Authorization('CCVISAMC',true));
- // Установим номер заказа (должен быть уникальным в вашей системе)
- $payment->setMerchantPaymentReference('primer_nomer__' . time());
- // Установим адрес перенаправления пользователя после оплаты
- $payment->setReturnUrl('http://127.0.0.1:8080/?function=returnPage');
- // Установим клиентское подключение
- $payment->setClient($client);
-
- // Создадим HTTP-запрос к API
- $apiRequest = new ApiRequest($merchant);
- // Включить режим отладки (удалите в рабочей программе!)
- $apiRequest->setDebugMode();
- // Переключиться на тестовый сервер (удалите в рабочей программе!)
- $apiRequest->setSandboxMode();
- // Отправим запрос
- $responseData = $apiRequest->sendAuthRequest($payment, $merchant);
- // Преобразуем ответ из JSON в массив
- try {
- $responseData = json_decode((string) $responseData["response"], true);
-
- // Нарисуем кнопку оплаты
- echo Std::drawPayuButton([
- 'url' => $responseData["paymentResult"]['url'],
- 'sum' => $payment->sumProductsAmount(),
- ]);
-
- // Либо сделаем редирект (перенаправление) браузера по адресу оплаты:
- // echo Std::redirect($responseData["paymentResult"]['url']);
- } catch (Exception $exception) {
- //TODO: обработка исключения
- echo Std::alert([
- 'text' => '
- Извините, платёжный метод временно недоступен.
- Вы можете попробовать другой способ оплаты, либо свяжитесь с продавцом.
-
-
' . $exception->getMessage() . '
',
- 'type' => 'danger',
- ]);
-
- throw new PaymentException('Платёжный метод временно недоступен');
- }
- break;
-
+ case 'getPaymentLinkMarketplace':
+ case 'getToken':
+ case 'paymentByToken':
case 'paymentCapture':
- // Запрос на списание денег
- // В зависимости от настройки мерчанта, PayU может списывать денежные средства автоматически,
- // Либо с помощью дополнительного запроса, описанного ниже.
-
- // Создадим такой запрос:
- $capture = (new Capture);
-
- // Номер платежа PayU (возвращается в ответ на запрос на авторизацию в JSON Response)
- $capture->setPayuPaymentReference(2297597);
-
- // Cумма исходной операции на авторизацию
- $capture->setOriginalAmount(5300);
- // Cумма фактического списания
- $capture->setAmount(3700);
- // Валюта
- $capture->setCurrency('RUB');
-
- // Создадим HTTP-запрос к API
- $apiRequest = new ApiRequest($merchant);
- // Включить режим отладки (удалите в рабочей программе!)
- $apiRequest->setDebugMode();
- // Переключиться на тестовый сервер (удалите в рабочей программе!)
- $apiRequest->setSandboxMode();
- // Отправим запрос к API
- $responseData = $apiRequest->sendCaptureRequest($capture, $merchant);
-
- break;
case 'paymentGetStatus':
- // Получить номер транзакции в PayU
-
- // Номер заказа
- $merchantPaymentReference = 'primer_nomer__184';
- // Создадим HTTP-запрос к API
- $apiRequest = new ApiRequest($merchant);
- // Включить режим отладки (удалите в рабочей программе!)
- $apiRequest->setDebugMode();
- // Переключиться на тестовый сервер (удалите в рабочей программе!)
- $apiRequest->setSandboxMode();
- // Отправим запрос к API
- $responseData = $apiRequest->sendStatusRequest($merchantPaymentReference);
-
- break;
+ case 'payoutCreate':
case 'paymentWebhook':
- //сформировать вебхук
- break;
case 'paymentRefund':
- // Инициировать возврат средств
-
- // Создадим запрос
- $refund = (new Refund);
-
- // Установим номер платежа PayU - возвращается в ответ на запрос на авторизацию платежа в JSON Response
- // См. пример с запросом Payment выше
- $refund->setPayuPaymentReference(2297597);
- // Cумма исходной операции на авторизацию
- $refund->setOriginalAmount(3700);
- // Cумма фактического списания
- $refund->setAmount(3700);
- // Установим валюту
- $refund->setCurrency('RUB');
- // Создадим HTTP-запрос к API
- $apiRequest = new ApiRequest($merchant);
- // Включить режим отладки (удалите в рабочей программе!)
- $apiRequest->setDebugMode();
- // Переключиться на тестовый сервер (удалите в рабочей программе!)
- $apiRequest->setSandboxMode();
- // Отправим запрос к API
- $responseData = $apiRequest->sendRefundRequest($refund, $merchant);
- break;
-
+ case 'paymentRefundMarketplace':
+ case 'getSession':
+ case 'oneTimeTokenPayment':
case 'returnPage':
- // Страница после оплаты:
- echo '