Initial Commit

This commit is contained in:
2024-02-08 12:07:49 -07:00
parent 5813b1109f
commit 43077b57ed
5471 changed files with 682195 additions and 0 deletions
+25
View File
@@ -0,0 +1,25 @@
### v2.0.7 от 03.03.2021
* Исправлена ошибка в обработчике кода товара
### v2.0.6 от 25.02.2021
* Фильтр номера телефона
* Формат даты с миллисекундами
* Обработчик кода товара в формате Data Matrix
### v2.0.5 от 15.01.2021
* Оптимизация работы с Unicode в json
### v2.0.4 от 28.12.2020
* Оптимизация получения списка платежей
### v2.0.3 от 10.12.2020
* Возвращены методы для email и phone в receipt
### v2.0.2 от 08.12.2020
* Исправлен autoload.php
### v2.0.1 от 02.12.2020
* Небольшие исправления
### v2.0.0 от 01.12.2020
* Обновленная версия SDK
+22
View File
@@ -0,0 +1,22 @@
The MIT License
Copyright (c) 2020 "YooMoney", NBСO LLC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+63
View File
@@ -0,0 +1,63 @@
# The YooKassa API PHP Client Library
[![Build Status](https://travis-ci.org/yoomoney/yookassa-sdk-php.svg?branch=master)](https://travis-ci.org/yoomoney/yookassa-sdk-php)
[![Latest Stable Version](https://poser.pugx.org/yoomoney/yookassa-sdk-php/v/stable)](https://packagist.org/packages/yoomoney/yookassa-sdk-php)
[![Total Downloads](https://poser.pugx.org/yoomoney/yookassa-sdk-php/downloads)](https://packagist.org/packages/yoomoney/yookassa-sdk-php)
[![Monthly Downloads](https://poser.pugx.org/yoomoney/yookassa-sdk-php/d/monthly)](https://packagist.org/packages/yoomoney/yookassa-sdk-php)
[![License](https://poser.pugx.org/yoomoney/yookassa-sdk-php/license)](https://packagist.org/packages/yoomoney/yookassa-sdk-php)
[Russian](https://github.com/yoomoney/yookassa-sdk-php/blob/master/README.md) | English
This product is used for managing payments under [The YooKassa API](https://yookassa.ru/en/developers/api)
For usage by those who implemented YooKassa using the API method.
## Requirements
PHP 5.3.2 (or later version) with the libcurl library
## Installation
### Under console using Composer
1. Install Composer, a package manager.
2. In the console, run the following command:
```bash
composer require yoomoney/yookassa-sdk-php
```
### Do the following for the composer.json file of your project:
1. Add a string `"yoomoney/yookassa-sdk-php": "^2.0"` to the list of dependencies of your project in the composer.json file
```
...
"require": {
"php": ">=5.3.2",
"yoomoney/yookassa-sdk-php": "^2.0"
...
```
2. Refresh the project's dependencies. In the console, navigate to the catalog with composer.json and run the following command:
```bash
composer update
```
3. Adjust your project's code to activate automated uploading of files for our product:
```php
require __DIR__ . '/vendor/autoload.php';
```
### Manually
1. Download [the YooKassa API PHP Client Library archive](https://github.com/yoomoney/yookassa-sdk-php/archive/master.zip), extract it and copy the lib catalog to the required place of your project.
2. Adjust your project's code to activate automated uploading of files for our product:
```php
require __DIR__ . '/lib/autoload.php';
```
## Commencing work
1. Import required classes
```php
use YooKassa\Client;
```
2. Create a sample of a client object, then set the store's identifier and secret key (you can get them under your YooKassa's Merchant Profile). [Issuing a secret key](https://yookassa.ru/docs/support/merchant/payments/implement/keys?lang=en)
```php
$client = new Client();
$client->setAuth('shopId', 'secretKey');
```
3. Call the required API method. [More details in our documentation for the YooKassa API](https://yookassa.ru/en/developers/api#create_payment)
+63
View File
@@ -0,0 +1,63 @@
# YooKassa API PHP Client Library
[![Build Status](https://travis-ci.org/yoomoney/yookassa-sdk-php.svg?branch=master)](https://travis-ci.org/yoomoney/yookassa-sdk-php)
[![Latest Stable Version](https://poser.pugx.org/yoomoney/yookassa-sdk-php/v/stable)](https://packagist.org/packages/yoomoney/yookassa-sdk-php)
[![Total Downloads](https://poser.pugx.org/yoomoney/yookassa-sdk-php/downloads)](https://packagist.org/packages/yoomoney/yookassa-sdk-php)
[![Monthly Downloads](https://poser.pugx.org/yoomoney/yookassa-sdk-php/d/monthly)](https://packagist.org/packages/yoomoney/yookassa-sdk-php)
[![License](https://poser.pugx.org/yoomoney/yookassa-sdk-php/license)](https://packagist.org/packages/yoomoney/yookassa-sdk-php)
Russian | [English](https://github.com/yoomoney/yookassa-sdk-php/blob/master/README.en.md)
Клиент для работы с платежами по [API ЮKassa](https://yookassa.ru/developers/api)
Подходит тем, у кого способ подключения к ЮKassa называется API.
## Требования
PHP 5.3.2 (и выше) с расширением libcurl
## Установка
### В консоли с помощью Composer
1. Установите менеджер пакетов Composer.
2. В консоли выполните команду
```bash
composer require yoomoney/yookassa-sdk-php
```
### В файле composer.json своего проекта
1. Добавьте строку `"yoomoney/yookassa-sdk-php": "^2.0"` в список зависимостей вашего проекта в файле composer.json
```
...
"require": {
"php": ">=5.3.2",
"yoomoney/yookassa-sdk-php": "^2.0"
...
```
2. Обновите зависимости проекта. В консоли перейдите в каталог, где лежит composer.json, и выполните команду:
```bash
composer update
```
3. В коде вашего проекта подключите автозагрузку файлов нашего клиента:
```php
require __DIR__ . '/vendor/autoload.php';
```
### Вручную
1. Скачайте [архив YooKassa API PHP Client Library](https://github.com/yoomoney/yookassa-sdk-php/archive/master.zip), распакуйте его и скопируйте каталог lib в нужное место в вашем проекте.
2. В коде вашего проекта подключите автозагрузку файлов нашего клиента:
```php
require __DIR__ . '/lib/autoload.php';
```
## Начало работы
1. Импортируйте нужные классы
```php
use YooKassa\Client;
```
2. Создайте экземпляр объекта клиента и задайте идентификатор магазина и секретный ключ (их можно получить в личном кабинете ЮKassa). [Как выпустить секретный ключ](https://yookassa.ru/docs/support/merchant/payments/implement/keys)
```php
$client = new Client();
$client->setAuth('shopId', 'secretKey');
```
3. Вызовите нужный метод API. [Подробнее в документации к API ЮKassa](https://yookassa.ru/developers/api#create_payment)
+770
View File
@@ -0,0 +1,770 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa;
use Exception;
use InvalidArgumentException;
use YooKassa\Client\BaseClient;
use YooKassa\Common\Exceptions\ApiConnectionException;
use YooKassa\Common\Exceptions\ApiException;
use YooKassa\Common\Exceptions\AuthorizeException;
use YooKassa\Common\Exceptions\BadApiRequestException;
use YooKassa\Common\Exceptions\ExtensionNotFoundException;
use YooKassa\Common\Exceptions\ForbiddenException;
use YooKassa\Common\Exceptions\InternalServerError;
use YooKassa\Common\Exceptions\NotFoundException;
use YooKassa\Common\Exceptions\ResponseProcessingException;
use YooKassa\Common\Exceptions\TooManyRequestsException;
use YooKassa\Common\Exceptions\UnauthorizedException;
use YooKassa\Common\HttpVerb;
use YooKassa\Helpers\TypeCast;
use YooKassa\Helpers\UUID;
use YooKassa\Model\PaymentInterface;
use YooKassa\Model\RefundInterface;
use YooKassa\Model\Webhook\Webhook;
use YooKassa\Request\Payments\CreatePaymentRequest;
use YooKassa\Request\Payments\CreatePaymentRequestInterface;
use YooKassa\Request\Payments\CreatePaymentResponse;
use YooKassa\Request\Payments\CreatePaymentRequestSerializer;
use YooKassa\Request\Payments\Payment\CancelResponse;
use YooKassa\Request\Payments\Payment\CreateCaptureRequest;
use YooKassa\Request\Payments\Payment\CreateCaptureRequestInterface;
use YooKassa\Request\Payments\Payment\CreateCaptureRequestSerializer;
use YooKassa\Request\Payments\Payment\CreateCaptureResponse;
use YooKassa\Request\Payments\PaymentResponse;
use YooKassa\Request\Payments\PaymentsRequest;
use YooKassa\Request\Payments\PaymentsRequestInterface;
use YooKassa\Request\Payments\PaymentsRequestSerializer;
use YooKassa\Request\Payments\PaymentsResponse;
use YooKassa\Request\Receipts\AbstractReceiptResponse;
use YooKassa\Request\Receipts\CreatePostReceiptRequest;
use YooKassa\Request\Receipts\CreatePostReceiptRequestInterface;
use YooKassa\Request\Receipts\CreatePostReceiptRequestSerializer;
use YooKassa\Request\Receipts\ReceiptResponseFactory;
use YooKassa\Request\Receipts\ReceiptsRequest;
use YooKassa\Request\Receipts\ReceiptsRequestSerializer;
use YooKassa\Request\Receipts\ReceiptsResponse;
use YooKassa\Request\Refunds\CreateRefundRequest;
use YooKassa\Request\Refunds\CreateRefundRequestInterface;
use YooKassa\Request\Refunds\CreateRefundRequestSerializer;
use YooKassa\Request\Refunds\CreateRefundResponse;
use YooKassa\Request\Refunds\RefundResponse;
use YooKassa\Request\Refunds\RefundsRequest;
use YooKassa\Request\Refunds\RefundsRequestInterface;
use YooKassa\Request\Refunds\RefundsRequestSerializer;
use YooKassa\Request\Refunds\RefundsResponse;
use YooKassa\Request\Webhook\WebhookListResponse;
/**
* Класс клиента API
*
* @package YooKassa
*
* @since 1.0.1
*/
class Client extends BaseClient
{
/**
* Текущая версия библиотеки
*/
const SDK_VERSION = '2.0.7';
/**
* Получить список платежей магазина.
*
* @param PaymentsRequestInterface|array|null $filter
*
* @return PaymentsResponse
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws ExtensionNotFoundException
* @throws Exception
*/
public function getPayments($filter = null)
{
$path = self::PAYMENTS_PATH;
if ($filter === null) {
$queryParams = array();
} else {
if (is_array($filter)) {
$filter = PaymentsRequest::builder()->build($filter);
}
$serializer = new PaymentsRequestSerializer();
$queryParams = $serializer->serialize($filter);
}
$response = $this->execute($path, HttpVerb::GET, $queryParams);
$paymentResponse = null;
if ($response->getCode() == 200) {
$responseArray = $this->decodeData($response);
$paymentResponse = new PaymentsResponse($responseArray);
} else {
$this->handleError($response);
}
return $paymentResponse;
}
/**
* Создание платежа.
*
* Чтобы принять оплату, необходимо создать объект платежа — `Payment`. Он содержит всю необходимую информацию
* для проведения оплаты (сумму, валюту и статус). У платежа линейный жизненный цикл, он последовательно
* переходит из статуса в статус.
*
* Необходимо указать один из параметров:
* <ul>
* <li>payment_token — оплата по одноразовому PaymentToken, сформированному виджетом YooKassa JS;</li>
* <li>payment_method_id — оплата по сохраненным платежным данным;</li>
* <li>payment_method_data — оплата по новым платежным данным.</li>
* </ul>
*
* Если не указан ни один параметр и `confirmation.type = redirect`, то в качестве `confirmation_url`
* возвращается ссылка, по которой пользователь сможет самостоятельно выбрать подходящий способ оплаты.
* Дополнительные параметры:
* <ul>
* <li>confirmation — передается, если необходимо уточнить способ подтверждения платежа;</li>
* <li>recipient — указывается при наличии нескольких товаров;</li>
* <li>metadata — дополнительные данные (передаются магазином).</li>
* </ul>
*
* @param CreatePaymentRequestInterface|array $payment
* @param string|null $idempotenceKey {@link https://yookassa.ru/developers/using-api/basics?lang=php#idempotence}
*
* @return CreatePaymentResponse
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws Exception
*/
public function createPayment($payment, $idempotenceKey = null)
{
$path = self::PAYMENTS_PATH;
$headers = array();
if ($idempotenceKey) {
$headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotenceKey;
} else {
$headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
}
if (is_array($payment)) {
$payment = CreatePaymentRequest::builder()->build($payment);
}
$serializer = new CreatePaymentRequestSerializer();
$serializedData = $serializer->serialize($payment);
$httpBody = $this->encodeData($serializedData);
$response = $this->execute($path, HttpVerb::POST, null, $httpBody, $headers);
$paymentResponse = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$paymentResponse = new CreatePaymentResponse($resultArray);
} else {
$this->handleError($response);
}
return $paymentResponse;
}
/**
* Получить информацию о платеже
*
* Выдает объект платежа {@link PaymentInterface} по его уникальному идентификатору.
*
* @param string $paymentId
*
* @return PaymentInterface
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws ExtensionNotFoundException
*/
public function getPaymentInfo($paymentId)
{
if ($paymentId === null) {
throw new \InvalidArgumentException('Missing the required parameter $paymentId');
} elseif (!TypeCast::canCastToString($paymentId)) {
throw new \InvalidArgumentException('Invalid paymentId value: string required');
} elseif (strlen($paymentId) !== 36) {
throw new \InvalidArgumentException('Invalid paymentId value');
}
$path = self::PAYMENTS_PATH.'/'.$paymentId;
$response = $this->execute($path, HttpVerb::GET, null);
$result = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$result = new PaymentResponse($resultArray);
} else {
$this->handleError($response);
}
return $result;
}
/**
* Подтверждение платежа
*
* Подтверждает вашу готовность принять платеж. Платеж можно подтвердить, только если он находится
* в статусе `waiting_for_capture`. Если платеж подтвержден успешно — значит, оплата прошла, и вы можете выдать
* товар или оказать услугу пользователю. На следующий день после подтверждения платеж попадет в реестр,
* и ЮKassa переведет деньги на ваш расчетный счет. Если вы не подтверждаете платеж до момента, указанного
* в `expire_at`, по умолчанию он отменяется, а деньги возвращаются пользователю. При оплате банковской картой
* у вас есть 7 дней на подтверждение платежа. Для остальных способов оплаты платеж необходимо подтвердить
* в течение 6 часов.
*
* @param CreateCaptureRequestInterface|array $captureRequest
* @param $paymentId
* @param $idempotencyKey {@link https://yookassa.ru/developers/using-api/basics?lang=php#idempotence}
*
* @return CreateCaptureResponse
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws Exception
*/
public function capturePayment($captureRequest, $paymentId, $idempotencyKey = null)
{
if ($paymentId === null) {
throw new \InvalidArgumentException('Missing the required parameter $paymentId');
} elseif (!TypeCast::canCastToString($paymentId)) {
throw new \InvalidArgumentException('Invalid paymentId value: string required');
} elseif (strlen($paymentId) !== 36) {
throw new \InvalidArgumentException('Invalid paymentId value');
}
$path = '/payments/'.$paymentId.'/capture';
$headers = array();
if ($idempotencyKey) {
$headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
} else {
$headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
}
if (is_array($captureRequest)) {
$captureRequest = CreateCaptureRequest::builder()->build($captureRequest);
}
$serializer = new CreateCaptureRequestSerializer();
$serializedData = $serializer->serialize($captureRequest);
$httpBody = $this->encodeData($serializedData);
$response = $this->execute($path, HttpVerb::POST, null, $httpBody, $headers);
$result = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$result = new CreateCaptureResponse($resultArray);
} else {
$this->handleError($response);
}
return $result;
}
/**
* Отменить незавершенную оплату заказа.
*
* Отменяет платеж, находящийся в статусе `waiting_for_capture`. Отмена платежа значит, что вы
* не готовы выдать пользователю товар или оказать услугу. Как только вы отменяете платеж, мы начинаем
* возвращать деньги на счет плательщика. Для платежей банковскими картами отмена происходит мгновенно.
* Для остальных способов оплаты возврат может занимать до нескольких дней.
*
* @param $paymentId
* @param $idempotencyKey {@link https://yookassa.ru/developers/using-api/basics?lang=php#idempotence}
*
* @return CancelResponse
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws Exception
*/
public function cancelPayment($paymentId, $idempotencyKey = null)
{
if ($paymentId === null) {
throw new \InvalidArgumentException('Missing the required parameter $paymentId');
} elseif (!TypeCast::canCastToString($paymentId)) {
throw new \InvalidArgumentException('Invalid paymentId value: string required');
} elseif (strlen($paymentId) !== 36) {
throw new \InvalidArgumentException('Invalid paymentId value');
}
$path = self::PAYMENTS_PATH.'/'.$paymentId.'/cancel';
$headers = array();
if ($idempotencyKey) {
$headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
} else {
$headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
}
$response = $this->execute($path, HttpVerb::POST, null, null, $headers);
$result = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$result = new CancelResponse($resultArray);
} else {
$this->handleError($response);
}
return $result;
}
/**
* Получить список возвратов платежей
*
* @param RefundsRequestInterface|array|null $filter
*
* @return RefundsResponse
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws ExtensionNotFoundException
*/
public function getRefunds($filter = null)
{
$path = self::REFUNDS_PATH;
if ($filter === null) {
$queryParams = array();
} else {
if (is_array($filter)) {
$filter = RefundsRequest::builder()->build($filter);
}
$serializer = new RefundsRequestSerializer();
$queryParams = $serializer->serialize($filter);
}
$response = $this->execute($path, HttpVerb::GET, $queryParams);
$refundsResponse = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$refundsResponse = new RefundsResponse($resultArray);
} else {
$this->handleError($response);
}
return $refundsResponse;
}
/**
* Проведение возврата платежа
*
* Создает объект возврата — `Refund`. Возвращает успешно завершенный платеж по уникальному идентификатору
* этого платежа. Создание возврата возможно только для платежей в статусе `succeeded`. Комиссии за проведение
* возврата нет. Комиссия, которую ЮKassa берёт за проведение исходного платежа, не возвращается.
*
* @param CreateRefundRequestInterface|array $request
* @param null $idempotencyKey {@link https://yookassa.ru/developers/using-api/basics?lang=php#idempotence}
*
* @return CreateRefundResponse
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws Exception
*/
public function createRefund($request, $idempotencyKey = null)
{
$path = self::REFUNDS_PATH;
$headers = array();
if ($idempotencyKey) {
$headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
} else {
$headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
}
if (is_array($request)) {
$request = CreateRefundRequest::builder()->build($request);
}
$serializer = new CreateRefundRequestSerializer();
$serializedData = $serializer->serialize($request);
$httpBody = $this->encodeData($serializedData);
$response = $this->execute($path, HttpVerb::POST, null, $httpBody, $headers);
$result = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$result = new CreateRefundResponse($resultArray);
} else {
$this->handleError($response);
}
return $result;
}
/**
* Получить информацию о возврате
*
* @param $refundId
*
* @return RefundResponse
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws ExtensionNotFoundException
*/
public function getRefundInfo($refundId)
{
if ($refundId === null) {
throw new \InvalidArgumentException('Missing the required parameter $refundId');
} elseif (!TypeCast::canCastToString($refundId)) {
throw new \InvalidArgumentException('Invalid refundId value: string required');
} elseif (strlen($refundId) !== 36) {
throw new \InvalidArgumentException('Invalid refundId value');
}
$path = self::REFUNDS_PATH.'/'.$refundId;
$response = $this->execute($path, HttpVerb::GET, null);
$result = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$result = new RefundResponse($resultArray);
} else {
$this->handleError($response);
}
return $result;
}
/**
* Создание Webhook
* Запрос позволяет подписаться на уведомления о событии (например, на переход платежа в статус successed).
*
* @param $request
* @param null $idempotencyKey
* @return Webhook|null
*
* @throws ApiException
* @throws BadApiRequestException
* @throws AuthorizeException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws Exception
*/
public function addWebhook($request, $idempotencyKey = null)
{
$path = self::WEBHOOKS_PATH;
$headers = array();
if ($idempotencyKey) {
$headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
} else {
$headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
}
if (is_array($request)) {
$webhook = new Webhook($request);
} else {
$webhook = $request;
}
if (!($webhook instanceof Webhook)) {
throw new InvalidArgumentException();
}
$httpBody = $this->encodeData($webhook->jsonSerialize());
$response = $this->execute($path, HttpVerb::POST, null, $httpBody, $headers);
$result = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$result = new Webhook($resultArray);
} else {
$this->handleError($response);
}
return $result;
}
/**
* Удаление Webhook
* Запрос позволяет отписаться от уведомлений о событии для переданного OAuth-токена. Чтобы удалить webhook, вам нужно передать в запросе его идентификатор.
*
* @param $webhookId
* @param null $idempotencyKey
* @return Webhook|null
*
* @throws ApiException
* @throws BadApiRequestException
* @throws AuthorizeException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws Exception
*/
public function removeWebhook($webhookId, $idempotencyKey = null)
{
$headers = array();
if ($idempotencyKey) {
$headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
} else {
$headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
}
$path = self::WEBHOOKS_PATH.'/'.$webhookId;
$response = $this->execute($path, HttpVerb::DELETE, null, null, $headers);
$result = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$result = new Webhook($resultArray);
} else {
$this->handleError($response);
}
return $result;
}
/**
* Список созданных Webhook
* Запрос позволяет узнать, какие webhook есть для переданного OAuth-токена.
*
* @return WebhookListResponse|null
*
* @throws ApiException
* @throws BadApiRequestException
* @throws AuthorizeException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws ExtensionNotFoundException
*/
public function getWebhooks()
{
$path = self::WEBHOOKS_PATH;
$response = $this->execute($path, HttpVerb::GET, null);
$result = null;
if ($response->getCode() == 200) {
$responseArray = $this->decodeData($response);
$result = new WebhookListResponse($responseArray);
} else {
$this->handleError($response);
}
return $result;
}
/**
* Получить список платежей магазина.
*
* @param PaymentInterface|RefundInterface|array|null $filter
*
* @return ReceiptsResponse
*
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws ExtensionNotFoundException
* @throws Exception
*/
public function getReceipts($filter = null)
{
$path = self::RECEIPTS_PATH;
if ($filter === null) {
$queryParams = array();
} else {
if (is_array($filter)) {
$filter = ReceiptsRequest::builder()->build($filter);
}
$serializer = new ReceiptsRequestSerializer();
$queryParams = $serializer->serialize($filter);
}
$response = $this->execute($path, HttpVerb::GET, $queryParams);
$receiptsResponse = null;
if ($response->getCode() == 200) {
$responseArray = $this->decodeData($response);
$receiptsResponse = new ReceiptsResponse($responseArray);
} else {
$this->handleError($response);
}
return $receiptsResponse;
}
/**
* @param CreatePostReceiptRequestInterface|array $receipt
* @param string|null $idempotenceKey
*
* @return AbstractReceiptResponse|null
*
* @throws ApiException
* @throws BadApiRequestException
* @throws ApiConnectionException
* @throws AuthorizeException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws Exception
*/
public function createReceipt($receipt, $idempotenceKey = null)
{
$path = self::RECEIPTS_PATH;
$headers = array();
if ($idempotenceKey) {
$headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotenceKey;
} else {
$headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
}
if (is_array($receipt)) {
$receipt = CreatePostReceiptRequest::builder()->build($receipt);
}
$serializer = new CreatePostReceiptRequestSerializer();
$serializedData = $serializer->serialize($receipt);
$httpBody = $this->encodeData($serializedData);
$response = $this->execute($path, HttpVerb::POST, null, $httpBody, $headers);
$receiptResponse = null;
if ($response->getCode() == 200) {
$resultArray = $this->decodeData($response);
$factory = new ReceiptResponseFactory();
$receiptResponse = $factory->factory($resultArray);
} else {
$this->handleError($response);
}
return $receiptResponse;
}
/**
* Информация о магазине
* Запрос позволяет получить информацию о магазине для переданного OAuth-токена.
*
* @return array|null
*
* @throws ApiException
* @throws BadApiRequestException
* @throws AuthorizeException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
* @throws ExtensionNotFoundException
*/
public function me()
{
$path = self::ME_PATH;
$response = $this->execute($path, HttpVerb::GET, null);
$result = null;
if ($response->getCode() == 200) {
$responseArray = $this->decodeData($response);
$result = $responseArray;
} else {
$this->handleError($response);
}
return $result;
}
}
@@ -0,0 +1,79 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Client;
use Psr\Log\LoggerInterface;
/**
* Interface ApiClientInterface
* @package YooKassa\Client
*/
interface ApiClientInterface
{
/**
* @param $path
* @param $method
* @param $queryParams
* @param $httpBody
* @param $headers
* @return mixed
*/
public function call($path, $method, $queryParams, $httpBody = null, $headers = array());
/**
* @param LoggerInterface|null $logger
*/
public function setLogger($logger);
/**
* @return UserAgent
*/
public function getUserAgent();
/**
* @param $shopId
* @return mixed
*/
public function setShopId($shopId);
/**
* @param $shopPassword
* @return mixed
*/
public function setShopPassword($shopPassword);
/**
* @param $bearerToken
* @return mixed
*/
public function setBearerToken($bearerToken);
/**
* @param array $config
*/
public function setConfig($config);
}
@@ -0,0 +1,410 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Client;
use Exception;
use Psr\Log\LoggerInterface;
use YooKassa\Common\Exceptions\ApiConnectionException;
use YooKassa\Common\Exceptions\ApiException;
use YooKassa\Common\Exceptions\AuthorizeException;
use YooKassa\Common\Exceptions\BadApiRequestException;
use YooKassa\Common\Exceptions\ExtensionNotFoundException;
use YooKassa\Common\Exceptions\ForbiddenException;
use YooKassa\Common\Exceptions\InternalServerError;
use YooKassa\Common\Exceptions\JsonException;
use YooKassa\Common\Exceptions\NotFoundException;
use YooKassa\Common\Exceptions\ResponseProcessingException;
use YooKassa\Common\Exceptions\TooManyRequestsException;
use YooKassa\Common\Exceptions\UnauthorizedException;
use YooKassa\Common\LoggerWrapper;
use YooKassa\Common\ResponseObject;
use YooKassa\Helpers\Config\ConfigurationLoader;
use YooKassa\Helpers\Config\ConfigurationLoaderInterface;
class BaseClient
{
const PAYMENTS_PATH = '/payments';
const REFUNDS_PATH = '/refunds';
const WEBHOOKS_PATH = '/webhooks';
const RECEIPTS_PATH = '/receipts';
const ME_PATH = '/me';
/**
* Имя HTTP заголовка, используемого для передачи idempotence key
*/
const IDEMPOTENCY_KEY_HEADER = 'Idempotence-Key';
/**
* Значение по умолчанию времени ожидания между запросами при отправке повторного запроса в случае получения
* ответа с HTTP статусом 202
*/
const DEFAULT_DELAY = 1800;
/**
* Значение по умолчанию количества попыток получения информации от API если пришёл ответ с HTTP статусом 202
*/
const DEFAULT_TRIES_COUNT = 3;
/**
* Значение по умолчанию количества попыток получения информации от API если пришёл ответ с HTTP статусом 202
*/
const DEFAULT_ATTEMPTS_COUNT = 3;
/**
* @var null|ApiClientInterface
*/
protected $apiClient;
/**
* @var string
*/
protected $login;
/**
* @var string
*/
protected $password;
/**
* @var array
*/
protected $config;
/**
* Время через которое будут осуществляться повторные запросы
* Значение по умолчанию - 1800 миллисекунд.
* @var int значение в миллисекундах
*/
protected $timeout;
/**
* Количество повторных запросов при ответе API статусом 202
* Значение по умолчанию 3
* @var int
*/
protected $attempts;
/**
* @var LoggerInterface|null
*/
protected $logger;
/**
* Constructor
*
* @param ApiClientInterface|null $apiClient
* @param ConfigurationLoaderInterface|null $configLoader
*/
public function __construct(ApiClientInterface $apiClient = null, ConfigurationLoaderInterface $configLoader = null)
{
if ($apiClient === null) {
$apiClient = new CurlClient();
}
if ($configLoader === null) {
$configLoader = new ConfigurationLoader();
}
$config = $configLoader->load()->getConfig();
$this->setConfig($config);
$apiClient->setConfig($config);
$this->attempts = self::DEFAULT_ATTEMPTS_COUNT;
$this->apiClient = $apiClient;
}
/**
* @param $login
* @param $password
*
* @return static $this
*/
public function setAuth($login, $password)
{
$this->login = $login;
$this->password = $password;
$this->apiClient
->setBearerToken(null)
->setShopId($this->login)
->setShopPassword($this->password);
return $this;
}
/**
* @param $token
*
* @return $this
*/
public function setAuthToken($token)
{
$this->apiClient
->setShopId(null)
->setShopPassword(null)
->setBearerToken($token);
return $this;
}
/**
* @return ApiClientInterface
*/
public function getApiClient()
{
return $this->apiClient;
}
/**
* @param ApiClientInterface $apiClient
*
* @return static $this
*/
public function setApiClient(ApiClientInterface $apiClient)
{
$this->apiClient = $apiClient;
$this->apiClient->setConfig($this->config);
$this->apiClient->setLogger($this->logger);
return $this;
}
/**
* Устанавливает логгер приложения
*
* @param null|callable|object|LoggerInterface $value Инстанс логгера
*/
public function setLogger($value)
{
if ($value === null || $value instanceof LoggerInterface) {
$this->logger = $value;
} else {
$this->logger = new LoggerWrapper($value);
}
if ($this->apiClient !== null) {
$this->apiClient->setLogger($this->logger);
}
}
/**
* @return array
*/
public function getConfig()
{
return $this->config;
}
/**
* @param array $config
*/
public function setConfig($config)
{
$this->config = $config;
}
/**
* Установка значение задержки между повторными запросами
*
* @param int $timeout
*
* @return static
*/
public function setRetryTimeout($timeout)
{
$this->timeout = $timeout;
return $this;
}
/**
* Установка значения количества попыток повторных запросов при статусе 202
*
* @param int $attempts
*
* @return static
*/
public function setMaxRequestAttempts($attempts)
{
$this->attempts = $attempts;
return $this;
}
/**
* @param $serializedData
*
* @return string
* @throws Exception
*/
protected function encodeData($serializedData)
{
if ($serializedData === array()) {
return '{}';
}
if (defined('JSON_UNESCAPED_UNICODE') && defined('JSON_UNESCAPED_SLASHES')) {
$encoded = json_encode($serializedData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} else {
$encoded = self::_unescaped(json_encode($serializedData));
}
if ($encoded === false) {
$errorCode = json_last_error();
throw new JsonException("Failed serialize json.", $errorCode);
}
return $encoded;
}
/**
* @param string $json
* @return string|false
*/
private static function _unescaped($json)
{
if ($json === false) {
return false;
}
$json = str_replace('\\/', '/', $json);
return preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
}, $json);
}
/**
* @param ResponseObject $response
*
* @return array
*/
protected function decodeData(ResponseObject $response)
{
$resultArray = json_decode($response->getBody(), true);
if ($resultArray === null) {
throw new JsonException('Failed to decode response', json_last_error());
}
return $resultArray;
}
/**
* @param ResponseObject $response
*
* @throws ApiException
* @throws BadApiRequestException
* @throws ForbiddenException
* @throws InternalServerError
* @throws NotFoundException
* @throws ResponseProcessingException
* @throws TooManyRequestsException
* @throws UnauthorizedException
*/
protected function handleError(ResponseObject $response)
{
switch ($response->getCode()) {
case BadApiRequestException::HTTP_CODE:
throw new BadApiRequestException($response->getHeaders(), $response->getBody());
break;
case ForbiddenException::HTTP_CODE:
throw new ForbiddenException($response->getHeaders(), $response->getBody());
break;
case UnauthorizedException::HTTP_CODE:
throw new UnauthorizedException($response->getHeaders(), $response->getBody());
break;
case InternalServerError::HTTP_CODE:
throw new InternalServerError($response->getHeaders(), $response->getBody());
break;
case NotFoundException::HTTP_CODE:
throw new NotFoundException($response->getHeaders(), $response->getBody());
break;
case TooManyRequestsException::HTTP_CODE:
throw new TooManyRequestsException($response->getHeaders(), $response->getBody());
break;
case ResponseProcessingException::HTTP_CODE:
throw new ResponseProcessingException($response->getHeaders(), $response->getBody());
break;
default:
if ($response->getCode() > 399) {
throw new ApiException(
'Unexpected response error code',
$response->getCode(),
$response->getHeaders(),
$response->getBody()
);
}
}
}
/**
* Задержка между повторными запросами
*
* @param $response
*/
protected function delay($response)
{
$timeout = $this->timeout;
$responseData = $this->decodeData($response);
if ($timeout) {
$delay = $timeout;
} else {
if (isset($responseData['retry_after'])) {
$delay = $responseData['retry_after'];
} else {
$delay = self::DEFAULT_DELAY;
}
}
usleep($delay * 1000);
}
/**
* Выполнение запроса и обработка 202 статуса
*
* @param $path
* @param $method
* @param $queryParams
* @param null $httpBody
* @param array $headers
*
* @return mixed|ResponseObject
* @throws ApiException
* @throws AuthorizeException
* @throws ApiConnectionException
* @throws ExtensionNotFoundException
*/
protected function execute($path, $method, $queryParams, $httpBody = null, $headers = array())
{
$attempts = $this->attempts;
$response = $this->apiClient->call($path, $method, $queryParams, $httpBody, $headers);
while (in_array($response->getCode(), array(202, 500)) && $attempts > 0) {
$this->delay($response);
$attempts--;
$response = $this->apiClient->call($path, $method, $queryParams, $httpBody, $headers);
}
return $response;
}
}
@@ -0,0 +1,527 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Client;
use Psr\Log\LoggerInterface;
use YooKassa\Common\Exceptions\ApiConnectionException;
use YooKassa\Common\Exceptions\ApiException;
use YooKassa\Common\Exceptions\AuthorizeException;
use YooKassa\Common\Exceptions\ExtensionNotFoundException;
use YooKassa\Common\ResponseObject;
use YooKassa\Helpers\RawHeadersParser;
/**
* Class CurlClient
* @package YooKassa\Client
*/
class CurlClient implements ApiClientInterface
{
/**
* @var array
*/
private $config;
/**
* @var string
*/
private $shopId;
/**
* @var string
*/
private $shopPassword;
/**
* @var string
*/
private $bearerToken;
/**
* @var int
*/
private $timeout = 80;
/**
* @var int
*/
private $connectionTimeout = 30;
/**
* @var string
*/
private $proxy;
/** @var UserAgent */
private $userAgent;
/**
* @var bool
*/
private $keepAlive = true;
/**
* @var array
*/
private $defaultHeaders = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
);
/**
* @var resource
*/
private $curl;
/**
* @var LoggerInterface|null
*/
private $logger;
/**
* CurlClient constructor.
*/
public function __construct()
{
$this->userAgent = new UserAgent();
}
/**
* @param LoggerInterface|null $logger
*/
public function setLogger($logger)
{
$this->logger = $logger;
}
/**
* @inheritdoc
*
* @param $path
* @param $method
* @param $queryParams
* @param null $httpBody
* @param array $headers
*
* @return ResponseObject
* @throws ApiConnectionException
* @throws ApiException
* @throws AuthorizeException
* @throws ExtensionNotFoundException
*/
public function call($path, $method, $queryParams, $httpBody = null, $headers = array())
{
$headers = $this->prepareHeaders($headers);
$this->logRequestParams($path, $method, $queryParams, $httpBody, $headers);
$url = $this->prepareUrl($path, $queryParams);
$this->prepareCurl($method, $httpBody, $this->implodeHeaders($headers), $url);
list($httpHeaders, $httpBody, $responseInfo) = $this->sendRequest();
if (!$this->keepAlive) {
$this->closeCurlConnection();
}
$this->logResponse($httpBody, $responseInfo, $httpHeaders);
return new ResponseObject(array(
'code' => $responseInfo['http_code'],
'headers' => $httpHeaders,
'body' => $httpBody,
));
}
/**
* @param $optionName
* @param $optionValue
*
* @return bool
*/
public function setCurlOption($optionName, $optionValue)
{
return curl_setopt($this->curl, $optionName, $optionValue);
}
/**
* @return resource
* @throws ExtensionNotFoundException
*/
private function initCurl()
{
if (!extension_loaded('curl')) {
throw new ExtensionNotFoundException('curl');
}
if (!$this->curl || !$this->keepAlive) {
$this->curl = curl_init();
}
return $this->curl;
}
/**
* Close connection
*/
public function closeCurlConnection()
{
if ($this->curl !== null) {
curl_close($this->curl);
}
}
/**
* @return array
* @throws ApiConnectionException
*/
public function sendRequest()
{
$response = curl_exec($this->curl);
$httpHeaderSize = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
$httpHeaders = RawHeadersParser::parse(substr($response, 0, $httpHeaderSize));
$httpBody = substr($response, $httpHeaderSize);
$responseInfo = curl_getinfo($this->curl);
$curlError = curl_error($this->curl);
$curlErrno = curl_errno($this->curl);
if ($response === false) {
$this->handleCurlError($curlError, $curlErrno);
}
return array($httpHeaders, $httpBody, $responseInfo);
}
/**
* @param $method
* @param $httpBody
*/
public function setBody($method, $httpBody)
{
$this->setCurlOption(CURLOPT_CUSTOMREQUEST, $method);
if(!empty($httpBody)) {
$this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody);
}
}
/**
* @param mixed $shopId
*
* @return CurlClient
*/
public function setShopId($shopId)
{
$this->shopId = $shopId;
return $this;
}
/**
* @param mixed $shopPassword
*
* @return CurlClient
*/
public function setShopPassword($shopPassword)
{
$this->shopPassword = $shopPassword;
return $this;
}
/**
* @return mixed
*/
public function getTimeout()
{
return $this->timeout;
}
/**
* @param mixed $timeout
*/
public function setTimeout($timeout)
{
$this->timeout = $timeout;
}
/**
* @return mixed
*/
public function getConnectionTimeout()
{
return $this->connectionTimeout;
}
/**
* @param mixed $connectionTimeout
*/
public function setConnectionTimeout($connectionTimeout)
{
$this->connectionTimeout = $connectionTimeout;
}
/**
* @return string
* @since 1.0.14
*/
public function getProxy()
{
return $this->proxy;
}
/**
* @param string $proxy
*
* @since 1.0.14
*/
public function setProxy($proxy)
{
$this->proxy = $proxy;
}
/**
* @return mixed
*/
public function getConfig()
{
return $this->config;
}
/**
* @inheritDoc
*/
public function setConfig($config)
{
$this->config = $config;
}
/**
* @return UserAgent
*/
public function getUserAgent()
{
return $this->userAgent;
}
/**
* @param string $bearerToken
*
* @return static $this
*/
public function setBearerToken($bearerToken)
{
$this->bearerToken = $bearerToken;
return $this;
}
/**
* @param bool $keepAlive
*
* @return CurlClient
*/
public function setKeepAlive($keepAlive)
{
$this->keepAlive = $keepAlive;
return $this;
}
/**
* @param string $error
* @param int $errno
*
* @throws ApiConnectionException
*/
private function handleCurlError($error, $errno)
{
switch ($errno) {
case CURLE_COULDNT_CONNECT:
case CURLE_COULDNT_RESOLVE_HOST:
case CURLE_OPERATION_TIMEOUTED:
$msg = 'Could not connect to YooKassa API. Please check your internet connection and try again.';
break;
case CURLE_SSL_CACERT:
case CURLE_SSL_PEER_CERTIFICATE:
$msg = 'Could not verify SSL certificate.';
break;
default:
$msg = 'Unexpected error communicating.';
}
$msg .= "\n\n(Network error [errno $errno]: $error)";
throw new ApiConnectionException($msg);
}
/**
* @return mixed
*/
private function getUrl()
{
$config = $this->config;
return $config['url'];
}
/**
* @param $headers
*
* @return array
* @throws AuthorizeException
*/
private function prepareHeaders($headers)
{
$headers = array_merge($this->defaultHeaders, $headers);
$headers[UserAgent::HEADER] = $this->getUserAgent()->getHeaderString();
if ($this->shopId && $this->shopPassword) {
$encodedAuth = base64_encode($this->shopId . ':' . $this->shopPassword);
$headers['Authorization'] = 'Basic ' . $encodedAuth;
} else if ($this->bearerToken) {
$headers['Authorization'] = 'Bearer ' . $this->bearerToken;
}
if (empty($headers['Authorization'])) {
throw new AuthorizeException('Authorization headers not set');
}
return $headers;
}
/**
* @param array $headers
* @return array
*/
private function implodeHeaders($headers)
{
return array_map(function ($key, $value) { return $key . ':' . $value; }, array_keys($headers), $headers);
}
/**
* @param $path
* @param $method
* @param $queryParams
* @param $httpBody
* @param $headers
*/
private function logRequestParams($path, $method, $queryParams, $httpBody, $headers)
{
if ($this->logger !== null) {
$message = 'Send request: ' . $method . ' ' . $path;
$context = array();
if (!empty($queryParams)) {
$context['_params'] = $queryParams;
}
if (!empty($httpBody)) {
$data = json_decode($httpBody, true);
if (JSON_ERROR_NONE !== json_last_error()) {
$data = $httpBody;
}
$context['_body'] = $data;
}
if (!empty($headers)) {
$context['_headers'] = $headers;
}
$this->logger->info($message, $context);
}
}
/**
* @param $path
* @param $queryParams
*
* @return string
*/
private function prepareUrl($path, $queryParams)
{
$url = $this->getUrl() . $path;
if (!empty($queryParams)) {
$url = $url . '?' . http_build_query($queryParams);
}
return $url;
}
/**
* @param $httpBody
* @param $responseInfo
* @param $httpHeaders
*/
private function logResponse($httpBody, $responseInfo, $httpHeaders)
{
if ($this->logger !== null) {
$message = 'Response with code ' . $responseInfo['http_code'] . ' received.';
$context = array();
if (!empty($httpBody)) {
$data = json_decode($httpBody, true);
if (JSON_ERROR_NONE !== json_last_error()) {
$data = $httpBody;
}
$context['_body'] = $data;
}
if (!empty($httpHeaders)) {
$context['_headers'] = $httpHeaders;
}
$this->logger->info($message, $context);
}
}
/**
* @param $method
* @param $httpBody
* @param $headers
* @param $url
* @throws ExtensionNotFoundException
*/
private function prepareCurl($method, $httpBody, $headers, $url)
{
$this->initCurl();
$this->setCurlOption(CURLOPT_URL, $url);
$this->setCurlOption(CURLOPT_RETURNTRANSFER, true);
$this->setCurlOption(CURLOPT_HEADER, true);
$this->setCurlOption(CURLOPT_BINARYTRANSFER, true);
if ($this->proxy) {
$this->setCurlOption(CURLOPT_PROXY, $this->proxy);
$this->setCurlOption(CURLOPT_HTTPPROXYTUNNEL, true);
}
$this->setBody($method, $httpBody);
$this->setCurlOption(CURLOPT_HTTPHEADER, $headers);
$this->setCurlOption(CURLOPT_CONNECTTIMEOUT, $this->connectionTimeout);
$this->setCurlOption(CURLOPT_TIMEOUT, $this->timeout);
}
}
@@ -0,0 +1,320 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Client;
use YooKassa\Client;
/**
* Class UserAgent
* @package YooKassa\Client
*/
class UserAgent
{
const HEADER = 'YM-User-Agent';
const VERSION_DELIMITER = '/';
const PART_DELIMITER = ' ';
private $_os = null;
private $_php = null;
private $_framework = null;
private $_cms = null;
private $_module = null;
private $_sdk = null;
/**
* UserAgent constructor.
*/
public function __construct()
{
if ($os = $this->defineOs()) {
$this->setOs($os['name'], $os['version']);
}
if ($php = $this->definePhp()) {
$this->setPhp($php['name'], $php['version']);
}
$this->setSdk('YooKassa.PHP', Client::SDK_VERSION);
}
/**
* @return string
*/
public function getHeaderString()
{
$result = array();
$result[] = $this->getOs();
$result[] = $this->getPhp();
if ($string = $this->getFramework()) {
$result[] = $string;
}
if ($string = $this->getCms()) {
$result[] = $string;
}
if ($string = $this->getModule()) {
$result[] = $string;
}
$result[] = $this->getSdk();
return implode(self::PART_DELIMITER, $result);
}
/**
* @return string
*/
public function getOs()
{
return $this->_os;
}
/**
* @param string $name
* @param string $version
*/
private function setOs($name, $version)
{
$this->_os = $this->createVersion($name, $version);
}
/**
* @return string
*/
public function getPhp()
{
return $this->_php;
}
/**
* @param string $name
* @param string $version
*/
private function setPhp($name, $version)
{
$this->_php = $this->createVersion($name, $version);
}
/**
* @return string|null
*/
public function getFramework()
{
return $this->_framework;
}
/**
* @param string $name
* @param string $version
*/
public function setFramework($name, $version)
{
$this->_framework = $this->createVersion($name, $version);
}
/**
* @return null
*/
public function getCms()
{
return $this->_cms;
}
/**
* @param string $name
* @param string $version
*/
public function setCms($name, $version)
{
$this->_cms = $this->createVersion($name, $version);
}
/**
* @return string
*/
public function getModule()
{
return $this->_module;
}
/**
* @param string $name
* @param string $version
*/
public function setModule($name, $version)
{
$this->_module = $this->createVersion($name, $version);
}
/**
* @return string
*/
public function getSdk()
{
return $this->_sdk;
}
/**
* @param string $name
* @param string $version
*/
private function setSdk($name, $version)
{
$this->_sdk = $this->createVersion($name, $version);
}
/**
* Попытка определить систему
* @return array
*/
private function defineOs()
{
if (strtolower(substr(PHP_OS, 0, 5)) === 'linux') {
if ($result = $this->parseSimpleLinuxRelease()) {
return $result;
} elseif ($result = $this->parseSmartLinuxRelease()) {
return $result;
}
} else {
return array( 'name' => php_uname('s'), 'version' => php_uname('r') );
}
return array( 'name' => 'Undefined', 'version' => '0.0.0' );
}
/**
* Возвращает информацию о версии системы
* Используется сложный вариант
* @return array|null
*/
private function parseSmartLinuxRelease()
{
$vars = array();
if ($files = glob('/etc/*elease')) {
foreach ($files as $file) {
if (is_file($file)) {
$lines = array_filter(array_map(array($this, 'callbackSmartLinux'), file($file)));
if (is_array($lines)) {
foreach ($lines as $line) {
$vars[strtoupper($line[0])] = trim($line[1]);
}
}
}
}
if (!empty($vars['NAME']) && !empty($vars['VERSION_ID'])) {
return array('name' => $vars['NAME'], 'version' => $vars['VERSION_ID']);
}
}
return null;
}
/**
* @param string $line
* @return array|bool
*/
private static function callbackSmartLinux($line)
{
$parts = explode('=', $line);
if (count($parts) !== 2) {
return false;
}
$parts[1] = trim(str_replace(array('"', "'"), '', $parts[1]));
return $parts;
}
/**
* Возвращает информацию о версии системы
* Используется простой вариант
* @return array|null
*/
private function parseSimpleLinuxRelease()
{
$vars = array();
if ($files = glob('/etc/*elease')) {
foreach ($files as $file) {
if (is_file($file)) {
$data = array_map(array($this, 'callbackSimpleLinux'), file($file));
if (!empty($data)) {
$array = array_shift($data);
if (!empty($array) && is_array($array)) {
$vars = array_merge($vars, $array);
}
}
}
}
}
return !empty($vars['name']) && !empty($vars['version']) ? $vars : null;
}
/**
* @param string $line
* @return array
*/
private static function callbackSimpleLinux($line)
{
$parse = array();
preg_match('/(.+) release (.+) (.+)/iu', $line, $parts);
if (!empty($parts[1])) {
$parse['name'] = str_replace(' ', '.', trim($parts[1]));
}
if (!empty($parts[2])) {
$parse['version'] = trim($parts[2]);
}
return $parse;
}
/**
* Определение версии PHP
* @return array
*/
private function definePhp()
{
return array(
'name' => 'PHP',
'version' => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION
);
}
/**
* Создание строки версии компонента
* @param string $name
* @param string $version
* @return string
*/
public function createVersion($name, $version)
{
return str_replace(array(self::PART_DELIMITER, self::VERSION_DELIMITER), '.', trim($name))
. self::VERSION_DELIMITER
. str_replace(array(self::PART_DELIMITER, self::VERSION_DELIMITER), '.', trim($version));
}
}
@@ -0,0 +1,74 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
/**
* Базовый класс генерируемых enum'ов
*
* @package YooKassa\Common
*/
abstract class AbstractEnum
{
/**
* @var array Массив принимаемых enum'ом значений
*/
protected static $validValues = array();
/**
* Проверяет наличие значения в enum'e
* @param mixed $value Проверяемое значение
* @return bool True если значение имеется, false если нет
*/
public static function valueExists($value)
{
return array_key_exists($value, static::$validValues);
}
/**
* Возвращает все значения в enum'e
* @return array Массив значений в перечислении
*/
public static function getValidValues()
{
return array_keys(static::$validValues);
}
/**
* Возвращает значения в enum'е значения которых разрешены
* @return string[] Массив разрешённых значений
*/
public static function getEnabledValues()
{
$result = array();
foreach (static::$validValues as $key => $enabled) {
if ($enabled) {
$result[] = $key;
}
}
return $result;
}
}
@@ -0,0 +1,251 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
if (!defined('YOOKASSA_DATE')) {
if (version_compare(PHP_VERSION, '7.0') >= 0) {
define('YOOKASSA_DATE', "Y-m-d\TH:i:s.vP");
} else {
define('YOOKASSA_DATE', "Y-m-d\TH:i:s.uP");
}
}
if (!interface_exists('JsonSerializable')) {
require_once dirname(__FILE__) . '/legacy_json_serializable.php';
}
/**
* Базовый класс генерируемых объектов
*
* @package YooKassa\Common
*/
abstract class AbstractObject implements \ArrayAccess, \JsonSerializable
{
/**
* @var array Свойства установленные пользователем
*/
private $unknownProperties = array();
/**
* AbstractObject constructor.
* @param array $data
*/
public function __construct($data = array())
{
if (!empty($data) && is_array($data)) {
$this->fromArray($data);
}
}
/**
* Проверяет наличие свойства
* @param string $offset Имя проверяемого свойства
* @return bool True если свойство имеется, false если нет
*/
public function offsetExists($offset)
{
$method = 'get' . ucfirst($offset);
if (method_exists($this, $method)) {
return true;
}
$method = 'get' . self::matchPropertyName($offset);
if (method_exists($this, $method)) {
return true;
}
return array_key_exists($offset, $this->unknownProperties);
}
/**
* Возвращает значение свойства
* @param string $offset Имя свойства
* @return mixed Значение свойства
*/
public function offsetGet($offset)
{
$method = 'get' . ucfirst($offset);
if (method_exists($this, $method)) {
return $this->{$method} ();
}
$method = 'get' . self::matchPropertyName($offset);
if (method_exists($this, $method)) {
return $this->{$method} ();
}
return array_key_exists($offset, $this->unknownProperties) ? $this->unknownProperties[$offset] : null;
}
/**
* Устанавливает значение свойства
* @param string $offset Имя свойства
* @param mixed $value Значение свойства
*/
public function offsetSet($offset, $value)
{
$method = 'set' . ucfirst($offset);
if (method_exists($this, $method)) {
$this->{$method}($value);
} else {
$method = 'set' . self::matchPropertyName($offset);
if (method_exists($this, $method)) {
$this->{$method}($value);
} else {
$this->unknownProperties[$offset] = $value;
}
}
}
/**
* Удаляет свойство
* @param string $offset Имя удаляемого свойства
*/
public function offsetUnset($offset)
{
$method = 'set' . ucfirst($offset);
if (method_exists($this, $method)) {
$this->{$method} (null);
} else {
$method = 'set' . self::matchPropertyName($offset);
if (method_exists($this, $method)) {
$this->{$method} (null);
} else {
unset($this->unknownProperties[$offset]);
}
}
}
/**
* Возвращает значение свойства
* @param string $propertyName Имя свойства
* @return mixed Значение свойства
*/
public function __get($propertyName)
{
return $this->offsetGet($propertyName);
}
/**
* Устанавливает значение свойства
* @param string $propertyName Имя свойства
* @param mixed $value Значение свойства
*/
public function __set($propertyName, $value)
{
$this->offsetSet($propertyName, $value);
}
/**
* Проверяет наличие свойства
* @param string $propertyName Имя проверяемого свойства
* @return bool True если свойство имеется, false если нет
*/
public function __isset($propertyName)
{
return $this->offsetExists($propertyName);
}
/**
* Удаляет свойство
* @param string $propertyName Имя удаляемого свойства
*/
public function __unset($propertyName)
{
$this->offsetUnset($propertyName);
}
/**
* Устанавливает значения свойств текущего объекта из массива
* @param array|\Traversable $sourceArray Ассоциативный массив с найтройками
*/
public function fromArray($sourceArray)
{
foreach ($sourceArray as $key => $value) {
$this->offsetSet($key, $value);
}
}
/**
* Возвращает ассоциативный массив со свойствами текущего объекта для его дальнейшей JSON сериализации
* @return array Ассоциативный массив со свойствами текущего объекта
*/
public function jsonSerialize()
{
$result = array();
foreach (get_class_methods($this) as $method) {
if (strncmp('get', $method, 3) === 0) {
if ($method === 'getUnknownProperties') {
continue;
}
if ($method === 'getIterator') {
continue;
}
$property = strtolower(preg_replace('/[A-Z]/', '_\0', lcfirst(substr($method, 3))));
$value = $this->serializeValueToJson($this->{$method} ());
if ($value !== null) {
$result[$property] = $value;
}
}
}
if (!empty($this->unknownProperties)) {
foreach ($this->unknownProperties as $property => $value) {
if (!array_key_exists($property, $result)) {
$result[$property] = $this->serializeValueToJson($value);
}
}
}
return $result;
}
private function serializeValueToJson($value)
{
if ($value === null || is_scalar($value) || is_array($value)) {
return $value;
} elseif (is_object($value) && $value instanceof \JsonSerializable) {
return $value->jsonSerialize();
} elseif (is_object($value) && $value instanceof \DateTime) {
return $value->format(YOOKASSA_DATE);
}
return $value;
}
/**
* Возвращает массив свойств которые не существуют, но были заданы у объекта
* @return array Ассоциативный массив с не существующими у текущего объекта свойствами
*/
protected function getUnknownProperties()
{
return $this->unknownProperties;
}
/**
* Преобразует имя свойства из snake_case в camelCase
* @param string $property Преобразуемое значение
* @return string Значение в камэл кейсе
*/
private static function matchPropertyName($property)
{
return preg_replace('/\_(\w)/', '\1', $property);
}
}
@@ -0,0 +1,223 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Model\AmountInterface;
use YooKassa\Model\Receipt;
use YooKassa\Model\ReceiptInterface;
use YooKassa\Model\Transfer;
use YooKassa\Model\TransferInterface;
/**
* Класс объекта запроса к API
*
* @property AmountInterface $amount Сумма
* @property ReceiptInterface $receipt Данные фискального чека 54-ФЗ
* @property TransferInterface[] $transfers Данные о распределении платежа между магазинами
*
* @since 1.0.18
*/
class AbstractPaymentRequest extends AbstractRequest
{
/**
* @var AmountInterface Сумма оплаты
*/
protected $_amount;
/**
* @var Receipt Данные фискального чека 54-ФЗ
*/
protected $_receipt;
/**
* @var TransferInterface[]
*/
protected $_transfers = array();
/**
* Возвращает сумму оплаты
* @return AmountInterface Сумма оплаты
*/
public function getAmount()
{
return $this->_amount;
}
/**
* Проверяет была ли установлена сумма оплаты
* @return bool True если сумма оплаты была установлена, false если нет
*/
public function hasAmount()
{
return !empty($this->_amount);
}
/**
* Устанавливает сумму оплаты
* @param AmountInterface $value Сумма оплаты
*/
public function setAmount(AmountInterface $value)
{
$this->_amount = $value;
}
/**
* Возвращает чек, если он есть
* @return ReceiptInterface|null Данные фискального чека 54-ФЗ или null если чека нет
*/
public function getReceipt()
{
return $this->_receipt;
}
/**
* Устанавливает чек
* @param ReceiptInterface|null $value Инстанс чека или null для удаления информации о чеке
* @throws InvalidPropertyValueTypeException Выбрасывается если передан не инстанс класса чека и не null
*/
public function setReceipt($value)
{
if ($value === null || $value instanceof ReceiptInterface) {
$this->_receipt = $value;
} else {
throw new InvalidPropertyValueTypeException('Invalid receipt in Refund', 0, 'Refund.receipt', $value);
}
}
/**
* Проверяет наличие чека
* @return bool True если чек есть, false если нет
*/
public function hasReceipt()
{
return $this->_receipt !== null && $this->_receipt->notEmpty();
}
/**
* Удаляет чек из запроса
*/
public function removeReceipt()
{
$this->_receipt = null;
}
/**
* Устанавливает transfers (массив распределения денег между магазинами)
* @param TransferInterface[]|array $value
*/
public function setTransfers($value)
{
if (!is_array($value)) {
$message = 'Transfers must be an array of TransferInterface';
throw new InvalidPropertyValueTypeException($message, 0, 'Payment.transfers', $value);
}
$transfers = array();
foreach ($value as $item) {
if (is_array($item)) {
$item = new Transfer($item);
}
if (!($item instanceof TransferInterface)) {
$message = 'Transfers must be an array of TransferInterface';
throw new InvalidPropertyValueTypeException($message, 0, 'Payment.transfers', $value);
}
$transfers[] = $item;
}
$this->_transfers = $transfers;
}
/**
* Валидирует объект запроса
* @return bool True если запрос валиден и его можно отправить в API, false если нет
*/
public function validate()
{
if ($this->_amount === null) {
$this->setValidationError('Payment amount not specified');
return false;
}
$value = $this->_amount->getValue();
if (empty($value) || $value <= 0.0) {
$this->setValidationError('Invalid payment amount value: ' . $value);
return false;
}
if (!empty($this->_transfers)) {
$sum = 0;
foreach ($this->_transfers as $transfer) {
if ($transfer->getAmount() === null) {
$this->setValidationError('Payment amount not specified');
return false;
}
$value = $transfer->getAmount()->getValue();
if (empty($value) || $value <= 0.0) {
$this->setValidationError('Invalid transfer amount value: ' . $value);
return false;
}
$sum += (float) $value;
$accountId = $transfer->getAccountId();
if (empty($accountId)) {
$this->setValidationError('Transfer account id not specified');
return false;
}
}
if ($sum !== (float) $this->getAmount()->getValue()) {
$this->setValidationError('Transfer amount sum does not match top-level amount');
}
}
if ($this->getReceipt() && $this->getReceipt()->notEmpty()) {
$email = $this->getReceipt()->getCustomer()->getEmail();
$phone = $this->getReceipt()->getCustomer()->getPhone();
if (empty($email) && empty($phone)) {
$this->setValidationError('Both email and phone values are empty in receipt');
return false;
}
}
return true;
}
public function hasTransfers()
{
return !empty($this->_transfers);
}
public function getTransfers()
{
return $this->_transfers;
}
}
@@ -0,0 +1,336 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Model\AmountInterface;
use YooKassa\Model\MonetaryAmount;
use YooKassa\Model\Receipt;
use YooKassa\Model\Receipt\ReceiptItemAmount;
use YooKassa\Model\ReceiptCustomer;
use YooKassa\Model\ReceiptInterface;
use YooKassa\Model\ReceiptItem;
use YooKassa\Model\ReceiptItemInterface;
use YooKassa\Model\Transfer;
use YooKassa\Model\TransferInterface;
/**
* Базовый класс объекта платежного запроса, передаваемого в методы клиента API
*
* @package YooKassa\Common
*
* @since 1.0.18
*/
abstract class AbstractPaymentRequestBuilder extends AbstractRequestBuilder
{
/**
* @var MonetaryAmount Сумма
*/
protected $amount;
/**
* @var Receipt Объект с информацией о чеке
*/
protected $receipt;
/**
* @var TransferInterface[] Массив платежей в пользу разных мерчантов
*/
protected $transfers;
/**
* @return self
*/
protected function initCurrentObject()
{
$this->amount = new MonetaryAmount();
$this->receipt = new Receipt();
$this->transfers = array();
return $this;
}
/**
* {@inheritDoc}
*/
public function build(array $options = null)
{
return parent::build($options);
}
/**
* Устанавливает сумму
*
* @param AmountInterface|array|string $value Сумма оплаты
*
* @return self Инстанс билдера запросов
*/
public function setAmount($value)
{
if ($value === null || $value === '') {
$this->amount = new MonetaryAmount();
} elseif ($value instanceof AmountInterface) {
$this->amount->setValue($value->getValue());
$this->amount->setCurrency($value->getCurrency());
} elseif (is_array($value)) {
$this->amount->fromArray($value);
} else {
$this->amount->setValue($value);
}
return $this;
}
/**
* Устанавливает трансферы
*
* @param array|string $value Массив трансферов
*
* @return self Инстанс билдера запросов
*/
public function setTransfers($value)
{
$value = (array)$value;
$this->transfers = array();
foreach ($value as $item) {
$transfer = new Transfer();
if ($item instanceof TransferInterface) {
$transfer->setAmount($item->getAmount());
$transfer->setAccountId($item->getAccountId());
if ($item->hasPlatformFeeAmount()) {
$transfer->setPlatformFeeAmount($item->getPlatformFeeAmount());
}
} elseif (is_array($item)) {
$transfer->fromArray($item);
}
$this->transfers[] = $transfer;
}
return $this;
}
/**
* Устанавливает валюту в которой будет происходить подтверждение оплаты заказа
*
* @param string $value Валюта в которой подтверждается оплата
*
* @return self Инстанс билдера запросов
*/
public function setCurrency($value)
{
$this->amount->setCurrency($value);
foreach ($this->receipt->getItems() as $item) {
$item->getPrice()->setCurrency($value);
}
return $this;
}
/**
* Устанавливает чек
*
* @param ReceiptInterface|array $value Инстанс чека или ассоциативный массив с данными чека
*
* @return self
*
* @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
*/
public function setReceipt($value)
{
if (is_array($value)) {
$this->receipt->fromArray($value);
} elseif ($value instanceof ReceiptInterface) {
$this->receipt = clone $value;
} else {
throw new InvalidPropertyValueTypeException('Invalid receipt value type', 0, 'receipt', $value);
}
return $this;
}
/**
* Устанавлвиает список товаров для создания чека
*
* @param array $value Массив товаров в заказе
*
* @return self Инстанс билдера запросов
*
* @throws InvalidPropertyValueException Выбрасывается если хотя бы один из товаров имеет неверную структуру
*/
public function setReceiptItems($value)
{
$this->receipt->setItems(array());
$index = 0;
foreach ($value as $item) {
if ($item instanceof ReceiptItemInterface) {
$this->receipt->addItem($item);
} else {
if (empty($item['title']) && empty($item['description'])) {
throw new InvalidPropertyValueException(
'Item#'.$index.' title or description not specified',
0,
'AbstractPaymentRequestBuilder.items['.$index.'].title',
json_encode($item)
);
}
foreach (array('price', 'quantity', 'vatCode') as $property) {
if (empty($item[$property])) {
throw new InvalidPropertyValueException(
'Item#'.$index.' '.$property.' not specified',
0,
'AbstractPaymentRequestBuilder.items['.$index.'].'.$property,
json_encode($item)
);
}
}
$this->addReceiptItem(
empty($item['title']) ? $item['description'] : $item['title'],
$item['price'],
$item['quantity'],
$item['vatCode']
);
}
$index++;
}
return $this;
}
/**
* Добавляет в чек товар
*
* @param string $title Название или описание товара
* @param string $price Цена товара в валюте, заданной в заказе
* @param float $quantity Количество товара
* @param int $vatCode Ставка НДС
*
* @param null|string $paymentSubject значение перечисления PaymentSubject
* @see \YooKassa\Model\Receipt\PaymentSubject::class
*
* @param null|string $paymentMode значение перечисления PaymentMode
* @see \YooKassa\Model\Receipt\PaymentMode::class
*
* @return self Инстанс билдера запросов
*/
public function addReceiptItem($title, $price, $quantity, $vatCode, $paymentMode = null, $paymentSubject = null)
{
$item = new ReceiptItem();
$item->setDescription($title);
$item->setQuantity($quantity);
$item->setVatCode($vatCode);
$item->setPrice(new ReceiptItemAmount($price, $this->amount->getCurrency()));
$item->setPaymentSubject($paymentSubject);
$item->setPaymentMode($paymentMode);
$this->receipt->addItem($item);
return $this;
}
/**
* Добавляет в чек доставку товара
*
* @param string $title Название доставки в чеке
* @param string $price Стоимость доставки
* @param int $vatCode Ставка НДС
*
* @param null|string $paymentSubject значение перечисления PaymentSubject
* @see \YooKassa\Model\Receipt\PaymentSubject::class
*
* @param null|string $paymentMode значение перечисления PaymentMode
* @see \YooKassa\Model\Receipt\PaymentMode::class
*
* @return self Инстанс билдера запросов
*/
public function addReceiptShipping($title, $price, $vatCode, $paymentMode = null, $paymentSubject = null)
{
$item = new ReceiptItem();
$item->setDescription($title);
$item->setQuantity(1);
$item->setVatCode($vatCode);
$item->setIsShipping(true);
$item->setPrice(new ReceiptItemAmount($price, $this->amount->getCurrency()));
$item->setPaymentMode($paymentMode);
$item->setPaymentSubject($paymentSubject);
$this->receipt->addItem($item);
return $this;
}
/**
* Устанавливает адрес электронной почты получателя чека
*
* @param string $value Email получателя чека
*
* @return self Инстанс билдера запросов
*/
public function setReceiptEmail($value)
{
if (!$this->receipt->getCustomer()) {
$this->receipt->setCustomer(new ReceiptCustomer());
}
$this->receipt->getCustomer()->setEmail($value);
return $this;
}
/**
* Устанавливает телефон получателя чека
*
* @param string $value Телефон получателя чека
* @return self Инстанс билдера запросов
*
* @throws InvalidPropertyValueTypeException Выбрасывается если в качестве значения была передана не строка
*/
public function setReceiptPhone($value)
{
if (!$this->receipt->getCustomer()) {
$this->receipt->setCustomer(new ReceiptCustomer());
}
$this->receipt->getCustomer()->setPhone($value);
return $this;
}
/**
* Устанавливает код системы налогообложения.
*
* @param int $value Код системы налогообложения. Число 1-6.
*
* @return self Инстанс билдера запросов
*/
public function setTaxSystemCode($value)
{
$this->receipt->setTaxSystemCode($value);
return $this;
}
}
@@ -0,0 +1,72 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
/**
* Базовый класс объекта запроса, передаваемого в методы клиента API
*
* @package YooKassa\Common
*/
abstract class AbstractRequest extends AbstractObject
{
/**
* @var string Последняя ошибка валидации текущего запроса
*/
private $_validationError;
/**
* Валидирует текущий запрос, проверяет все ли нужные свойства установлены
* @return bool True если запрос валиден, false если нет
*/
abstract public function validate();
/**
* Очищает статус валидации текущего запроса
*/
public function clearValidationError()
{
$this->_validationError = null;
}
/**
* Устанавливает ошибку валидации
* @param string $value Ошибка, произошедшая при валидации объекта
*/
protected function setValidationError($value)
{
$this->_validationError = $value;
}
/**
* Возвращает последнюю ошибку валидации
* @return string Последняя произошедшая ошибка валидации
*/
public function getLastValidationError()
{
return $this->_validationError;
}
}
@@ -0,0 +1,119 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
use YooKassa\Common\Exceptions\InvalidPropertyException;
use YooKassa\Common\Exceptions\InvalidRequestException;
/**
* Базовый класс билдера запросов
*
* @package YooKassa\Common
*/
abstract class AbstractRequestBuilder
{
/**
* @var AbstractRequest Инстанс собираемого запроса
*/
protected $currentObject;
/**
* Конструктор, инициализирует пустой запрос, который в будущем начнём собирать
*/
public function __construct()
{
$this->currentObject = $this->initCurrentObject();
}
/**
* Инициализирует пустой запрос
* @return AbstractRequest Инстанс запроса который будем собирать
*/
abstract protected function initCurrentObject();
/**
* Строит запрос, валидирует его и возвращает, если все прошло нормально
* @param array $options Массив свойств запроса, если нужно их установить перед сборкой
* @return AbstractRequest Инстанс собранного запроса
*
* @throws InvalidRequestException Выбрасывается если при валидации запроса произошла ошибка
* @throws InvalidPropertyException Выбрасывается если не удалось установить один из параметров, переданныч в
* массиве настроек
*/
public function build(array $options = null)
{
if (!empty($options)) {
$this->setOptions($options);
}
try {
$this->currentObject->clearValidationError();
if (!$this->currentObject->validate()) {
throw new InvalidRequestException($this->currentObject);
}
} catch (InvalidRequestException $e) {
throw $e;
} catch (\Exception $e) {
throw new InvalidRequestException($this->currentObject, 0, $e);
}
$result = $this->currentObject;
$this->currentObject = $this->initCurrentObject();
return $result;
}
/**
* Устанавливает свойства запроса из массива
* @param array|\Traversable $options Массив свойств запроса
* @return AbstractRequestBuilder Инстанс текущего билдера запросов
*
* @throws \InvalidArgumentException Выбрасывается если аргумент не массив и не итерируемый объект
* @throws InvalidPropertyException Выбрасывается если не удалось установить один из параметров, переданныч
* в массиве настроек
*/
public function setOptions($options)
{
if (empty($options)) {
return $this;
}
if (!is_array($options) && !($options instanceof \Traversable)) {
throw new \InvalidArgumentException('Invalid options value in setOptions method');
}
foreach ($options as $property => $value) {
$method = 'set' . ucfirst($property);
if (method_exists($this, $method)) {
$this->{$method} ($value);
} else {
$property = str_replace('.', '_', $property);
$field = implode('', array_map('ucfirst', explode('_', $property)));
$method = 'set' . ucfirst($field);
if (method_exists($this, $method)) {
$this->{$method} ($value);
}
}
}
return $this;
}
}
@@ -0,0 +1,32 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class ApiConnectionException extends ApiException
{
}
@@ -0,0 +1,73 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
use Exception;
class ApiException extends Exception
{
/**
* @var mixed
*/
protected $responseBody;
/**
* @var string[]
*/
protected $responseHeaders;
/**
* Constructor
*
* @param string $message Error message
* @param int $code HTTP status code
* @param string[] $responseHeaders HTTP header
* @param mixed $responseBody HTTP body
*/
public function __construct($message = "", $code = 0, $responseHeaders = array(), $responseBody = null)
{
parent::__construct($message, $code);
$this->responseHeaders = $responseHeaders;
$this->responseBody = $responseBody;
}
/**
* @return string[]
*/
public function getResponseHeaders()
{
return $this->responseHeaders;
}
/**
* @return mixed
*/
public function getResponseBody()
{
return $this->responseBody;
}
}
@@ -0,0 +1,32 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class AuthorizeException extends ApiException
{
}
@@ -0,0 +1,64 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class BadApiRequestException extends ApiException
{
const HTTP_CODE = 400;
public $type;
public $retryAfter;
public function __construct($responseHeaders = array(), $responseBody = null)
{
$errorData = json_decode($responseBody, true);
$message = '';
if (isset($errorData['description'])) {
$message .= $errorData['description'] . '. ';
}
if (isset($errorData['code'])) {
$message .= sprintf('Error code: %s. ', $errorData['code']);
}
if (isset($errorData['parameter'])) {
$message .= sprintf('Parameter name: %s. ', $errorData['parameter']);
}
if (isset($errorData['retry_after'])) {
$this->retryAfter = $errorData['retry_after'];
}
if (isset($errorData['type'])) {
$this->type = $errorData['type'];
}
parent::__construct(trim($message), self::HTTP_CODE, $responseHeaders, $responseBody);
}
}
@@ -0,0 +1,31 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class EmptyPropertyValueException extends InvalidPropertyException
{
}
@@ -0,0 +1,46 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
use Exception;
class ExtensionNotFoundException extends Exception
{
/**
* Constructor
*
* @param string $name extension name
* @param int $code error code
*/
public function __construct($name, $code = 0)
{
$message = sprintf('%s extension is not loaded!', $name);
parent::__construct($message, $code);
}
}
@@ -0,0 +1,64 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class ForbiddenException extends ApiException
{
const HTTP_CODE = 403;
public $type;
public $retryAfter;
public function __construct($responseHeaders = array(), $responseBody = null)
{
$errorData = json_decode($responseBody, true);
$message = '';
if (isset($errorData['description'])) {
$message .= $errorData['description'] . '. ';
}
if (isset($errorData['code'])) {
$message .= sprintf('Error code: %s. ', $errorData['code']);
}
if (isset($errorData['parameter'])) {
$message .= sprintf('Parameter name: %s. ', $errorData['parameter']);
}
if (isset($errorData['retry_after'])) {
$this->retryAfter = $errorData['retry_after'];
}
if (isset($errorData['type'])) {
$this->type = $errorData['type'];
}
parent::__construct(trim($message), self::HTTP_CODE, $responseHeaders, $responseBody);
}
}
@@ -0,0 +1,64 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class InternalServerError extends ApiException
{
const HTTP_CODE = 500;
public $retryAfter;
public $type;
public function __construct($responseHeaders = array(), $responseBody = null)
{
$errorData = json_decode($responseBody, true);
$message = '';
if (isset($errorData['description'])) {
$message .= $errorData['description'] . '. ';
}
if (isset($errorData['code'])) {
$message .= sprintf('Error code: %s. ', $errorData['code']);
}
if (isset($errorData['parameter'])) {
$message .= sprintf('Parameter name: %s. ', $errorData['parameter']);
}
if (isset($errorData['retry_after'])) {
$this->retryAfter = $errorData['retry_after'];
}
if (isset($errorData['type'])) {
$this->type = $errorData['type'];
}
parent::__construct(trim($message), self::HTTP_CODE, $responseHeaders, $responseBody);
}
}
@@ -0,0 +1,55 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class InvalidPropertyException extends \InvalidArgumentException
{
/**
* @var string
*/
private $propertyName;
/**
* InvalidValueException constructor.
* @param string $message
* @param int $code
* @param string $property
*/
public function __construct($message = "", $code = 0, $property = "")
{
parent::__construct($message, $code);
$this->propertyName = (string)$property;
}
/**
* @return string
*/
public function getProperty()
{
return $this->propertyName;
}
}
@@ -0,0 +1,58 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class InvalidPropertyValueException extends InvalidPropertyException
{
/**
* @var mixed
*/
private $invalidValue;
/**
* InvalidPropertyValueTypeException constructor.
* @param string $message
* @param int $code
* @param string $property
* @param mixed $value
*/
public function __construct($message = '', $code = 0, $property = '', $value = null)
{
parent::__construct($message, $code, $property);
if ($value !== null) {
$this->invalidValue = $value;
}
}
/**
* @return mixed
*/
public function getValue()
{
return $this->invalidValue;
}
}
@@ -0,0 +1,62 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class InvalidPropertyValueTypeException extends InvalidPropertyException
{
/**
* @var string
*/
private $type;
/**
* InvalidPropertyValueTypeException constructor.
* @param string $message
* @param int $code
* @param string $property
* @param mixed $value
*/
public function __construct($message = "", $code = 0, $property = "", $value = null)
{
parent::__construct($message, $code, $property);
if ($value === null) {
$this->type = 'null';
} elseif (is_object($value)) {
$this->type = get_class($value);
} else {
$this->type = gettype($value);
}
}
/**
* @return string
*/
public function getType()
{
return $this->type;
}
}
@@ -0,0 +1,62 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
use YooKassa\Common\AbstractRequest;
class InvalidRequestException extends \RuntimeException
{
/**
* @var AbstractRequest|null
*/
private $errorRequest;
/**
* InvalidRequestException constructor.
* @param AbstractRequest|string $error
* @param int $code
* @param null $previous
*/
public function __construct($error, $code = 0, $previous = null)
{
if ($error instanceof AbstractRequest) {
$message = 'Failed to build request "'.get_class($error).'": "'.$error->getLastValidationError().'"';
$this->errorRequest = $error;
} else {
$message = $error;
}
parent::__construct($message, $code, $previous);
}
/**
* @return AbstractRequest|null
*/
public function getRequestObject()
{
return $this->errorRequest;
}
}
@@ -0,0 +1,46 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class JsonException extends \UnexpectedValueException
{
public static $errorLabels = array(
JSON_ERROR_NONE => 'No error',
JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
);
public function __construct($message = "", $code = 0, $previous = null)
{
$errorMsg = isset(self::$errorLabels[$code]) ? self::$errorLabels[$code] : 'Unknown error';
$message = sprintf('%s %s', $message, $errorMsg);
parent::__construct($message, $code, $previous);
}
}
@@ -0,0 +1,64 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class NotFoundException extends ApiException
{
const HTTP_CODE = 404;
public $type;
public $retryAfter;
public function __construct($responseHeaders = array(), $responseBody = null)
{
$errorData = json_decode($responseBody, true);
$message = '';
if (isset($errorData['description'])) {
$message .= $errorData['description'].'. ';
}
if (isset($errorData['code'])) {
$message .= sprintf('Error code: %s. ', $errorData['code']);
}
if (isset($errorData['parameter'])) {
$message .= sprintf('Parameter name: %s. ', $errorData['parameter']);
}
if (isset($errorData['retry_after'])) {
$this->retryAfter = $errorData['retry_after'];
}
if (isset($errorData['type'])) {
$this->type = $errorData['type'];
}
parent::__construct(trim($message), self::HTTP_CODE, $responseHeaders, $responseBody);
}
}
@@ -0,0 +1,56 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class ResponseProcessingException extends ApiException
{
const HTTP_CODE = 202;
public $type;
public $retryAfter;
public function __construct($responseHeaders = array(), $responseBody = null)
{
$errorData = json_decode($responseBody, true);
$message = '';
if (isset($errorData['description'])) {
$message .= $errorData['description'] . '. ';
}
if (isset($errorData['retry_after'])) {
$this->retryAfter = $errorData['retry_after'];
}
if (isset($errorData['type'])) {
$this->type = $errorData['type'];
}
parent::__construct(trim($message), self::HTTP_CODE, $responseHeaders, $responseBody);
}
}
@@ -0,0 +1,64 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class TooManyRequestsException extends ApiException
{
const HTTP_CODE = 429;
public $type;
public $retryAfter;
public function __construct($responseHeaders = array(), $responseBody = null)
{
$errorData = json_decode($responseBody, true);
$message = '';
if (isset($errorData['description'])) {
$message .= $errorData['description'] . '. ';
}
if (isset($errorData['code'])) {
$message .= sprintf('Error code: %s. ', $errorData['code']);
}
if (isset($errorData['parameter'])) {
$message .= sprintf('Parameter name: %s. ', $errorData['parameter']);
}
if (isset($errorData['retry_after'])) {
$this->retryAfter = $errorData['retry_after'];
}
if (isset($errorData['type'])) {
$this->type = $errorData['type'];
}
parent::__construct(trim($message), self::HTTP_CODE, $responseHeaders, $responseBody);
}
}
@@ -0,0 +1,64 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common\Exceptions;
class UnauthorizedException extends ApiException
{
const HTTP_CODE = 401;
public $type;
public $retryAfter;
public function __construct($responseHeaders = array(), $responseBody = null)
{
$errorData = json_decode($responseBody, true);
$message = '';
if (isset($errorData['description'])) {
$message .= $errorData['description'] . '. ';
}
if (isset($errorData['code'])) {
$message .= sprintf('Error code: %s. ', $errorData['code']);
}
if (isset($errorData['parameter'])) {
$message .= sprintf('Parameter name: %s. ', $errorData['parameter']);
}
if (isset($errorData['retry_after'])) {
$this->retryAfter = $errorData['retry_after'];
}
if (isset($errorData['type'])) {
$this->type = $errorData['type'];
}
parent::__construct(trim($message), self::HTTP_CODE, $responseHeaders, $responseBody);
}
}
@@ -0,0 +1,48 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
class HttpVerb extends AbstractEnum
{
const GET = 'GET';
const POST = 'POST';
const PATCH = 'PATCH';
const HEAD = 'HEAD';
const OPTIONS = 'OPTIONS';
const PUT = 'PUT';
const DELETE = 'DELETE';
protected static $validValues = array(
'GET' => true,
'POST' => true,
'PATCH' => true,
'HEAD' => true,
'OPTIONS' => true,
'PUT' => true,
'DELETE' => true
);
}
@@ -0,0 +1,192 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
use Psr\Log\InvalidArgumentException;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
class LoggerWrapper implements LoggerInterface
{
/**
* @var null|callable
*/
private $loggerCallback;
/**
* @var object
*/
private $loggerInstance;
/**
* LoggerWrapper constructor.
* @param object|callable $wrapped
*/
public function __construct($wrapped)
{
if (is_object($wrapped) && method_exists($wrapped, 'log')) {
$this->loggerInstance = $wrapped;
} elseif (is_callable($wrapped)) {
$this->loggerCallback = $wrapped;
} else {
throw new InvalidArgumentException('Invalid wrapped logger');
}
}
/**
* System is unusable.
*
* @param string $message
* @param array $context
*
* @return void
*/
public function emergency($message, array $context = array())
{
$this->log(LogLevel::EMERGENCY, $message, $context);
}
/**
* Action must be taken immediately.
*
* Example: Entire website down, database unavailable, etc. This should
* trigger the SMS alerts and wake you up.
*
* @param string $message
* @param array $context
*
* @return void
*/
public function alert($message, array $context = array())
{
$this->log(LogLevel::ALERT, $message, $context);
}
/**
* Critical conditions.
*
* Example: Application component unavailable, unexpected exception.
*
* @param string $message
* @param array $context
*
* @return void
*/
public function critical($message, array $context = array())
{
$this->log(LogLevel::CRITICAL, $message, $context);
}
/**
* Runtime errors that do not require immediate action but should typically
* be logged and monitored.
*
* @param string $message
* @param array $context
*
* @return void
*/
public function error($message, array $context = array())
{
$this->log(LogLevel::ERROR, $message, $context);
}
/**
* Exceptional occurrences that are not errors.
*
* Example: Use of deprecated APIs, poor use of an API, undesirable things
* that are not necessarily wrong.
*
* @param string $message
* @param array $context
*
* @return void
*/
public function warning($message, array $context = array())
{
$this->log(LogLevel::WARNING, $message, $context);
}
/**
* Normal but significant events.
*
* @param string $message
* @param array $context
*
* @return void
*/
public function notice($message, array $context = array())
{
$this->log(LogLevel::NOTICE, $message, $context);
}
/**
* Interesting events.
*
* Example: User logs in, SQL logs.
*
* @param string $message
* @param array $context
*
* @return void
*/
public function info($message, array $context = array())
{
$this->log(LogLevel::INFO, $message, $context);
}
/**
* Detailed debug information.
*
* @param string $message
* @param array $context
*
* @return void
*/
public function debug($message, array $context = array())
{
$this->log(LogLevel::DEBUG, $message, $context);
}
/**
* Logs with an arbitrary level.
*
* @param mixed $level
* @param string $message
* @param array $context
*
* @return void
*/
public function log($level, $message, array $context = array())
{
if ($this->loggerInstance !== null) {
$this->loggerInstance->log($level, $message, $context);
} elseif ($this->loggerCallback !== null) {
call_user_func_array($this->loggerCallback, array($level, $message, $context));
}
}
}
@@ -0,0 +1,73 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Common;
class ResponseObject
{
protected $code;
protected $headers;
protected $body;
public function __construct($config = null)
{
if (isset($config['headers'])) {
$this->headers = $config['headers'];
}
if (isset($config['body'])) {
$this->body = $config['body'];
}
if (isset($config['code'])) {
$this->code = $config['code'];
}
}
/**
* @return mixed
*/
public function getHeaders()
{
return $this->headers;
}
/**
* @return mixed
*/
public function getBody()
{
return $this->body;
}
/**
* @return mixed
*/
public function getCode()
{
return $this->code;
}
}
@@ -0,0 +1,31 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
if (!interface_exists('JsonSerializable')) {
interface JsonSerializable {
public function jsonSerialize();
}
}
@@ -0,0 +1,52 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Helpers\Config;
class ConfigurationLoader implements ConfigurationLoaderInterface
{
private $configParams;
public function load($filePath = null)
{
if ($filePath) {
$data = file_get_contents($filePath);
} else {
$data = file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "configuration.json");
}
$paramsArray = json_decode($data, true);
$this->configParams = $paramsArray;
return $this;
}
public function getConfig()
{
return $this->configParams;
}
}
@@ -0,0 +1,40 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Helpers\Config;
interface ConfigurationLoaderInterface
{
/**
* @return mixed
*/
public function getConfig();
/**
* @return mixed
*/
public function load();
}
@@ -0,0 +1,362 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Helpers;
/**
* Класс для формирования тега 1162 на основе кода в формате Data Matrix
*
* @example $receiptItem->setProductCode(new \YooKassa\Helpers\ProductCode('010463003759131691sgEKKPPcS25y592FLduM/='));
* @example array(... 'product_code' => (string)(new \YooKassa\Helpers\ProductCode('010463003759131691sgEKKPPcS25y5') ...);
*
* @link https://github.com/yoomoney/yookassa-sdk-php/blob/master/lib/Helpers/ProductCode.php
*
* Class ProductCode
* @package YooKassa\Helpers
*/
class ProductCode
{
const PREFIX_DATA_MATRIX = '444D';
/** @var string Код типа маркировки */
private $prefix;
/**
* @var string Global Trade Item Number
* Глобальный номер товарной продукции в единой международной базе товаров GS1 https://ru.wikipedia.org/wiki/GS1
* @example 04630037591316
*/
private $gtin;
/**
* @var string Серийный номер товара
* @example sgEKKPPcS25y5
*/
private $serial;
/** @var string Сформированный тег 1162. Формат: hex([prefix]+gtin+serial)
* @example 04 36 03 BE F5 14 73 67 45 4b 4b 50 50 63 53 32 35 79 35
*/
private $result;
/** @var bool Флаг использования кода типа маркировки */
private $usePrefix = false;
/**
* ProductCode constructor.
* @param string|null $codeDataMatrix Строка, расшифрованная из QR-кода
* @param bool|string $usePrefix Нужен ли код типа маркировки в результате
*/
public function __construct($codeDataMatrix=null, $usePrefix=false)
{
$this->preparePrefix($usePrefix);
if (!empty($codeDataMatrix)) {
if ($this->parseCodeMatrixData($codeDataMatrix)) {
$this->result = $this->calcResult();
}
}
}
/**
* Возвращает Код типа маркировки
* @return string Код типа маркировки
*/
public function getPrefix()
{
return $this->prefix;
}
/**
* Устанавливает Код типа маркировки
* @param string|int $prefix Код типа маркировки
* @return ProductCode
*/
public function setPrefix($prefix)
{
if ($prefix === null || $prefix === '') {
$this->prefix = null;
return $this;
}
if (is_int($prefix)) {
$prefix = dechex($prefix);
}
$this->prefix = str_pad($prefix, 4, '0', STR_PAD_LEFT);
return $this;
}
/**
* Возвращает Глобальный номер товарной продукции
* @return string Глобальный номер товарной продукции
*/
public function getGtin()
{
return $this->gtin;
}
/**
* Устанавливает Глобальный номер товарной продукции
* @param string$gtin Глобальный номер товарной продукции
* @return ProductCode
*/
public function setGtin($gtin)
{
if ($gtin === null || $gtin === '') {
$this->gtin = null;
} else {
$this->gtin = $gtin;
}
return $this;
}
/**
* Возвращает Серийный номер товара
* @return string Серийный номер товара
*/
public function getSerial()
{
return $this->serial;
}
/**
* Устанавливает Серийный номер товара
* @param string $serial Серийный номер товара
* @return ProductCode
*/
public function setSerial($serial)
{
if ($serial === null || $serial === '') {
$this->prefix = null;
} else {
$this->serial = $serial;
}
return $this;
}
/**
* Возвращает Сформированный тег 1162.
* @return string Сформированный тег 1162.
*/
public function getResult()
{
if (!$this->result) {
$this->result = $this->calcResult();
}
return $this->result;
}
/**
* Возвращает флаг использования кода типа маркировки
* @return bool
*/
public function isUsePrefix()
{
return $this->usePrefix;
}
/**
* Устанавливает флаг использования кода типа маркировки
* @param bool $usePrefix Флаг использования кода типа маркировки
* @return ProductCode
*/
public function setUsePrefix($usePrefix)
{
$this->usePrefix = (bool)$usePrefix;
return $this;
}
/**
* Формирует тег 1162.
* @return string|null Сформированный тег 1162.
*/
public function calcResult()
{
$result = '';
if (!$this->validate()) {
return $result;
}
if ($this->isUsePrefix()) {
$result = $this->getPrefix() ?: self::PREFIX_DATA_MATRIX;
}
$result .= $this->numToHex($this->getGtin());
$result .= $this->strToHex($this->getSerial());
return $this->chunkStr($result);
}
/**
* Устанавливает prefix и usePrefix в зависимости от входящего параметра
* @param mixed $usePrefix Код типа маркировки или bool
*/
private function preparePrefix($usePrefix)
{
if ($usePrefix) {
$this->setUsePrefix(true);
if (is_string($usePrefix) || is_int($usePrefix)) {
$this->setPrefix($usePrefix);
} else {
$this->setPrefix(self::PREFIX_DATA_MATRIX);
}
} else {
$this->setUsePrefix(false);
$this->setPrefix(null);
}
}
/**
* Извлекает необходимые данные из строки, расшифрованной из QR-кода и устанавливает соответствующие свойства.
* Возвращает результат в виде bool
* @param string $codeDataMatrix Строки, расшифрованная из QR-кода
* @return false
*/
private function parseCodeMatrixData($codeDataMatrix)
{
$string = preg_replace('#91(.+)92(.+)#i', '', $codeDataMatrix);
preg_match('#01(\d{14})21(.+)#i', $string, $matches);
$this->setGtin(!empty($matches[1]) ? $matches[1] : null);
$this->setSerial(!empty($matches[2]) ? $matches[2] : null);
return $this->validate();
}
/**
* Проверяет заполненность необходимых свойств
* @return bool
*/
public function validate()
{
return $this->getGtin() && $this->getSerial();
}
/**
* Разбивает пробелами строку на пары символов и переводит в верхний регистр
* @param string $string Подготовленная к разбиению строка
* @return string
*/
private function chunkStr($string)
{
return strtoupper(trim(chunk_split($string, 2, ' ')));
}
/**
* Переводит десятичное число в шестнадцатеричный вид и дополняет нулями до 12 символов слева
* @param string $string Входящее число (Глобальный номер товарной продукции)
* @return string
*/
private function numToHex($string)
{
return str_pad($this->base_convert($string), 12, '0', STR_PAD_LEFT);
}
/**
* Переводит число из одной системы исчисления в другую
* Замена dechex() для 32-битных версии PHP
*
* @param string $numString
* @param int $fromBase
* @param int $toBase
* @return string
*/
private function base_convert($numString, $fromBase=10, $toBase=16)
{
$chars = "0123456789abcdefghijklmnopqrstuvwxyz";
$toString = substr($chars, 0, $toBase);
$length = strlen($numString);
$result = '';
$number = array();
for ($i = 0; $i < $length; $i++) {
$number[$i] = strpos($chars, substr($numString, $i, 1));
}
do {
$divide = 0;
$newLen = 0;
for ($i = 0; $i < $length; $i++) {
$divide = $divide * $fromBase + $number[$i];
if ($divide >= $toBase) {
$number[$newLen++] = (int)($divide / $toBase);
$divide = $divide % $toBase;
} elseif ($newLen > 0) {
$number[$newLen++] = 0;
}
}
$length = $newLen;
$result = substr($toString, $divide, 1) . $result;
} while ($newLen != 0);
return $result;
}
/**
* Переводит строку в шестнадцатеричный вид
* @param string $string Входящая строка (Серийный номер товара)
* @return string
*/
private function strToHex($string)
{
$hex = '';
for ($i = 0; $i < strlen($string); $i++) {
$ord = ord($string[$i]);
$hexCode = dechex($ord);
$hex .= substr('0' . $hexCode, -2);
}
return $hex;
}
/**
* Переводит строку из шестнадцатеричного вида в обычный
* Нужен для тестирования
* @param string $hex Входящая строка в шестнадцатеричном виде
* @return string
*/
private function hexToStr($hex)
{
$string = '';
for ($i = 0; $i < strlen($hex) - 1; $i += 2) {
$string .= chr(hexdec($hex[$i] . $hex[$i + 1]));
}
return $string;
}
/**
* Приводит объект к строке
* @return string
*/
public function __toString()
{
return $this->getResult();
}
}
@@ -0,0 +1,166 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Helpers;
/**
* Класс хэлпера для генерации случайных значений, используется в тестах
*
* @package YooKassa\Helpers
*/
class Random
{
/**
* Возвращает рандомное целое число. По умолчанию возвращает число от нуля до PHP_INT_MAX.
* @param int|null $min Минимально возможное значение
* @param int|null $max Максимально возможное значение
* @param bool $useBest Использовать ли функцию random_int если она доступна
* @return int Рандомное целое число
* @throws \Exception
*/
public static function int($min = null, $max = null, $useBest = true)
{
if ($min === null) {
$min = 0;
}
if ($max === null) {
$max = PHP_INT_MAX;
}
if (function_exists('random_int') && $useBest) {
return random_int($min, $max);
} else {
return mt_rand($min, $max);
}
}
/**
* Возвращает рандомное число с плавающей точкой. По умолчанию возвращает значение в промежутке от нуля до едениы.
* @param float|null $min Минимально возможное значение
* @param float|null $max Максимально возможное значение
* @param bool $useBest Использовать ли функцию random_int если она доступна
* @return float Рандомное число с плавающей точкой
* @throws \Exception
*/
public static function float($min = null, $max = null, $useBest = true)
{
$random = self::int(null, null, $useBest) / PHP_INT_MAX;
if ($min === null) {
$min = 0.0;
}
if ($max === null) {
return $random + $min;
}
return ($random * ($max - $min)) + $min;
}
/**
* Возвращает строку из рандомных символов
* @param int $length Длина возвращаемой строки, или минимальная длина, если передан парамтр $maxLength
* @param int|null $maxLength Если параметр не равен null, возвращает сроку длиной от $length до $maxLength
* @param string|array|null $characters Строка или массив используемых в строке символов
* @param bool $useBest Использовать ли функцию random_int если она доступна
* @return string Строка, состоящая из рандомных символов
* @throws \Exception
*/
public static function str($length, $maxLength = null, $characters = null, $useBest = true)
{
$result = '';
if ($maxLength !== null) {
if (is_string($maxLength)) {
$characters = $maxLength;
} else {
$length = self::int($length, $maxLength, $useBest);
}
}
if ($characters === null) {
for ($i = 0; $i < $length; $i++) {
$chr = chr(self::int(32, 125, $useBest));
$result .= $chr;
}
} else {
for ($i = 0; $i < $length; $i++) {
$chr = $characters[self::int(0, strlen($characters) - 1, $useBest)];
$result .= $chr;
}
}
return $result;
}
/**
* Возвращает строку, состоящую из символов '0123456789abcdef'
* @param int $length Длина возвращаемой строки
* @param bool $useBest Использовать ли функцию random_int если она доступна
* @return string Строка, состоящая из рандомных символов
* @throws \Exception
*/
public static function hex($length, $useBest = true)
{
return self::str($length, '0123456789abcdef', $useBest);
}
/**
* Возвращает рандомную последовательность байт
* @param int $length Длина возвращаемой строки
* @param bool $useBest Использовать ли функцию random_int если она доступна
* @return string Строка, состоящая из рандомных символов
* @throws \Exception
*/
public static function bytes($length, $useBest = true)
{
if (function_exists('random_bytes') && $useBest) {
$result = random_bytes($length);
} else {
$result = '';
for ($i = 0; $i < $length; $i++) {
$chr = chr(self::int(0, 255));
$result .= $chr;
}
}
return $result;
}
/**
* Возвращает рандомное значение из переданного массива
* @param array $values Массив источник данных
* @param bool $useBest Использовать ли функцию random_int если она доступна
* @return mixed Случайное значение из переданного массива
* @throws \Exception
*/
public static function value(array $values, $useBest = true)
{
return $values[self::int(0, count($values) - 1, $useBest)];
}
/**
* Возвращает рандомное буллево значение
* @return bool Либо true либо false, одно из двух
* @throws \Exception
*/
public static function bool()
{
return self::int(0, 1) === 1;
}
}
@@ -0,0 +1,63 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Helpers;
class RawHeadersParser
{
public static function parse($rawHeaders)
{
$headers = array();
$key = '';
foreach (explode("\n", $rawHeaders) as $headerRow) {
if (trim($headerRow) === '') {
break;
}
$headerArray = explode(':', $headerRow, 2);
if (isset($headerArray[1])) {
if (!isset($headers[$headerArray[0]])) {
$headers[trim($headerArray[0])] = trim($headerArray[1]);
} elseif (is_array($headers[$headerArray[0]])) {
$headers[trim($headerArray[0])] = array_merge($headers[trim($headerArray[0])], array(trim($headerArray[1])));
} else {
$headers[trim($headerArray[0])] = array_merge(array($headers[trim($headerArray[0])]), array(trim($headerArray[1])));
}
$key = $headerArray[0];
} else {
if (substr($headerArray[0], 0, 1) === "\t") {
$headers[$key] .= "\r\n\t" . trim($headerArray[0]);
} elseif (!$key) {
$headers[0] = trim($headerArray[0]);
}
}
}
return $headers;
}
}
@@ -0,0 +1,58 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Helpers;
/**
* Класс объекта, кастящегося в строку, используется только в тестах
*
* @package YooKassa\Helpers
*/
class StringObject
{
/**
* @var string Значение, возвращаемое методом __toString
*/
private $value;
/**
* StringObject constructor.
* @param string $value
*/
public function __construct($value)
{
$this->value = (string)$value;
}
/**
* Возвращает строковое значение текущего объекта
* @return string Строковое представление объекта
*/
public function __toString()
{
return $this->value;
}
}
@@ -0,0 +1,126 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Helpers;
use DateTime;
use Exception;
/**
* Класс хэлпер для преобразования типов значений
*
* @package YooKassa\Helpers
*/
class TypeCast
{
/**
* Проверяет может ли переданное значение быть преобразовано в строку
* @param mixed $value Проверяемое значение
* @return bool True если значение преобразовать в строку можно, false если нет
*/
public static function canCastToString($value)
{
if (is_scalar($value)) {
return !is_bool($value) && !is_resource($value);
} elseif (is_object($value)) {
return method_exists($value, '__toString');
}
return false;
}
/**
* Проверяет можно ли преобразовать переданное значение в строку из перечисления
* @param mixed $value Проверяемое значение
* @return bool True если значение преобразовать в строку можно, false если нет
*/
public static function canCastToEnumString($value)
{
if (is_string($value) && $value !== '') {
return true;
} elseif (is_object($value)) {
return method_exists($value, '__toString');
}
return false;
}
/**
* Проверяет, можно ли преобразовать переданное значение в объект даты-времени
* @param mixed $value Провеяремое значение
* @return bool True если значение можно преобразовать в объект даты, false если нет
*/
public static function canCastToDateTime($value)
{
if ($value instanceof DateTime) {
return true;
} elseif (is_numeric($value)) {
$value = (float)$value;
return $value >= 0;
} elseif (is_string($value)) {
return $value !== '';
} elseif (is_object($value)) {
return method_exists($value, '__toString') && ((string)$value) !== '';
}
return false;
}
/**
* Преобразует переданне значение в объект типа \DateTime
* @param string|int|DateTime $value Преобразуемое значение
* @return DateTime|null Объект типа \DateTime или null если при парсинг даты не удался
* @throws Exception
*/
public static function castToDateTime($value)
{
if ($value instanceof DateTime) {
return clone $value;
}
if (is_numeric($value)) {
$date = new DateTime();
$date->setTimestamp((int)$value);
} elseif (is_string($value) || (is_object($value) && method_exists($value, '__toString'))) {
$date = date_create((string)$value);
if ($date === false) {
$date = null;
}
} else {
$date = null;
}
return $date;
}
/**
* Проверяет можно ли преобразовать переданное значение в буллево значение
* @param mixed $value Проверяемое значение
* @return bool True если значение качтится в bool, false если нет
*/
public static function canCastToBoolean($value)
{
if (is_numeric($value) || is_bool($value)) {
return true;
}
return false;
}
}
@@ -0,0 +1,23 @@
<?php
namespace YooKassa\Helpers;
class UUID
{
/**
* @return string
* @throws \Exception
*/
public static function v4()
{
$hexData = bin2hex(Random::bytes(16));
$parts = str_split($hexData, 4);
$parts[3] = '4' . substr($parts[3], 1);
$parts[4] = '8' . substr($parts[4], 1);
return vsprintf('%s%s-%s-%s-%s-%s%s%s',
$parts
);
}
}
@@ -0,0 +1,256 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
/**
* Class Airline
*/
class Airline extends AbstractObject implements AirlineInterface
{
/**
* @var string Номер бронирования. Обязателен на этапе создания платежа.
*/
private $_bookingReference;
/**
* @var string Уникальный номер билета. Обязателен на этапе подтверждения платежа
*/
private $_ticketNumber;
/**
* @var PassengerInterface[]
*/
private $_passengers;
/**
* @var LegInterface[]
*/
private $_legs;
/**
* @inheritdoc
*/
public function getBookingReference()
{
return $this->_bookingReference;
}
/**
* @param string $value
*/
public function setBookingReference($value)
{
if ($value === null || $value === '') {
$this->_bookingReference = null;
} elseif (!TypeCast::canCastToString($value)) {
throw new InvalidPropertyValueTypeException('Invalid booking reference value type', 0,
'airline.booking_reference');
} elseif (mb_strlen((string)$value, 'utf-8') > 20) {
throw new InvalidPropertyValueException('Invalid booking reference value: "'.$value.'"', 0,
'airline.booking_reference');
} else {
$this->_bookingReference = (string)$value;
}
}
/**
* @inheritdoc
*/
public function getTicketNumber()
{
return $this->_ticketNumber;
}
/**
* @param string $value
*/
public function setTicketNumber($value)
{
if ($value === null || $value === '') {
$this->_ticketNumber = null;
} elseif (!TypeCast::canCastToString($value)) {
throw new InvalidPropertyValueTypeException('Invalid ticket number value type', 0,
'airline.ticket_number');
} elseif (!preg_match('/^[0-9]{1,150}$/', (string)$value)) {
throw new InvalidPropertyValueException('Invalid ticket_number value: "'.$value.'"', 0,
'airline.ticket_number');
} else {
$this->_ticketNumber = (string)$value;
}
}
/**
* @inheritdoc
*/
public function getPassengers()
{
return $this->_passengers;
}
/**
* @param array|PassengerInterface[] $value
*/
public function setPassengers($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty passengers value in airline', 0, 'airline.passengers');
}
if (!is_array($value) && !($value instanceof \Traversable)) {
throw new InvalidPropertyValueTypeException(
'Invalid passengers value type in airline', 0, 'airline.passengers', $value
);
}
$this->_passengers = array();
foreach ($value as $key => $val) {
try {
$this->addPassenger($val);
} catch (InvalidPropertyValueTypeException $exception) {
throw new InvalidPropertyValueTypeException(
'Invalid passenger value type in airline', 0, 'airline.passengers['.$key.']', $val
);
}
}
}
/**
* @param array|PassengerInterface $value
*/
public function addPassenger($value)
{
if ($value instanceof PassengerInterface) {
$this->_passengers[] = $value;
} elseif (is_array($value)) {
$passenger = new Passenger();
$passenger->fromArray($value);
$this->_passengers[] = $passenger;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid passenger value type in airline', 0
);
}
}
/**
* @inheritdoc
*/
public function getLegs()
{
return $this->_legs;
}
/**
* @param array|LegInterface[] $value
*/
public function setLegs($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty legs value in airline', 0, 'airline.passengers');
}
if (!is_array($value) && !($value instanceof \Traversable)) {
throw new InvalidPropertyValueTypeException(
'Invalid legs value type in airline', 0, 'airline.legs', $value
);
}
$this->_legs = array();
foreach ($value as $key => $val) {
try {
$this->addLeg($val);
} catch (InvalidPropertyValueTypeException $exception) {
throw new InvalidPropertyValueTypeException(
'Invalid legs value type in airline', 0, 'airline.legs['.$key.']', $val
);
}
}
}
/**
* @param array|LegInterface $value
*/
public function addLeg($value)
{
if ($value instanceof LegInterface) {
$this->_legs[] = $value;
} elseif (is_array($value)) {
$leg = new Leg();
$leg->fromArray($value);
$this->_legs[] = $leg;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid passenger value type in airline', 0
);
}
}
/**
* Првоерка на наличие данных
* @return bool
*/
public function notEmpty()
{
return $this->_legs || $this->_passengers || $this->_ticketNumber || $this->_bookingReference;
}
/**
* @inheritdoc
*/
public function fromArray($sourceArray)
{
if (is_array($sourceArray['passengers']) && !empty($sourceArray['passengers'])) {
$sourceArray['passengers'] = array_map(function ($passengerData) {
if (is_array($passengerData)) {
$passenger = new Passenger();
$passenger->fromArray($passengerData);
return $passenger;
} elseif ($passengerData instanceof PassengerInterface) {
return $passengerData;
}
}, $sourceArray['passengers']);
}
if (is_array($sourceArray['legs']) && !empty($sourceArray['legs'])) {
$sourceArray['legs'] = array_map(function ($legData) {
if (is_array($legData)) {
$leg = new Leg();
$leg->fromArray($legData);
return $leg;
} elseif ($legData instanceof LegInterface) {
return $legData;
}
}, $sourceArray['legs']);
}
parent::fromArray($sourceArray);
}
}
@@ -0,0 +1,59 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
interface AirlineInterface
{
/**
* Номер бронирования. Обязателен на этапе создания платежа.
*
* @return string
*/
public function getBookingReference();
/**
* Уникальный номер билета. Обязателен на этапе подтверждения платежа
*
* @return string
*/
public function getTicketNumber();
/**
* Список объектов-контейнеров с данными пассажиров
*
* @return PassengerInterface[]
*/
public function getPassengers();
/**
* Список объектов-контейнеров с данными о маршруте
*
* @return LegInterface[]
*/
public function getLegs();
}
@@ -0,0 +1,67 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
/**
* Interface AmountInterface
*
* @package YooKassa\Model
*
* @property-read string $value Сумма
* @property-read string $currency Код валюты
*/
interface AmountInterface
{
/**
* Возвращает значение суммы
* @return string Сумма
*/
public function getValue();
/**
* @param $value
*/
public function setValue($value);
/**
* Возвращает сумму в копейках в виде целого числа
* @return int Сумма в копейках/центах
*/
public function getIntegerValue();
/**
* Возвращает валюту
* @return string Код валюты
*/
public function getCurrency();
/**
* Устанавливает код валюты
* @param string $value Код валюты
*/
public function setCurrency($value);
}
@@ -0,0 +1,127 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
/**
* AuthorizationDetails - Данные об авторизации платежа
*
* @property $rrn Retrieval Reference Number — уникальный идентификатор транзакции в системе эмитента
* @property string $authCode Код авторизации банковской карты
*/
class AuthorizationDetails extends AbstractObject implements AuthorizationDetailsInterface
{
/**
* @var string Уникальный идентификатор транзакции
*/
private $_rrn = '';
/**
* @var string Код авторизации банковской карты
*/
private $_authCode = '';
/**
* @param string|null $rrn Уникальный идентификатор транзакции
* @param string|null $authCode Код авторизации банковской карты
*/
public function __construct($rrn = null, $authCode = null)
{
if ($rrn !== null) {
$this->setRrn($rrn);
}
if ($authCode !== null) {
$this->setAuthCode($authCode);
}
}
/**
* Возвращает уникальный идентификатор транзакции
*
* @return string|null Уникальный идентификатор транзакции
*/
public function getRrn()
{
return $this->_rrn;
}
/**
* Возвращает код авторизации банковской карты
*
* @return string|null Код авторизации банковской карты
*/
public function getAuthCode()
{
return $this->_authCode;
}
/**
* @return array
*/
public function jsonSerialize()
{
return array(
'rrn' => $this->_rrn,
'auth_code' => $this->_authCode,
);
}
/**
* Устанавливает уникальный идентификатор транзакции
* @param $value
*/
public function setRrn($value)
{
if ($value === null || $value === '') {
$this->_rrn = $value;
} elseif (TypeCast::canCastToEnumString($value)) {
$this->_rrn = (string)$value;
} else {
throw new InvalidPropertyValueTypeException('Invalid rrn value type', 0,
'authorization_details.rrn', $value);
}
}
/**
* Устанавливает код авторизации банковской карты
* @param $value
*/
public function setAuthCode($value)
{
if ($value === null || $value === '') {
$this->_authCode = $value;
} elseif (TypeCast::canCastToEnumString($value)) {
$this->_authCode = (string)$value;
} else {
throw new InvalidPropertyValueTypeException('Invalid auth_code value type', 0,
'authorization_details.auth_code', $value);
}
}
}
@@ -0,0 +1,51 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
/**
* Interface AuthorizationDetailsInterface - Данные об авторизации платежа
*
* @package YooKassa\Model
*
* @property-read string $rrn Retrieval Reference Number — уникальный идентификатор транзакции в системе эмитента
* @property-read string $authCode Код авторизации банковской карты
*/
interface AuthorizationDetailsInterface
{
/**
* Возвращает Retrieval Reference Number — уникальный идентификатор транзакции в системе эмитента
* @return string|null Уникальный идентификатор транзакции
*/
function getRrn();
/**
* Возвращает код авторизации банковской карты
* @return string|null Код авторизации банковской карты
*/
function getAuthCode();
}
@@ -0,0 +1,127 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
/**
* CancellationDetails - Комментарий к отмене платежа
*
* @property string $party Инициатор отмены платежа
* @property string $reason Причина отмены платежа
*/
class CancellationDetails extends AbstractObject implements CancellationDetailsInterface
{
/**
* @var string Инициатор отмены платежа
*/
private $_party = '';
/**
* @var string Причина отмены платежа
*/
private $_reason = '';
/**
* CancellationDetails constructor.
* @param string|null $party Инициатор отмены платежа
* @param string|null $reason Причина отмены платежа
*/
public function __construct($party = null, $reason = null)
{
if ($party !== null) {
$this->setParty($party);
}
if ($reason !== null) {
$this->setReason($reason);
}
}
/**
* Возвращает участника процесса платежа, который принял решение об отмене транзакции
*
* @return string Инициатор отмены платежа
*/
public function getParty()
{
return $this->_party;
}
/**
* Возвращает причину отмены платежа
*
* @return string Причина отмены платежа
*/
public function getReason()
{
return $this->_reason;
}
/**
* @return array
*/
public function jsonSerialize()
{
return array(
'party' => $this->_party,
'reason' => $this->_reason,
);
}
/**
* Устанавливает участника процесса платежа, который принял решение об отмене транзакции
* @param $value
*/
public function setParty($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty party value', 0, 'cancellation_details.party');
} elseif (!TypeCast::canCastToString($value)) {
throw new InvalidPropertyValueTypeException('Invalid party value type', 0, 'cancellation_details.party', $value);
} else {
$this->_party = strtolower((string)$value);
}
}
/**
* Устанавливает причину отмены платежа
* @param $value
*/
public function setReason($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty reason value', 0, 'cancellation_details.reason');
} elseif (!TypeCast::canCastToString($value)) {
throw new InvalidPropertyValueTypeException('Invalid reason value type', 0, 'cancellation_details.reason');
} else {
$this->_reason = strtolower((string)$value);
}
}
}
@@ -0,0 +1,51 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
/**
* Interface CancellationDetailsInterface
*
* @package YooKassa\Model
*
* @property-read string $party Участник процесса платежа, который принял решение об отмене транзакции.
* @property-read string $reason Причина отмены платежа.
*/
interface CancellationDetailsInterface
{
/**
* Возвращает участника процесса платежа, который принял решение об отмене транзакции
* @return string Участник процесса платежа
*/
function getParty();
/**
* Возвращает причину отмены платежа
* @return string Причина отмены платежа
*/
function getReason();
}
@@ -0,0 +1,57 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractEnum;
/**
* CancellationDetailsPartyCode - Возможные инициаторы отмены платежа
*/
class CancellationDetailsPartyCode extends AbstractEnum
{
/**
* Продавец товаров и услуг
*/
const MERCHANT = 'merchant';
/**
* ЮKassa
*/
const YOO_KASSA = 'yoo_kassa';
/**
* «Внешние» участники платежного процесса (например, эмитент, сторонний платежный сервис)
*/
const PAYMENT_NETWORK = 'payment_network';
protected static $validValues = array(
self::MERCHANT => true,
self::YOO_KASSA => true,
self::PAYMENT_NETWORK => true,
);
}
@@ -0,0 +1,77 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractEnum;
/**
* CancellationDetailsReasonCode - Возможные причины отмены платежа
*/
class CancellationDetailsReasonCode extends AbstractEnum
{
const THREE_D_SECURE_FAILED = '3d_secure_failed';
const CALL_ISSUER = 'call_issuer';
const CARD_EXPIRED = 'card_expired';
const COUNTRY_FORBIDDEN = 'country_forbidden';
const FRAUD_SUSPECTED = 'fraud_suspected';
const GENERAL_DECLINE = 'general_decline';
const IDENTIFICATION_REQUIRED = 'identification_required';
const INSUFFICIENT_FUNDS = 'insufficient_funds';
const INVALID_CARD_NUMBER = 'invalid_card_number';
const INVALID_CSC = 'invalid_csc';
const ISSUER_UNAVAILABLE = 'issuer_unavailable';
const PAYMENT_METHOD_LIMIT_EXCEEDED = 'payment_method_limit_exceeded';
const PAYMENT_METHOD_RESTRICTED = 'payment_method_restricted';
const PERMISSION_REVOKED = 'permission_revoked';
const INTERNAL_TIMEOUT = 'internal_timeout';
const CANCELED_BY_MERCHANT = 'canceled_by_merchant';
const PAYMENT_EXPIRED = 'payment_expired';
const EXPIRED_ON_CONFIRMATION = 'expired_on_confirmation';
const EXPIRED_ON_CAPTURE = 'expired_on_capture';
protected static $validValues = array(
self::THREE_D_SECURE_FAILED => true,
self::CALL_ISSUER => true,
self::CARD_EXPIRED => true,
self::COUNTRY_FORBIDDEN => true,
self::FRAUD_SUSPECTED => true,
self::GENERAL_DECLINE => true,
self::IDENTIFICATION_REQUIRED => true,
self::INSUFFICIENT_FUNDS => true,
self::INVALID_CARD_NUMBER => true,
self::INVALID_CSC => true,
self::ISSUER_UNAVAILABLE => true,
self::PAYMENT_METHOD_LIMIT_EXCEEDED => true,
self::PAYMENT_METHOD_RESTRICTED => true,
self::PERMISSION_REVOKED => true,
self::INTERNAL_TIMEOUT => true,
self::CANCELED_BY_MERCHANT => true,
self::PAYMENT_EXPIRED => true,
self::EXPIRED_ON_CONFIRMATION => true,
self::EXPIRED_ON_CAPTURE => true,
);
}
@@ -0,0 +1,83 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Confirmation;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\ConfirmationType;
/**
* Способ подтверждения платежа.
*
* @property-read string $type
*
* @method getConfirmationUrl
* @method getConfirmationToken
* @method getConfirmationData
*/
abstract class AbstractConfirmation extends AbstractObject
{
/**
* @var string
*/
private $_type;
/**
* @return string
*/
public function getType()
{
return $this->_type;
}
/**
* @param string $value
*/
protected function _setType($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty value for "type" parameter in Confirmation', 0, 'confirmation.type'
);
} elseif (TypeCast::canCastToEnumString($value)) {
if (ConfirmationType::valueExists($value)) {
$this->_type = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid value for "type" parameter in Confirmation', 0, 'confirmation.type', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid value type for "type" parameter in Confirmation', 0, 'confirmation.type', $value
);
}
}
}
@@ -0,0 +1,42 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Confirmation;
use YooKassa\Model\ConfirmationType;
/**
* Сценарий при котором необходимо получить одноразовый код от плательщика для подтверждения платежа
*
* @package YooKassa\Model\Confirmation
*/
class ConfirmationCodeVerification extends AbstractConfirmation
{
public function __construct()
{
$this->_setType(ConfirmationType::CODE_VERIFICATION);
}
}
@@ -0,0 +1,42 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Confirmation;
use YooKassa\Model\ConfirmationType;
/**
* Сценарий при котором необходимо направить плательщика в приложение партнера
*
* @package YooKassa\Model\Confirmation
*/
class ConfirmationDeepLink extends AbstractConfirmation
{
public function __construct()
{
$this->_setType(ConfirmationType::DEEPLINK);
}
}
@@ -0,0 +1,68 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Confirmation;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\ConfirmationType;
/**
* @property string $confirmationToken Токен для checkout.js
*/
class ConfirmationEmbedded extends AbstractConfirmation
{
private $confirmationToken;
public function __construct()
{
$this->_setType(ConfirmationType::EMBEDDED);
}
/**
* @return string
*/
public function getConfirmationToken()
{
return $this->confirmationToken;
}
/**
* @param string $confirmationToken
*/
public function setConfirmationToken($confirmationToken)
{
if ($confirmationToken === null || $confirmationToken === '') {
$this->confirmationToken = null;
} elseif (TypeCast::canCastToString($confirmationToken)) {
$this->confirmationToken = (string)$confirmationToken;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid confirmationToken value type', 0, 'confirmationEmbedded.confirmationToken', $confirmationToken
);
}
}
}
@@ -0,0 +1,43 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Confirmation;
use YooKassa\Model\ConfirmationType;
/**
* Сценарий при котором необходимо ожидать пока пользователь самостоятельно подтвердит платеж. Например,
* пользователь подтверждает платеж ответом на SMS или в приложении партнера
*
* @package YooKassa\Model\Confirmation
*/
class ConfirmationExternal extends AbstractConfirmation
{
public function __construct()
{
$this->_setType(ConfirmationType::EXTERNAL);
}
}
@@ -0,0 +1,92 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Confirmation;
use YooKassa\Model\ConfirmationType;
/**
* Class ConfirmationFactory
*
* @package YooKassa\Model\Confirmation
*/
class ConfirmationFactory
{
private $typeClassMap = array(
ConfirmationType::CODE_VERIFICATION => 'ConfirmationCodeVerification',
ConfirmationType::DEEPLINK => 'ConfirmationDeepLink',
ConfirmationType::EXTERNAL => 'ConfirmationExternal',
ConfirmationType::REDIRECT => 'ConfirmationRedirect',
ConfirmationType::EMBEDDED => 'ConfirmationEmbedded',
ConfirmationType::QR => 'ConfirmationQr',
);
/**
* @param string $type
*
* @return AbstractConfirmation
*/
public function factory($type)
{
if (!is_string($type)) {
throw new \InvalidArgumentException('Invalid confirmation value in confirmation factory');
}
if (!array_key_exists($type, $this->typeClassMap)) {
throw new \InvalidArgumentException('Invalid confirmation value type "'.$type.'"');
}
$className = __NAMESPACE__.'\\'.$this->typeClassMap[$type];
return new $className();
}
/**
* @param array $data
* @param string|null $type
*
* @return AbstractConfirmation
*/
public function factoryFromArray(array $data, $type = null)
{
if ($type === null) {
if (array_key_exists('type', $data)) {
$type = $data['type'];
unset($data['type']);
} else {
throw new \InvalidArgumentException(
'Parameter type not specified in ConfirmationFactory.factoryFromArray()'
);
}
}
$confirmation = $this->factory($type);
foreach ($data as $key => $value) {
if ($confirmation->offsetExists($key)) {
$confirmation->offsetSet($key, $value);
}
}
return $confirmation;
}
}
@@ -0,0 +1,69 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Confirmation;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\ConfirmationType;
/**
* @property string $confirmationData URL для создания QR-кода
* @property string $confirmation_data URL для создания QR-кода
*/
class ConfirmationQr extends AbstractConfirmation
{
private $_confirmationData;
public function __construct()
{
$this->_setType(ConfirmationType::QR);
}
/**
* @return string
*/
public function getConfirmationData()
{
return $this->_confirmationData;
}
/**
* @param string $confirmationData
*/
public function setConfirmationData($confirmationData)
{
if ($confirmationData === null || $confirmationData === '') {
$this->_confirmationData = null;
} elseif (TypeCast::canCastToString($confirmationData)) {
$this->_confirmationData = (string)$confirmationData;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid confirmationData value type', 0, 'confirmationQr.confirmationData', $confirmationData
);
}
}
}
@@ -0,0 +1,143 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Confirmation;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\ConfirmationType;
/**
* Сценарий, при котором необходимо отправить плательщика на веб-страницу ЮKassa или партнера для
* подтверждения платежа
*
* @property bool $enforce Требование принудительного подтверждения платежа покупателем, требование 3-D Secure для
* оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
* @property string $returnUrl URL на который вернется плательщик после подтверждения или отмены платежа на
* странице партнера.
* @property string $return_url URL на который вернется плательщик после подтверждения или отмены платежа на
* странице партнера.
* @property string $confirmationUrl URL на который необходимо перенаправить плательщика для подтверждения оплаты.
* @property string $confirmation_url URL на который необходимо перенаправить плательщика для подтверждения оплаты.
*/
class ConfirmationRedirect extends AbstractConfirmation
{
/**
* @var bool Требование принудительного подтверждения платежа покупателем, требование 3-D Secure для оплаты
* банковскими картами. По умолчанию определяется политикой платежной системы.
*/
private $_enforce;
/**
* @var string URL на который вернется плательщик после подтверждения или отмены платежа на странице партнера.
*/
private $_returnUrl;
/**
* @var string URL на который необходимо перенаправить плательщика для подтверждения оплаты.
*/
private $_confirmationUrl;
public function __construct()
{
$this->_setType(ConfirmationType::REDIRECT);
}
/**
* @return bool Требование принудительного подтверждения платежа покупателем, требование 3-D Secure для
* оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
*/
public function getEnforce()
{
return $this->_enforce;
}
/**
* @param bool $value Требование принудительного подтверждения платежа покупателем, требование 3-D Secure
* для оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
*/
public function setEnforce($value)
{
if ($value === null || $value === '') {
$this->_enforce = null;
} elseif (TypeCast::canCastToBoolean($value)) {
$this->_enforce = (bool)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid enforce value type', 0, 'confirmationRedirect.enforce', $value
);
}
}
/**
* @return string URL на который вернется плательщик после подтверждения или отмены платежа на странице партнера.
*/
public function getReturnUrl()
{
return $this->_returnUrl;
}
/**
* @param string $value URL на который вернется плательщик после подтверждения или отмены платежа на
* странице партнера.
*/
public function setReturnUrl($value)
{
if ($value === null || $value === '') {
$this->_returnUrl = null;
} elseif (TypeCast::canCastToString($value)) {
$this->_returnUrl = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid returnUrl value type', 0, 'confirmationRedirect.returnUrl', $value
);
}
}
/**
* @return string URL на который необходимо перенаправить плательщика для подтверждения оплаты.
*/
public function getConfirmationUrl()
{
return $this->_confirmationUrl;
}
/**
* @param string $value URL на который необходимо перенаправить плательщика для подтверждения оплаты.
*/
public function setConfirmationUrl($value)
{
if ($value === null || $value === '') {
$this->_confirmationUrl = null;
} elseif (TypeCast::canCastToString($value)) {
$this->_confirmationUrl = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid confirmationUrl value type', 0, 'confirmationRedirect.confirmationUrl', $value
);
}
}
}
@@ -0,0 +1,112 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\ConfirmationAttributes;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\ConfirmationType;
/**
* Способ подтверждения платежа
*
* @property-read string $type
*/
abstract class AbstractConfirmationAttributes extends AbstractObject
{
/**
* @var string
*/
private $_type;
/**
* @var string
*/
private $_locale;
/**
* @return string
*/
public function getType()
{
return $this->_type;
}
/**
* @param string $value
*/
protected function _setType($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty value for "type" parameter in ConfirmationAttributes', 0, 'confirmationAttributes.type'
);
} elseif (TypeCast::canCastToEnumString($value)) {
if (ConfirmationType::valueExists($value)) {
$this->_type = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid value for "type" parameter in ConfirmationAttributes', 0, 'confirmationAttributes.type', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid value type for "type" parameter in ConfirmationAttributes', 0, 'confirmationAttributes.type', $value
);
}
}
/**
* @return string
*/
public function getLocale()
{
return $this->_locale;
}
/**
* @param string $value
*/
public function setLocale($value)
{
if ($value === null || $value === '') {
$this->_locale = null;
} elseif (!TypeCast::canCastToString($value)) {
throw new InvalidPropertyValueTypeException(
'Invalid value type for "locale" parameter in ConfirmationAttributes', 0, 'confirmationAttributes.locale', $value
);
} elseif (!preg_match('/^[a-z]{2}_[A-Z]{2}$/', (string)$value)) {
throw new InvalidPropertyValueException(
'Invalid value type for "locale" parameter in ConfirmationAttributes', 0, 'confirmationAttributes.locale', $value
);
} else {
$this->_locale = (string)$value;
}
}
}
@@ -0,0 +1,42 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\ConfirmationAttributes;
use YooKassa\Model\ConfirmationType;
/**
* Сценарий при котором необходимо получить одноразовый код от плательщика для подтверждения платежа
*
* @package YooKassa\Model\ConfirmationAttributes
*/
class ConfirmationAttributesCodeVerification extends AbstractConfirmationAttributes
{
public function __construct()
{
$this->_setType(ConfirmationType::CODE_VERIFICATION);
}
}
@@ -0,0 +1,42 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\ConfirmationAttributes;
use YooKassa\Model\ConfirmationType;
/**
* Сценарий при котором необходимо направить плательщика в приложение партнера
*
* @package YooKassa\Model\ConfirmationAttributes
*/
class ConfirmationAttributesDeepLink extends AbstractConfirmationAttributes
{
public function __construct()
{
$this->_setType(ConfirmationType::DEEPLINK);
}
}
@@ -0,0 +1,37 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\ConfirmationAttributes;
use YooKassa\Model\ConfirmationType;
class ConfirmationAttributesEmbedded extends AbstractConfirmationAttributes
{
public function __construct()
{
$this->_setType(ConfirmationType::EMBEDDED);
}
}
@@ -0,0 +1,42 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\ConfirmationAttributes;
use YooKassa\Model\ConfirmationType;
/**
* Сценарий при котором необходимо ожидать пока пользователь самостоятельно подтвердит платеж. Например,
* пользователь подтверждает платеж ответом на SMS или в приложении партнера
* @package YooKassa\Model\ConfirmationAttributes
*/
class ConfirmationAttributesExternal extends AbstractConfirmationAttributes
{
public function __construct()
{
$this->_setType(ConfirmationType::EXTERNAL);
}
}
@@ -0,0 +1,92 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\ConfirmationAttributes;
use YooKassa\Model\ConfirmationType;
/**
* Class ConfirmationAttributesFactory
*
* @package YooKassa\Model\ConfirmationAttributes
*/
class ConfirmationAttributesFactory
{
private $typeClassMap = array(
ConfirmationType::CODE_VERIFICATION => 'ConfirmationAttributesCodeVerification',
ConfirmationType::DEEPLINK => 'ConfirmationAttributesDeepLink',
ConfirmationType::EXTERNAL => 'ConfirmationAttributesExternal',
ConfirmationType::REDIRECT => 'ConfirmationAttributesRedirect',
ConfirmationType::EMBEDDED => 'ConfirmationAttributesEmbedded',
ConfirmationType::QR => 'ConfirmationAttributesQr',
);
/**
* @param string $type
*
* @return AbstractConfirmationAttributes
*/
public function factory($type)
{
if (!is_string($type)) {
throw new \InvalidArgumentException('Invalid confirmation attributes value in confirmation factory');
}
if (!array_key_exists($type, $this->typeClassMap)) {
throw new \InvalidArgumentException('Invalid confirmation attributes value type "'.$type.'"');
}
$className = __NAMESPACE__.'\\'.$this->typeClassMap[$type];
return new $className();
}
/**
* @param array $data
* @param string|null $type
*
* @return AbstractConfirmationAttributes
*/
public function factoryFromArray(array $data, $type = null)
{
if ($type === null) {
if (array_key_exists('type', $data)) {
$type = $data['type'];
unset($data['type']);
} else {
throw new \InvalidArgumentException(
'Parameter type not specified in ConfirmationAttributesFactory.factoryFromArray()'
);
}
}
$confirmation = $this->factory($type);
foreach ($data as $key => $value) {
if ($confirmation->offsetExists($key)) {
$confirmation->offsetSet($key, $value);
}
}
return $confirmation;
}
}
@@ -0,0 +1,37 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\ConfirmationAttributes;
use YooKassa\Model\ConfirmationType;
class ConfirmationAttributesQr extends AbstractConfirmationAttributes
{
public function __construct()
{
$this->_setType(ConfirmationType::QR);
}
}
@@ -0,0 +1,109 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\ConfirmationAttributes;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\ConfirmationType;
/**
* @property bool $enforce Требование принудительного подтверждения платежа покупателем, требование 3-D Secure для
* оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
* @property string $returnUrl URL на который вернется плательщик после подтверждения или отмены платежа
* на странице партнера.
* @property string $return_url URL на который вернется плательщик после подтверждения или отмены платежа
* на странице партнера.
*/
class ConfirmationAttributesRedirect extends AbstractConfirmationAttributes
{
/**
* @var bool Требование принудительного подтверждения платежа покупателем, требование 3-D Secure для оплаты
* банковскими картами. По умолчанию определяется политикой платежной системы.
*/
private $_enforce;
/**
* @var string URL на который вернется плательщик после подтверждения или отмены платежа на странице партнера.
*/
private $_returnUrl;
public function __construct()
{
$this->_setType(ConfirmationType::REDIRECT);
}
/**
* @return bool Требование принудительного подтверждения платежа покупателем, требование 3-D Secure для
* оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
*/
public function getEnforce()
{
return $this->_enforce;
}
/**
* @param bool $value Требование принудительного подтверждения платежа покупателем, требование 3-D Secure
* для оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
*/
public function setEnforce($value)
{
if ($value === null || $value === '') {
$this->_enforce = null;
} elseif (TypeCast::canCastToBoolean($value)) {
$this->_enforce = (bool)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid enforce value type', 0, 'confirmationAttributesRedirect.enforce', $value
);
}
}
/**
* @return string URL на который вернется плательщик после подтверждения или отмены платежа на странице партнера.
*/
public function getReturnUrl()
{
return $this->_returnUrl;
}
/**
* @param string $value URL на который вернется плательщик после подтверждения или отмены платежа
* на странице партнера.
*/
public function setReturnUrl($value)
{
if ($value === null || $value === '') {
$this->_returnUrl = null;
} elseif (TypeCast::canCastToString($value)) {
$this->_returnUrl = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid returnUrl value type', 0, 'confirmationAttributesRedirect.returnUrl', $value
);
}
}
}
@@ -0,0 +1,59 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractEnum;
/**
* ConfirmationType - Тип пользовательского процесса подтверждения платежа
* |Код|Описание|
* --- | ---
* |redirect|Необходимо направить плательщика на страницу партнера|
* |external|Необходимо ождать пока плательщик самостоятельно подтвердит платеж|
* |deeplink|Необходимо направить плательщика в приложение партнера|
* |code_verification|Необходимо получить одноразовый код от плательщика для подтверждения платежа|
* |embedded|Необходимо получить токен для checkout.js|
* |qr|Необходимо получить QR-код|
*/
class ConfirmationType extends AbstractEnum
{
const REDIRECT = 'redirect';
const EXTERNAL = 'external';
const DEEPLINK = 'deeplink';
const CODE_VERIFICATION = 'code_verification';
const EMBEDDED = 'embedded';
const QR = 'qr';
protected static $validValues = array(
self::REDIRECT => true,
self::EXTERNAL => true,
self::DEEPLINK => false,
self::CODE_VERIFICATION => false,
self::EMBEDDED => true,
self::QR => true,
);
}
@@ -0,0 +1,53 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractEnum;
/**
* CurrencyCode - Код валюты, ISO-4217 3-alpha currency symbol
*/
class CurrencyCode extends AbstractEnum
{
const RUB = 'RUB';
const USD = 'USD';
const EUR = 'EUR';
const BYN = 'BYN';
const CNY = 'CNY';
const KZT = 'KZT';
const UAH = 'UAH';
protected static $validValues = array(
self::RUB => true,
self::USD => true,
self::EUR => true,
self::BYN => true,
self::CNY => true,
self::KZT => true,
self::UAH => true,
);
}
+129
View File
@@ -0,0 +1,129 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
class Leg extends AbstractObject implements LegInterface
{
const ISO8601 = 'Y-m-d';
/**
* @var string Трёхбуквенный IATA-код аэропорта вылета
*/
private $_departureAirport;
/**
* @var string Трёхбуквенный IATA-код аэропорта прилёта
*/
private $_destinationAirport;
/**
* @var string Дата вылета в формате YYYY-MM-DD ISO 8601:2004
*/
private $_departureDate;
/**
* @inheritdoc
*/
public function getDepartureAirport()
{
return $this->_departureAirport;
}
/**
* @param string $value
*/
public function setDepartureAirport($value)
{
if (!TypeCast::canCastToString($value)) {
throw new InvalidPropertyValueTypeException('Invalid departure_airport value type', 0,
'airline.departure_airport');
} elseif (!preg_match('/^[A-Z]{3}$/', (string)$value)) {
throw new InvalidPropertyValueException('Invalid departure_airport value: "'.$value.'"', 0,
'airline.departure_airport');
} else {
$this->_departureAirport = (string)$value;
}
}
/**
* @inheritdoc
*/
public function getDestinationAirport()
{
return $this->_destinationAirport;
}
/**
* @param string $value
*/
public function setDestinationAirport($value)
{
if (!TypeCast::canCastToString($value)) {
throw new InvalidPropertyValueTypeException('Invalid destination_airport value type', 0,
'airline.destination_airport');
} elseif (!preg_match('/^[A-Z]{3}$/', (string)$value)) {
throw new InvalidPropertyValueException('Invalid destination_airport value: "'.$value.'"', 0,
'airline.destination_airport');
} else {
$this->_destinationAirport = (string)$value;
}
}
/**
* @inheritdoc
*/
public function getDepartureDate()
{
return $this->_departureDate;
}
/**
* @param \DateTime|string $value
* @throws \Exception
*/
public function setDepartureDate($value)
{
if (TypeCast::canCastToDateTime($value)) {
$departureDate = TypeCast::castToDateTime($value);
if ($departureDate === null) {
throw new InvalidPropertyValueException(
'Invalid departure_date value in airline.legs', 0, 'airline.legs'
);
}
$this->_departureDate = $departureDate->format(self::ISO8601);
} else {
throw new InvalidPropertyValueTypeException(
'Invalid departure_date value type in airline.legs', 0, 'airline.legs'
);
}
}
}
@@ -0,0 +1,45 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
interface LegInterface
{
/**
* @return string Трёхбуквенный IATA-код аэропорта вылета
*/
public function getDepartureAirport();
/**
* @return string Трёхбуквенный IATA-код аэропорта прилёта
*/
public function getDestinationAirport();
/**
* @return string Дата вылета в формате YYYY-MM-DD ISO 8601:2004
*/
public function getDepartureDate();
}
@@ -0,0 +1,59 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractObject;
/**
* Metadata - Метаданные платежа указанные мерчантом.
* Мерчант может добавлять произвольные данные к платежам в виде набора пар ключ-значение.
* Имена ключей уникальны.
*
*/
class Metadata extends AbstractObject implements \IteratorAggregate, \Countable
{
public function toArray()
{
return $this->getUnknownProperties();
}
/**
* @return \Iterator
*/
public function getIterator()
{
return new \ArrayIterator($this->getUnknownProperties());
}
/**
* @return int
*/
public function count()
{
return count($this->getUnknownProperties());
}
}
@@ -0,0 +1,224 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
/**
* MonetaryAmount - Сумма определенная в валюте
*
* @property string $value Сумма
* @property string $currency Код валюты
*/
class MonetaryAmount extends AbstractObject implements AmountInterface
{
/**
* @var int Сумма
*/
private $_value = 0;
/**
* @var string Код валюты
*/
private $_currency = CurrencyCode::RUB;
/**
* MonetaryAmount constructor.
* @param string|null $value Сумма
* @param string|null $currency Код валюты
*/
public function __construct($value = null, $currency = null)
{
if ($value !== null && $value > 0.0) {
$this->setValue($value);
}
if ($currency !== null) {
$this->setCurrency($currency);
}
}
/**
* Возвращает значение суммы
* @return string Сумма
*/
public function getValue()
{
if ($this->_value < 10) {
return '0.0' . $this->_value;
} elseif ($this->_value < 100) {
return '0.' . $this->_value;
} else {
return substr($this->_value, 0, -2) . '.' . substr($this->_value, -2);
}
}
/**
* Устанавливает сумму
* @param string $value Сумма
*
* @throws EmptyPropertyValueException Генерируется если было передано пустое значение
* @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
* @throws InvalidPropertyValueException Генерируется если было передано не валидное значение
*/
public function setValue($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty amount value', 0, 'amount.value');
}
if (!is_numeric($value)) {
throw new InvalidPropertyValueTypeException('Invalid amount value type', 0, 'amount.value', $value);
}
if ($value <= 0.0) {
throw new InvalidPropertyValueException('Invalid amount value: "'.$value.'"', 0, 'amount.value', $value);
}
$castedValue = (int)round($value * 100.0);
if ($castedValue <= 0.0) {
throw new InvalidPropertyValueException('Invalid amount value: "'.$value.'"', 0, 'amount.value', $value);
}
$this->_value = $castedValue;
}
/**
* Возвращает сумму в копейках в виде целого числа
* @return int Сумма в копейках/центах
*/
public function getIntegerValue()
{
return $this->_value;
}
/**
* Возвращает валюту
* @return string Код валюты
*/
public function getCurrency()
{
return $this->_currency;
}
/**
* Устанавливает код валюты
* @param string $value Код валюты
*
* @throws EmptyPropertyValueException Генерируется если было передано пустое значение
* @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
* @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты
*/
public function setCurrency($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty currency value', 0, 'amount.currency');
}
if (TypeCast::canCastToEnumString($value)) {
$value = strtoupper((string)$value);
if (CurrencyCode::valueExists($value)) {
$this->_currency = $value;
} else {
throw new InvalidPropertyValueException(
'Invalid currency value: "' . $value . '"', 0, 'amount.currency', $value
);
}
} else {
throw new InvalidPropertyValueTypeException('Invalid currency value type', 0, 'amount.currency', $value);
}
}
/**
* Умножает текущую сумму на указанный коэффициент
* @param float $coefficient Множитель
*
* @throws EmptyPropertyValueException Выбрасывается если передано пустое значение
* @throws InvalidPropertyValueTypeException Выбрасывается если было передано не число
* @throws InvalidPropertyValueException Выбрасывается если переданное значение меньше или равно нулю, либо если
* после умножения получили значение равное нулю
*/
public function multiply($coefficient)
{
if ($coefficient === null || $coefficient === '') {
throw new EmptyPropertyValueException('Empty coefficient in multiply method', 0, 'amount.value');
}
if (!is_numeric($coefficient)) {
throw new InvalidPropertyValueTypeException(
'Invalid coefficient type in multiply method', 0, 'amount.value', $coefficient
);
}
if ($coefficient <= 0.0) {
throw new InvalidPropertyValueException(
'Invalid coefficient in multiply method: "' . $coefficient . '"', 0, 'amount.value', $coefficient
);
}
$castedValue = (int)round($coefficient * $this->_value);
if ($castedValue === 0) {
throw new InvalidPropertyValueException(
'Invalid coefficient value in multiply method: "' . $coefficient . '"', 0, 'amount.value', $coefficient
);
}
$this->_value = $castedValue;
}
/**
* Увеличивает сумму на указанное значение
* @param int $value Значение которое будет прибавлено к текущему
*
* @throws EmptyPropertyValueException Выбрасывается если передано пустое значение
* @throws InvalidPropertyValueTypeException Выбрасывается если было передано не число
* @throws InvalidPropertyValueException Выбрасывается если после сложения получилась сумма меньше или равная нулю
*/
public function increase($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty amount value in increase method', 0, 'amount.value');
}
if (!is_numeric($value)) {
throw new InvalidPropertyValueTypeException(
'Invalid amount value type in increase method', 0, 'amount.value', $value
);
}
$castedValue = (int)round($this->_value + $value * 100.0);
if ($castedValue <= 0) {
throw new InvalidPropertyValueException(
'Invalid amount value in increase method: "' . $value . '"', 0, 'amount.value', $value
);
}
$this->_value = $castedValue;
}
/**
* @return array
*/
public function jsonSerialize()
{
return array(
'value' => sprintf('%.2f',$this->_value / 100.0),
'currency' => $this->_currency,
);
}
}
@@ -0,0 +1,138 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Notification;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\NotificationEventType;
use YooKassa\Model\NotificationType;
/**
* Базовый класс уведомлений
*
* @package YooKassa\Model\Notification
*
* @property-read string $type Тип уведомления в виде строки
* @property-read string $event Тип события
*/
abstract class AbstractNotification extends AbstractObject
{
/**
* @var string Тип уведомления
*/
private $_type;
/**
* @var string Тип произошедшего события
*/
private $_event;
/**
* Возвращает тип уведомления
*
* Тип уведомления - одна из констант, указанных в перечислении {@link NotificationType}.
*
* @return string Тип уведомления в виде строки
*/
public function getType()
{
return $this->_type;
}
/**
* Устанавливает тип уведомления
*
* @param string $value Тип уведомления
*
* @throws EmptyPropertyValueException Выбрасывается если в качестве значения было передано пустое значение
* @throws InvalidPropertyValueException Выбрасывается если переданное значение не найдено в перечислении типов
* нотификаций
* @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является строкой
*/
protected function _setType($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty parameter "type" in Notification', 0, 'notification.type');
} elseif (TypeCast::canCastToEnumString($value)) {
if (NotificationType::valueExists($value)) {
$this->_type = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid value for "type" parameter in Notification', 0, 'notification.type', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid value type for "type" parameter in Notification', 0, 'notification.type', $value
);
}
}
/**
* Возвращает тип события
*
* Тип события - одна из констант, указанных в перечислении {@link NotificationEventType}.
*
* @return string Тип события
*/
public function getEvent()
{
return $this->_event;
}
/**
* Устанавливает тип события
*
* @param string $value Тип события
*
* @throws EmptyPropertyValueException Выбрасывается если в качестве значения было передано пустое значение
* @throws InvalidPropertyValueException Выбрасывается если переданное значение не найдено в перечислении типов
* событий
* @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является строкой
*/
protected function _setEvent($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty parameter "event" in Notification', 0, 'notification.event');
} elseif (TypeCast::canCastToEnumString($value)) {
if (NotificationEventType::valueExists($value)) {
$this->_event = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid value for "event" parameter in Notification', 0, 'notification.event', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid value type for "event" parameter in Notification', 0, 'notification.event', $value
);
}
}
}
@@ -0,0 +1,99 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Notification;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Model\NotificationEventType;
use YooKassa\Model\NotificationType;
use YooKassa\Model\Payment;
use YooKassa\Model\PaymentInterface;
use YooKassa\Request\Payments\PaymentResponse;
class NotificationCanceled extends AbstractNotification
{
/**
* Объект платежа, для которого пришла нотификация. Так как нотификация может быть сгенерирована и поставлена в
* очередь на отправку гораздо раньше, чем она будет получена на сайте, то опираться на статус пришедшего
* платежа не стоит, лучше запросить текущую информацию о платеже у API.
*
* @var Payment Объект платежа
*/
private $_object;
/**
* Конструктор объекта нотификации о возможности подтверждения платежа
*
* Инициализирует текущий объект из ассоциативного массива, который просто путём JSON десериализации получен из
* тела пришедшего запроса. При конструировании проверяется валидность типа передаваемого уведомления, если
* передать уведомление не того типа, будет сгенерировано исключение типа {@link InvalidPropertyValueException}
*
* @param array $source Ассоциативный массив с информацией о уведомлении
*
* @throws InvalidPropertyValueException Генерируется если значение типа нотификации или события не равны
* "notification" и "payment.canceled" соответственно, что может говорить о том, что переданные в
* конструктор данные не являются уведомлением нужного типа.
*/
public function __construct(array $source)
{
$this->_setType(NotificationType::NOTIFICATION);
$this->_setEvent(NotificationEventType::PAYMENT_CANCELED);
if (!empty($source['type'])) {
if ($this->getType() !== $source['type']) {
throw new InvalidPropertyValueException(
'Invalid value for "type" parameter in Notification', 0, 'notification.type', $source['type']
);
}
}
if (!empty($source['event'])) {
if ($this->getEvent() !== $source['event']) {
throw new InvalidPropertyValueException(
'Invalid value for "event" parameter in Notification', 0, 'notification.event', $source['event']
);
}
}
if (empty($source['object'])) {
throw new EmptyPropertyValueException('Parameter object in NotificationSucceeded is empty');
}
$this->_object = new PaymentResponse($source['object']);
}
/**
* Возвращает объект с информацией о платеже, уведомление о котором хранится в текущем объекте
*
* Так как нотификация может быть сгенерирована и поставлена в очередь на отправку гораздо раньше, чем она будет
* получена на сайте, то опираться на статус пришедшего платежа не стоит, лучше запросить текущую информацию о
* платеже у API.
*
* @return PaymentInterface Объект с информацией о платеже
*/
public function getObject()
{
return $this->_object;
}
}
@@ -0,0 +1,63 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Notification;
use YooKassa\Model\Notification\AbstractNotification;
use YooKassa\Model\NotificationEventType;
class NotificationFactory
{
private $typeClassMap = array(
NotificationEventType::PAYMENT_CANCELED => 'NotificationCanceled',
NotificationEventType::REFUND_SUCCEEDED => 'NotificationRefundSucceeded',
NotificationEventType::PAYMENT_SUCCEEDED => 'NotificationSucceeded',
NotificationEventType::PAYMENT_WAITING_FOR_CAPTURE => 'NotificationWaitingForCapture',
);
/**
* @param array $data
* @return AbstractNotification
*/
public function factory(array $data)
{
if (!array_key_exists('event', $data)) {
throw new \InvalidArgumentException(
'Parameter event not specified in NotificationFactory.factory()'
);
}
if (!is_string($data['event'])) {
throw new \InvalidArgumentException('Invalid notification type value in notification factory');
}
if (!array_key_exists($data['event'], $this->typeClassMap)) {
throw new \InvalidArgumentException('Invalid notification data type "' . $data['event'] . '"');
}
$className = __NAMESPACE__ . '\\' . $this->typeClassMap[$data['event']];
return new $className($data);
}
}
@@ -0,0 +1,98 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Notification;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Model\NotificationEventType;
use YooKassa\Model\NotificationType;
use YooKassa\Model\Refund;
use YooKassa\Model\RefundInterface;
use YooKassa\Request\Refunds\RefundResponse;
class NotificationRefundSucceeded extends AbstractNotification
{
/**
* Объект возварата, для которого пришла нотификация. Так как нотификация может быть сгенерирована и поставлена в
* очередь на отправку гораздо раньше, чем она будет получена на сайте, то опираться на статус пришедшего
* возврата не стоит, лучше запросить текущую информацию о возврате у API.
*
* @var Refund Объект платежа
*/
private $_object;
/**
* Конструктор объекта нотификации
*
* Инициализирует текущий объект из ассоциативного массива, который просто путём JSON десериализации получен из
* тела пришедшего запроса. При конструировании проверяется валидность типа передаваемого уведомления, если
* передать уведомление не того типа, будет сгенерировано исключение типа {@link InvalidPropertyValueException}
*
* @param array $source Ассоциативный массив с информацией о уведомлении
*
* @throws InvalidPropertyValueException Генерируется если значение типа нотификации или события не равны
* "notification" и "refund.succeeded" соответственно, что может говорить о том, что переданные в
* конструктор данные не являются уведомлением нужного типа.
*/
public function __construct(array $source)
{
$this->_setType(NotificationType::NOTIFICATION);
$this->_setEvent(NotificationEventType::REFUND_SUCCEEDED);
if (!empty($source['type'])) {
if ($this->getType() !== $source['type']) {
throw new InvalidPropertyValueException(
'Invalid value for "type" parameter in Notification', 0, 'notification.type', $source['type']
);
}
}
if (!empty($source['event'])) {
if ($this->getEvent() !== $source['event']) {
throw new InvalidPropertyValueException(
'Invalid value for "event" parameter in Notification', 0, 'notification.event', $source['event']
);
}
}
if (empty($source['object'])) {
throw new EmptyPropertyValueException('Parameter object in NotificationSucceeded is empty');
}
$this->_object = new RefundResponse($source['object']);
}
/**
* Возвращает объект с информацией о возврате, уведомление о котором хранится в текущем объекте
*
* Так как нотификация может быть сгенерирована и поставлена в очередь на отправку гораздо раньше, чем она будет
* получена на сайте, то опираться на статус пришедшего возврата не стоит, лучше запросить текущую информацию о
* возврате у API.
*
* @return RefundInterface Объект с информацией о возврате
*/
public function getObject()
{
return $this->_object;
}
}
@@ -0,0 +1,105 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Notification;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Model\NotificationEventType;
use YooKassa\Model\NotificationType;
use YooKassa\Model\Payment;
use YooKassa\Model\PaymentInterface;
use YooKassa\Request\Payments\PaymentResponse;
/**
* Класс объекта, присылаемого API при изменении статуса платежа на "succeeded"
*
* @package YooKassa\Model\Notification
*
* @property-read PaymentInterface $object Объект с информацией о платеже
*/
class NotificationSucceeded extends AbstractNotification
{
/**
* Объект платежа, для которого пришла нотификация. Так как нотификация может быть сгенерирована и поставлена в
* очередь на отправку гораздо раньше, чем она будет получена на сайте, то опираться на статус пришедшего
* платежа не стоит, лучше запросить текущую информацию о платеже у API.
*
* @var Payment Объект платежа
*/
private $_object;
/**
* Конструктор объекта нотификации о возможности подтверждения платежа
*
* Инициализирует текущий объект из ассоциативного массива, который просто путём JSON десериализации получен из
* тела пришедшего запроса. При конструировании проверяется валидность типа передаваемого уведомления, если
* передать уведомление не того типа, будет сгенерировано исключение типа {@link InvalidPropertyValueException}
*
* @param array $source Ассоциативный массив с информацией о уведомлении
*
* @throws InvalidPropertyValueException Генерируется если значение типа нотификации или события не равны
* "notification" и "payment.succeeded" соответственно, что может говорить о том, что переданные в
* конструктор данные не являются уведомлением нужного типа.
*/
public function __construct(array $source)
{
$this->_setType(NotificationType::NOTIFICATION);
$this->_setEvent(NotificationEventType::PAYMENT_SUCCEEDED);
if (!empty($source['type'])) {
if ($this->getType() !== $source['type']) {
throw new InvalidPropertyValueException(
'Invalid value for "type" parameter in Notification', 0, 'notification.type', $source['type']
);
}
}
if (!empty($source['event'])) {
if ($this->getEvent() !== $source['event']) {
throw new InvalidPropertyValueException(
'Invalid value for "event" parameter in Notification', 0, 'notification.event', $source['event']
);
}
}
if (empty($source['object'])) {
throw new EmptyPropertyValueException('Parameter object in NotificationSucceeded is empty');
}
$this->_object = new PaymentResponse($source['object']);
}
/**
* Возвращает объект с информацией о платеже, уведомление о котором хранится в текущем объекте
*
* Так как нотификация может быть сгенерирована и поставлена в очередь на отправку гораздо раньше, чем она будет
* получена на сайте, то опираться на статус пришедшего платежа не стоит, лучше запросить текущую информацию о
* платеже у API.
*
* @return PaymentInterface Объект с информацией о платеже
*/
public function getObject()
{
return $this->_object;
}
}
@@ -0,0 +1,109 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\Notification;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Model\NotificationEventType;
use YooKassa\Model\NotificationType;
use YooKassa\Model\Payment;
use YooKassa\Model\PaymentInterface;
use YooKassa\Request\Payments\PaymentResponse;
/**
* Класс объекта, присылаемого API при изменении статуса платежа на "waiting_for_capture"
*
* При создании платежа с флагом "capture" равным false, после того как клиент проводит платёж, от API на эндпоинт,
* указанный в настройках API посылается уведомление о том, что платёж теперь может быть проведён. В классе описана
* структура такого объекта для магазинов, которые получают уведомления на HTTPS endpoint.
*
* @package YooKassa\Model\Notification
*
* @property-read PaymentInterface $object Объект с информацией о платеже, который можно подтвердить или отменить
*/
class NotificationWaitingForCapture extends AbstractNotification
{
/**
* Объект платежа, для которого пришла нотификация. Так как нотификация может быть сгенерирована и поставлена в
* очередь на отправку гораздо раньше, чем она будет получена на сайте, то опираться на статус пришедшего
*платежа не стоит, лучше запросить текущую информацию о платеже у API.
*
* @var Payment Объект платежа
*/
private $_object;
/**
* Конструктор объекта нотификации о возможности подтверждения платежа
*
* Инициализирует текущий объект из ассоциативного массива, который просто путём JSON десериализации получен из
* тела пришедшего запроса. При конструировании проверяется валидность типа передаваемого уведомления, если
* передать уведомление не того типа, будет сгенерировано исключение типа {@link InvalidPropertyValueException}
*
* @param array $source Ассоциативный массив с информацией о уведомлении
*
* @throws InvalidPropertyValueException Генерируется если значение типа нотификации или события не равны
* "notification" и "payment.waiting_for_capture" соответственно, что может говорить о том, что переданные в
* конструктор данные не являются уведомлением нужного типа.
*/
public function __construct(array $source)
{
$this->_setType(NotificationType::NOTIFICATION);
$this->_setEvent(NotificationEventType::PAYMENT_WAITING_FOR_CAPTURE);
if (!empty($source['type'])) {
if ($this->getType() !== $source['type']) {
throw new InvalidPropertyValueException(
'Invalid value for "type" parameter in Notification', 0, 'notification.type', $source['type']
);
}
}
if (!empty($source['event'])) {
if ($this->getEvent() !== $source['event']) {
throw new InvalidPropertyValueException(
'Invalid value for "event" parameter in Notification', 0, 'notification.event', $source['event']
);
}
}
if (empty($source['object'])) {
throw new EmptyPropertyValueException('Parameter object in NotificationWaitingForCapture is empty');
}
$this->_object = new PaymentResponse($source['object']);
}
/**
* Возвращает объект с информацией о платеже, уведомление о котором хранится в текущем объекте
*
* Так как нотификация может быть сгенерирована и поставлена в очередь на отправку гораздо раньше, чем она будет
* получена на сайте, то опираться на статус пришедшего платежа не стоит, лучше запросить текущую информацию о
* платеже у API.
*
* @return PaymentInterface Объект с информацией о платеже, который можно подтвердить или отменить
*/
public function getObject()
{
return $this->_object;
}
}
@@ -0,0 +1,44 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractEnum;
class NotificationEventType extends AbstractEnum
{
const PAYMENT_WAITING_FOR_CAPTURE = 'payment.waiting_for_capture';
const PAYMENT_SUCCEEDED = 'payment.succeeded';
const PAYMENT_CANCELED = 'payment.canceled';
const REFUND_SUCCEEDED = 'refund.succeeded';
protected static $validValues = array(
self::PAYMENT_WAITING_FOR_CAPTURE => true,
self::PAYMENT_SUCCEEDED => true,
self::PAYMENT_CANCELED => true,
self::REFUND_SUCCEEDED => true,
);
}
@@ -0,0 +1,38 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractEnum;
class NotificationType extends AbstractEnum
{
const NOTIFICATION = 'notification';
protected static $validValues = array(
self::NOTIFICATION => true,
);
}
@@ -0,0 +1,112 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
class Passenger extends AbstractObject implements PassengerInterface
{
/**
* @var string
*/
private $_firstName;
/**
* @var string
*/
private $_lastName;
/**
* @inheritdoc
*/
public function getFirstName()
{
return $this->_firstName;
}
/**
* @param $value
*/
public function setFirstName($value)
{
if (empty($value) || is_numeric($value)) {
throw new InvalidPropertyValueTypeException(
'Invalid first_name value type in Passenger object', 0, 'airline.passengers', $value
);
} else if (TypeCast::canCastToString($value)) {
$length = mb_strlen((string)$value, 'utf-8');
if ($length > 64) {
throw new InvalidPropertyValueException(
'Invalid first_name value length in Passenger object',
0, 'airline.passengers', $value
);
}
$this->_firstName = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid first_name value type in Passenger object', 0, 'airline.passengers', $value
);
}
}
/**
* @inheritdoc
*/
public function getLastName()
{
return $this->_lastName;
}
/**
* @param $value
*/
public function setLastName($value)
{
if (empty($value) || is_numeric($value)) {
throw new InvalidPropertyValueTypeException(
'Invalid last_name value type in Passenger object', 0, 'airline.passengers', $value
);
} else if (TypeCast::canCastToString($value)) {
$length = mb_strlen((string)$value, 'utf-8');
if ($length > 64) {
throw new InvalidPropertyValueException(
'Invalid last_name value length in Passenger object',
0, 'airline.passengers', $value
);
}
$this->_lastName = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid last_name value type in Passenger object', 0, 'airline.passengers', $value
);
}
}
}
@@ -0,0 +1,41 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
interface PassengerInterface
{
/**
* @return string
*/
public function getFirstName();
/**
* @return string
*/
public function getLastName();
}
@@ -0,0 +1,704 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\PaymentMethod\AbstractPaymentMethod;
/**
* Payment - Данные о платеже
*
* @property string $id Идентификатор платежа
* @property string $status Текущее состояние платежа
* @property RecipientInterface $recipient Получатель платежа
* @property AmountInterface $amount Сумма заказа
* @property string $description Описание транзакци
* @property AbstractPaymentMethod $paymentMethod Способ проведения платежа
* @property AbstractPaymentMethod $payment_method Способ проведения платежа
* @property \DateTime $createdAt Время создания заказа
* @property \DateTime $created_at Время создания заказа
* @property \DateTime $capturedAt Время подтверждения платежа магазином
* @property \DateTime $captured_at Время подтверждения платежа магазином
* @property \DateTime $expiresAt Время, до которого можно бесплатно отменить или подтвердить платеж
* @property \DateTime $expires_at Время, до которого можно бесплатно отменить или подтвердить платеж
* @property Confirmation\AbstractConfirmation $confirmation Способ подтверждения платежа
* @property AmountInterface $refundedAmount Сумма возвращенных средств платежа
* @property AmountInterface $refunded_amount Сумма возвращенных средств платежа
* @property bool $paid Признак оплаты заказа
* @property bool $refundable Возможность провести возврат по API
* @property string $receiptRegistration Состояние регистрации фискального чека
* @property string $receipt_registration Состояние регистрации фискального чека
* @property Metadata $metadata Метаданные платежа указанные мерчантом
* @property CancellationDetailsInterface $cancellationDetails Комментарий к отмене платежа
* @property CancellationDetailsInterface $cancellation_details Комментарий к отмене платежа
* @property AuthorizationDetailsInterface $authorizationDetails Данные об авторизации платежа
* @property AuthorizationDetailsInterface $authorization_details Данные об авторизации платежа
* @property TransferInterface[] $transfers Данные о распределении платежа между магазинами
*/
class Payment extends AbstractObject implements PaymentInterface
{
const MAX_LENGTH_DESCRIPTION = 128;
/**
* @var string Идентификатор платежа
*/
private $_id;
/**
* @var string Текущее состояние платежа
*/
private $_status;
/**
* @var RecipientInterface|null Получатель платежа
*/
private $_recipient;
/**
* @var AmountInterface
*/
private $_amount;
/**
* @var string
*/
private $_description;
/**
* @var AbstractPaymentMethod Способ проведения платежа
*/
private $_paymentMethod;
/**
* @var \DateTime Время создания заказа
*/
private $_createdAt;
/**
* @var \DateTime Время подтверждения платежа магазином
*/
private $_capturedAt;
/**
* @var Confirmation\AbstractConfirmation Способ подтверждения платежа
*/
private $_confirmation;
/**
* @var AmountInterface Сумма возвращенных средств платежа
*/
private $_refundedAmount;
/**
* @var bool Признак оплаты заказа
*/
private $_paid;
/**
* @var bool Возможность провести возврат по API
*/
private $_refundable;
/**
* @var string Состояние регистрации фискального чека
*/
private $_receiptRegistration;
/**
* @var Metadata Метаданные платежа указанные мерчантом
*/
private $_metadata;
/**
* Время, до которого можно бесплатно отменить или подтвердить платеж. В указанное время платеж в статусе
* `waiting_for_capture` будет автоматически отменен.
*
* @var \DateTime Время, до которого можно бесплатно отменить или подтвердить платеж
* @since 1.0.2
*/
private $_expiresAt;
/**
* Комментарий к статусу canceled: кто отменил платеж и по какой причине
* @var CancellationDetailsInterface
* @since 1.0.13
*/
private $_cancellationDetails;
/**
* Данные об авторизации платежа
* @var AuthorizationDetailsInterface
* @since 1.0.18
*/
private $_authorizationDetails;
/**
* @var TransferInterface[]
*/
private $_transfers = array();
/**
* @var MonetaryAmount
*/
private $_incomeAmount;
/**
* @var RequestorInterface
*/
private $_requestor;
/**
* Признак тестовой операции.
* @var boolean
* @since 1.1.3
*/
private $_test;
/**
* Возвращает идентификатор платежа
* @return string Идентификатор платежа
*/
public function getId()
{
return $this->_id;
}
/**
* Устанавливает идентификатор платежа
* @param string $value Идентификатор платежа
*
* @throws InvalidPropertyValueException Выбрасывается если длина переданной строки не равна 36
* @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
*/
public function setId($value)
{
if (TypeCast::canCastToString($value)) {
$length = mb_strlen($value, 'utf-8');
if ($length != 36) {
throw new InvalidPropertyValueException('Invalid payment id value', 0, 'Payment.id', $value);
}
$this->_id = (string)$value;
} else {
throw new InvalidPropertyValueTypeException('Invalid payment id value type', 0, 'Payment.id', $value);
}
}
/**
* Возвращает состояние платежа
* @return string Текущее состояние платежа
*/
public function getStatus()
{
return $this->_status;
}
/**
* Устанавливает статус платежа
* @param string $value Статус платежа
*
* @throws InvalidPropertyValueException Выбрасывается если переданная строка не является валидным статусом
* @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
*/
public function setStatus($value)
{
if (TypeCast::canCastToEnumString($value)) {
if (!PaymentStatus::valueExists((string)$value)) {
throw new InvalidPropertyValueException('Invalid payment status value', 0, 'Payment.status', $value);
}
$this->_status = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid payment status value type', 0, 'Payment.status', $value
);
}
}
/**
* Возвращает получателя платежа
* @return RecipientInterface|null Получатель платежа или null если получатель не задан
*/
public function getRecipient()
{
return $this->_recipient;
}
/**
* Устанавливает получателя платежа
* @param RecipientInterface $value Объект с информацией о получателе платежа
*/
public function setRecipient(RecipientInterface $value)
{
$this->_recipient = $value;
}
/**
* Возвращает сумму
* @return AmountInterface Сумма платежа
*/
public function getAmount()
{
return $this->_amount;
}
/**
* Устанавливает сумму платежа
* @param AmountInterface $value Сумма платежа
*/
public function setAmount(AmountInterface $value)
{
$this->_amount = $value;
}
/**
* Возвращает описание транзакции
* @return string
*/
public function getDescription()
{
return $this->_description;
}
/**
* Устанавливает описание транзакции
* @param string $value
*
* @throws InvalidPropertyValueException Выбрасывается если переданное значение превышает допустимую длину
* @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является строкой
*/
public function setDescription($value)
{
if ($value === null || $value === '') {
$this->_description = null;
} elseif (TypeCast::canCastToString($value)) {
$length = mb_strlen((string)$value, 'utf-8');
if ($length > self::MAX_LENGTH_DESCRIPTION) {
throw new InvalidPropertyValueException(
'Invalid description value', 0, 'CreatePaymentRequest.description', $value
);
}
$this->_description = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid description value type', 0, 'CreatePaymentRequest.description', $value
);
}
}
/**
* Возвращает используемый способ проведения платежа
* @return AbstractPaymentMethod Способ проведения платежа
*/
public function getPaymentMethod()
{
return $this->_paymentMethod;
}
/**
* @param AbstractPaymentMethod $value
*/
public function setPaymentMethod(AbstractPaymentMethod $value)
{
$this->_paymentMethod = $value;
}
/**
* Возвращает время создания заказа
* @return \DateTime Время создания заказа
*/
public function getCreatedAt()
{
return $this->_createdAt;
}
/**
* Устанавливает время создания заказа
* @param \DateTime|string|int $value Время создания заказа
*
* @throws EmptyPropertyValueException Выбрасывается если в метод была передана пустая дата
* @throws InvalidPropertyValueException Выбрасвается если передали строку, которую не удалось привести к дате
* @throws InvalidPropertyValueTypeException|\Exception Выбрасывается если был передан аргумент, который невозможно
* интерпретировать как дату или время
*/
public function setCreatedAt($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty created_at value', 0, 'payment.createdAt');
} elseif (TypeCast::canCastToDateTime($value)) {
$dateTime = TypeCast::castToDateTime($value);
if ($dateTime === null) {
throw new InvalidPropertyValueException('Invalid created_at value', 0, 'payment.createdAt', $value);
}
$this->_createdAt = $dateTime;
} else {
throw new InvalidPropertyValueTypeException('Invalid created_at value', 0, 'payment.createdAt', $value);
}
}
/**
* Возвращает время подтверждения платежа магазином или null если если время не задано
* @return \DateTime|null Время подтверждения платежа магазином
*/
public function getCapturedAt()
{
return $this->_capturedAt;
}
/**
* Устанавливает время подтверждения платежа магазином
* @param \DateTime|string|int|null $value Время подтверждения платежа магазином
*
* @throws InvalidPropertyValueException Выбрасвается если передали строку, которую не удалось привести к дате
* @throws InvalidPropertyValueTypeException|\Exception Выбрасывается если был передан аргумент, который невозможно
* интерпретировать как дату или время
*/
public function setCapturedAt($value)
{
if ($value === null || $value === '') {
$this->_capturedAt = null;
} elseif (TypeCast::canCastToDateTime($value)) {
$dateTime = TypeCast::castToDateTime($value);
if ($dateTime === null) {
throw new InvalidPropertyValueException('Invalid captured_at value', 0, 'payment.capturedAt', $value);
}
$this->_capturedAt = $dateTime;
} else {
throw new InvalidPropertyValueTypeException('Invalid captured_at value', 0, 'payment.capturedAt', $value);
}
}
/**
* Возвращает способ подтверждения платежа
* @return Confirmation\AbstractConfirmation Способ подтверждения платежа
*/
public function getConfirmation()
{
return $this->_confirmation;
}
/**
* Устанавливает способ подтверждения платежа
* @param Confirmation\AbstractConfirmation $value Способ подтверждения платежа
*/
public function setConfirmation(Confirmation\AbstractConfirmation $value)
{
$this->_confirmation = $value;
}
/**
* Возвращает сумму возвращенных средств
* @return AmountInterface Сумма возвращенных средств платежа
*/
public function getRefundedAmount()
{
return $this->_refundedAmount;
}
/**
* Устанавливает сумму возвращенных средств
* @param AmountInterface $value Сумма возвращенных средств платежа
*/
public function setRefundedAmount(AmountInterface $value)
{
$this->_refundedAmount = $value;
}
/**
* Проверяет был ли уже оплачен заказ
* @return bool Признак оплаты заказа, true если заказ оплачен, false если нет
*/
public function getPaid()
{
return $this->_paid;
}
/**
* Устанавливает флаг оплаты заказа
* @param bool $value Признак оплаты заказа
*
* @throws EmptyPropertyValueException Выбрасывается если переданный аргумент пуст
* @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не кастится в булево значение
*/
public function setPaid($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty payment paid flag value', 0, 'Payment.paid');
} elseif (TypeCast::canCastToBoolean($value)) {
$this->_paid = (bool)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid payment paid flag value type', 0, 'Payment.paid', $value
);
}
}
/**
* Проверяет возможность провести возврат по API
* @return bool Возможность провести возврат по API, true если есть, false если нет
*/
public function getRefundable()
{
return $this->_refundable;
}
/**
* Устанавливает возможность провести возврат по API
* @param bool $value Возможность провести возврат по API
*
* @throws EmptyPropertyValueException Выбрасывается если переданный аргумент пуст
* @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не кастится в булево значение
*/
public function setRefundable($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty payment refundable flag value', 0, 'Payment.refundable');
} elseif (TypeCast::canCastToBoolean($value)) {
$this->_refundable = (bool)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid payment refundable flag value type', 0, 'Payment.refundable', $value
);
}
}
/**
* Возвращает состояние регистрации фискального чека
* @return string Состояние регистрации фискального чека
*/
public function getReceiptRegistration()
{
return $this->_receiptRegistration;
}
/**
* Устанавливает состояние регистрации фискального чека
* @param string $value Состояние регистрации фискального чека
*
* @throws InvalidPropertyValueException Выбрасывается если переданное состояние регистрации не существует
* @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не строка
*/
public function setReceiptRegistration($value)
{
if ($value === null || $value === '') {
$this->_receiptRegistration = null;
} elseif (TypeCast::canCastToEnumString($value)) {
if (ReceiptRegistrationStatus::valueExists($value)) {
$this->_receiptRegistration = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid receipt_registration value', 0, 'payment.receiptRegistration', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid receipt_registration value type', 0, 'payment.receiptRegistration', $value
);
}
}
/**
* Возвращает метаданные платежа установленные мерчантом
* @return Metadata Метаданные платежа указанные мерчантом
*/
public function getMetadata()
{
return $this->_metadata;
}
/**
* Устанавливает метаданные платежа
* @param Metadata $value Метаданные платежа указанные мерчантом
*/
public function setMetadata(Metadata $value)
{
$this->_metadata = $value;
}
/**
* Возвращает время до которого можно бесплатно отменить или подтвердить платеж или null если оно не задано
* @return \DateTime|null Время, до которого можно бесплатно отменить или подтвердить платеж
*
* @since 1.0.2
*/
public function getExpiresAt()
{
return $this->_expiresAt;
}
/**
* Устанавливает время до которого можно бесплатно отменить или подтвердить платеж
* @param \DateTime|string|int|null $value Время, до которого можно бесплатно отменить или подтвердить платеж
*
* @throws InvalidPropertyValueException Выбрасывается если передали строку, которую не удалось привести к дате
* @throws InvalidPropertyValueTypeException|\Exception Выбрасывается если был передан аргумент, который невозможно
* интерпретировать как дату или время
*
* @since 1.0.2
*/
public function setExpiresAt($value)
{
if ($value === null || $value === '') {
$this->_expiresAt = null;
} elseif (TypeCast::canCastToDateTime($value)) {
$dateTime = TypeCast::castToDateTime($value);
if ($dateTime === null) {
throw new InvalidPropertyValueException('Invalid expires_at value', 0, 'payment.expires_at', $value);
}
$this->_expiresAt = $dateTime;
} else {
throw new InvalidPropertyValueTypeException('Invalid expires_at value', 0, 'payment.expires_at', $value);
}
}
/**
* Возвращает комментарий к статусу canceled: кто отменил платеж и по какой причине
* @return CancellationDetailsInterface|null Комментарий к статусу canceled
* @since 1.0.13
*/
public function getCancellationDetails()
{
return $this->_cancellationDetails;
}
/**
* Устанавливает комментарий к статусу canceled: кто отменил платеж и по какой причине
* @param CancellationDetailsInterface $value Комментарий к статусу canceled
*/
public function setCancellationDetails(CancellationDetailsInterface $value)
{
$this->_cancellationDetails = $value;
}
/**
* Возвращает данные об авторизации платежа
* @return AuthorizationDetailsInterface|null Данные об авторизации платежа
* @since 1.0.18
*/
public function getAuthorizationDetails()
{
return $this->_authorizationDetails;
}
/**
* Устанавливает данные об авторизации платежа
* @param AuthorizationDetailsInterface $value Данные об авторизации платежа
*/
public function setAuthorizationDetails(AuthorizationDetailsInterface $value)
{
$this->_authorizationDetails = $value;
}
/**
* Устанавливает transfers (массив распределения денег между магазинами)
* @param $value
*/
public function setTransfers($value)
{
if (!is_array($value)) {
$message = 'Transfers must be an array of TransferInterface';
throw new InvalidPropertyValueTypeException($message, 0, 'Payment.transfers', $value);
}
foreach ($value as $item) {
if (!($item instanceof TransferInterface)) {
$message = 'Transfers must be an array of TransferInterface';
throw new InvalidPropertyValueTypeException($message, 0, 'Payment.transfers', $value);
}
}
$this->_transfers = $value;
}
public function getTransfers()
{
return $this->_transfers;
}
/**
* @param MonetaryAmount $amount
*/
public function setIncomeAmount(MonetaryAmount $amount)
{
$this->_incomeAmount = $amount;
}
public function getIncomeAmount()
{
return $this->_incomeAmount;
}
/**
* @param $value
*/
public function setRequestor($value)
{
if (is_array($value)) {
$value = new Requestor($value);
}
if (!($value instanceof RequestorInterface)) {
throw new InvalidPropertyValueTypeException('Invalid Requestor type', 0, 'Payment.requestor', $value);
}
$this->_requestor = $value;
}
/**
* @return RequestorInterface
*/
public function getRequestor()
{
return $this->_requestor;
}
/**
* @return bool
*/
public function getTest()
{
return $this->_test;
}
/**
* @param bool $test
*/
public function setTest($test)
{
if ($test === null || $test === '') {
throw new EmptyPropertyValueException('Empty payment test flag value', 0, 'Payment.test');
} elseif (TypeCast::canCastToBoolean($test)) {
$this->_test = (bool)$test;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid payment test flag value type', 0, 'Payment.test', $test
);
}
}
}
@@ -0,0 +1,78 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\PaymentMethodType;
/**
* Данные используемые для создания метода оплаты.
* @property string $type
*/
abstract class AbstractPaymentData extends AbstractObject
{
/**
* @var string
*/
private $_type;
/**
* @return string
*/
public function getType()
{
return $this->_type;
}
/**
* @param string $value
*/
protected function _setType($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty payment data type', 0, 'paymentData.type'
);
} elseif (TypeCast::canCastToEnumString($value)) {
if (PaymentMethodType::valueExists($value)) {
$this->_type = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid value for "type" parameter in PaymentData', 0, 'paymentData.type', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid value type for "type" parameter in PaymentData', 0, 'paymentData.type', $value
);
}
}
}
@@ -0,0 +1,167 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData\B2b\Sberbank;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\AmountInterface;
use YooKassa\Model\MonetaryAmount;
/**
* Данные об НДС
* @property string $type Способ расчёта НДС
* @property string $rate Данные об НДС в случае, если сумма НДС включена в сумму платежа
* @property AmountInterface $amount Сумма НДС
*/
class VatData extends AbstractObject implements VatDataInterface
{
/**
* @var string Способ расчёта НДС
*/
private $_type;
/**
* @var string Налоговая ставка НДС
*/
private $_rate;
/**
* @var AmountInterface Сумма НДС
*/
private $_amount;
/**
* VatData constructor.
* @param string|null $type Способ расчёта НДС
* @param string|null $rate Налоговая ставка НДС
* @param AmountInterface|null $amount Сумма НДС
*/
public function __construct($type = null, $rate = null, $amount = null)
{
if ($type !== null) {
$this->setType($type);
}
if ($rate !== null) {
$this->setRate($rate);
}
if ($amount !== null) {
$this->setAmount($amount);
}
}
/**
* @return string Способ расчёта НДС
*/
public function getType()
{
return $this->_type;
}
/**
* Устанавливает способ расчёта НДС
* @param string $value Способ расчёта НДС
*
* @throws InvalidPropertyValueException Выбрасывается если переданная строка не является валидным способом
* @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
*/
public function setType($value)
{
if (TypeCast::canCastToEnumString($value)) {
if (!VatDataType::valueExists((string)$value)) {
throw new InvalidPropertyValueException('Invalid B2bSberbankVatData.type value', 0,
'B2bSberbankVatData.type', $value);
}
$this->_type = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid B2bSberbankVatData.type value type', 0, 'B2bSberbankVatData.type', $value
);
}
}
/**
* @return string Налоговая ставка НДС
*/
public function getRate()
{
return $this->_rate;
}
/**
* Устанавливает налоговую ставку НДС
* @param string $value Налоговая ставка НДС
*
* @throws InvalidPropertyValueException Выбрасывается если переданная строка не является валидной ставкой
* @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
*/
public function setRate($value)
{
if (TypeCast::canCastToString($value)) {
if (!VatDataRate::valueExists((string)$value)) {
throw new InvalidPropertyValueException('Invalid B2bSberbankVatData.rate value', 0,
'B2bSberbankVatData.rate', $value);
}
$this->_rate = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid B2bSberbankVatData.rate value type', 0, 'B2bSberbankVatData.rate', $value
);
}
}
/**
* Возвращает сумму НДС
* @return AmountInterface Сумма НДС
*/
public function getAmount()
{
return $this->_amount;
}
/**
* Устанавливает сумму НДС
* @param AmountInterface|array|null $value Сумма НДС
*/
public function setAmount($value)
{
if ($value === null) {
$this->_amount = null;
} elseif ($value instanceof AmountInterface) {
$this->_amount = $value;
} elseif (is_array($value)) {
$this->_amount = new MonetaryAmount();
$this->_amount->fromArray($value);
} else {
throw new InvalidPropertyValueTypeException(
'Invalid B2bSberbankVatData.amount value type', 0, 'B2bSberbankVatData.amount', $value
);
}
}
}
@@ -0,0 +1,60 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData\B2b\Sberbank;
use YooKassa\Model\AmountInterface;
/**
* Interface VatDataInterface
*
* @package YooKassa\Model
*
* @property-read string $type Способ расчёта НДС
* @property-read string $rate Данные об НДС в случае, если сумма НДС включена в сумму платежа
* @property-read AmountInterface $amount Сумма НДС
*/
interface VatDataInterface
{
/**
* Возвращает способ расчёта НДС
* @return string Способ расчёта НДС
*/
function getType();
/**
* Возвращает данные об НДС
* @return string Данные об НДС
*/
function getRate();
/**
* Возвращает сумму НДС
* @return AmountInterface Сумма НДС
*/
function getAmount();
}
@@ -0,0 +1,54 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData\B2b\Sberbank;
use YooKassa\Common\AbstractEnum;
/**
* PaymentDataB2bSberbankVatDataRate - Налоговая ставка НДС
* |Код|Описание|
* --- | ---
* |7|7%|
* |10|10%|
* |18|18%|
* |20|20%|
*/
class VatDataRate extends AbstractEnum
{
const RATE_7 = '7';
const RATE_10 = '10';
const RATE_18 = '18';
const RATE_20 = '20';
protected static $validValues = array(
self::RATE_7 => true,
self::RATE_10 => true,
self::RATE_18 => true,
self::RATE_20 => true,
);
}
@@ -0,0 +1,51 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData\B2b\Sberbank;
use YooKassa\Common\AbstractEnum;
/**
* PaymentDataB2bSberbankVatDataType - Способ расчёта НДС
* |Код|Описание|
* --- | ---
* |calculated|Сумма НДС включена в сумму платежа|
* |mixed|Разные ставки НДС для разных товаров|
* |untaxed|Сумма платежа НДС не облагается|
*/
class VatDataType extends AbstractEnum
{
const CALCULATED = 'calculated';
const MIXED = 'mixed';
const UNTAXED = 'untaxed';
protected static $validValues = array(
self::CALCULATED => true,
self::MIXED => true,
self::UNTAXED => true,
);
}
@@ -0,0 +1,74 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\PaymentMethodType;
/**
* PaymentDataAlfabank
* Платежные данные для проведения оплаты через Альфа Клик или Альфа Молнию.
* @property string $login Имя пользователя в Альфа-Клике
*/
class PaymentDataAlfabank extends AbstractPaymentData
{
/**
* @var string Имя пользователя в Альфа-Клике
*/
private $_login;
public function __construct()
{
$this->_setType(PaymentMethodType::ALFABANK);
}
/**
* @return string Имя пользователя в Альфа-Клике
*/
public function getLogin()
{
return $this->_login;
}
/**
* @param string $value Имя пользователя в Альфа-Клике
*/
public function setLogin($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty login value', 0, 'PaymentDataAlfabank.login');
} elseif (TypeCast::canCastToString($value)) {
$this->_login = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid login value type', 0, 'PaymentDataAlfabank.login', $value
);
}
}
}
@@ -0,0 +1,78 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\PaymentMethodType;
/**
* PaymentDataApplePay
* Платежные данные для проведения оплаты при помощи Apple Pay
* @property string $type Тип объекта
* @property string $paymentData содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
* @property string $payment_data содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
*/
class PaymentDataApplePay extends AbstractPaymentData
{
/**
* @var string содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
*/
private $_paymentData;
public function __construct()
{
$this->_setType(PaymentMethodType::APPLE_PAY);
}
/**
* @return string содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
*/
public function getPaymentData()
{
return $this->_paymentData;
}
/**
* @param string $value содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
*/
public function setPaymentData($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty value for paymentData', 0, 'PaymentDataApplePay.paymentData'
);
} elseif (TypeCast::canCastToString($value)) {
$this->_paymentData = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid value type for paymentData', 0, 'PaymentDataApplePay.paymentData', $value
);
}
}
}
@@ -0,0 +1,120 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\PaymentData\B2b\Sberbank\VatData;
use YooKassa\Model\PaymentMethodType;
/**
* PaymentDataB2BSberbank
* Платежные данные для проведения оплаты при помощи Сбербанк Бизнес Онлайн.
* @property string $paymentPurpose Назначение платежа
* @property VatData $vatData Данные об НДС
*/
class PaymentDataB2bSberbank extends AbstractPaymentData
{
/**
* @var string Назначение платежа
*/
private $_paymentPurpose;
/**
* @var VatData Данные об НДС
*/
private $_vatData;
public function __construct()
{
$this->_setType(PaymentMethodType::B2B_SBERBANK);
}
/**
* @return string Назначение платежа
*/
public function getPaymentPurpose()
{
return $this->_paymentPurpose;
}
/**
* @param string $value Назначение платежа
*/
public function setPaymentPurpose($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty paymentPurpose value', 0,
'PaymentDataB2bSberbank.paymentPurpose');
} elseif (TypeCast::canCastToString($value)) {
if (preg_match('/^.{1,210}$/', $value)) {
$this->_paymentPurpose = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid paymentPurpose value', 0, 'PaymentDataB2bSberbank.paymentPurpose', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid paymentPurpose value type', 0, 'PaymentDataB2bSberbank.paymentPurpose', $value
);
}
}
/**
* @return VatData Данные об НДС
*/
public function getVatData()
{
return $this->_vatData;
}
/**
* @param VatData|array|null $value Данные об НДС
*/
public function setVatData($value)
{
if ($value === null || $value === array()) {
$this->_vatData = null;
} elseif ($value instanceof VatData) {
$this->_vatData = $value;
} elseif (is_array($value) || $value instanceof \Traversable) {
$vatData = new VatData();
foreach ($value as $property => $val) {
$vatData->offsetSet($property, $val);
}
$this->_vatData = $vatData;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid vatData value type in PaymentDataB2BSberbank', 0,
'PaymentDataB2BSberbank.vatData', $value
);
}
}
}
@@ -0,0 +1,80 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Model\PaymentMethodType;
/**
* PaymentDataBankCard
* Платежные данные для проведения оплаты при помощи банковской карты
*
* @property PaymentDataBankCardCard $card Данные банковской карты
*/
class PaymentDataBankCard extends AbstractPaymentData
{
/**
* Необходим при оплате PCI-DSS данными.
* @var PaymentDataBankCardCard Данные банковской карты
*/
private $_card;
public function __construct()
{
$this->_setType(PaymentMethodType::BANK_CARD);
}
/**
* @return PaymentDataBankCardCard Данные банковской карты
*/
public function getCard()
{
return $this->_card;
}
/**
* @param PaymentDataBankCardCard|array $value Данные банковской карты
*/
public function setCard($value)
{
if ($value === null || $value === '' || $value === array()) {
$this->_card = null;
} elseif (is_object($value) && $value instanceof PaymentDataBankCardCard) {
$this->_card = $value;
} elseif (is_array($value) || $value instanceof \Traversable) {
$card = new PaymentDataBankCardCard();
foreach ($value as $property => $val) {
$card->offsetSet($property, $val);
}
$this->_card = $card;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid card value type in PaymentDataBankCard', 0, 'PaymentDataBankCard.card', $value
);
}
}
}
@@ -0,0 +1,239 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Common\AbstractObject;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
/**
* Данные банковской карты
* Необходим при оплате PCI-DSS данными.
* @property string $number Номер банковской карты
* @property string $expiryYear Срок действия, год, YY
* @property string $expiry_year Срок действия, год, YY
* @property string $expiryMonth Срок действия, месяц, MM
* @property string $expiry_month Срок действия, месяц, MM
* @property string $csc CVV2/CVC2 код
* @property string $cardholder Имя держателя карты
*/
class PaymentDataBankCardCard extends AbstractObject
{
/**
* @var string Номер банковской карты
*/
private $_number;
/**
* @var string Срок действия, год, YY
*/
private $_expiryYear;
/**
* @var string Срок действия, месяц, MM
*/
private $_expiryMonth;
/**
* @var string CVV2/CVC2 код
*/
private $_csc;
/**
* @var string Имя держателя карты
*/
private $_cardholder;
/**
* @return string Номер банковской карты
*/
public function getNumber()
{
return $this->_number;
}
/**
* @param string $value Номер банковской карты
*/
public function setNumber($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException('Empty card number value', 0, 'PaymentDataBankCardCard.number');
} elseif (TypeCast::canCastToString($value)) {
if (preg_match('/^[0-9]{16,19}$/', (string)$value)) {
$this->_number = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid card number value', 0, 'PaymentDataBankCardCard.number', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid card number value type', 0, 'PaymentDataBankCardCard.number', $value
);
}
}
/**
* @return string Срок действия, год, YYYY
*/
public function getExpiryYear()
{
return $this->_expiryYear;
}
/**
* @param string $value Срок действия, год, YYYY
*/
public function setExpiryYear($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty card expiry year value', 0, 'PaymentDataBankCardCard.expiryYear'
);
} elseif (is_numeric($value)) {
if (!preg_match('/^\d\d\d\d$/', $value) || $value < 2000 || $value > 2200) {
throw new InvalidPropertyValueException(
'Invalid card expiry year value', 0, 'PaymentDataBankCardCard.expiryYear', $value
);
}
$this->_expiryYear = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid card expiry year value', 0, 'PaymentDataBankCardCard.expiryYear', $value
);
}
}
/**
* @return string Срок действия, месяц, MM
*/
public function getExpiryMonth()
{
return $this->_expiryMonth;
}
/**
* @param string $value Срок действия, месяц, MM
*/
public function setExpiryMonth($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty card expiry month value', 0, 'PaymentDataBankCardCard.expiryMonth'
);
} elseif (is_numeric($value)) {
if (!preg_match('/^\d\d$/', $value)) {
throw new InvalidPropertyValueException(
'Invalid card expiry month value', 0, 'PaymentDataBankCardCard.expiryMonth', $value
);
}
if (is_string($value) && $value[0] == '0') {
$month = (int)($value[1]);
} else {
$month = (int)$value;
}
if ($month < 1 || $month > 12) {
throw new InvalidPropertyValueException(
'Invalid card expiry month value', 0, 'PaymentDataBankCardCard.expiryMonth', $value
);
} else {
$this->_expiryMonth = (string)$value;
}
} else {
throw new InvalidPropertyValueException(
'Invalid card expiry month value', 0, 'PaymentDataBankCardCard.expiryMonth', $value
);
}
}
/**
* @return string CVV2/CVC2 код
*/
public function getCsc()
{
return $this->_csc;
}
/**
* @param string $value CVV2/CVC2 код
*/
public function setCsc($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty card CSC code value', 0, 'PaymentDataBankCardCard.csc'
);
} elseif (is_numeric($value)) {
if (preg_match('/^\d{3,4}$/', $value)) {
$this->_csc = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid card CSC code value', 0, 'PaymentDataBankCardCard.csc', $value
);
}
} else {
throw new InvalidPropertyValueException(
'Invalid card CSC code value', 0, 'PaymentDataBankCardCard.csc', $value
);
}
}
/**
* @return string Имя держателя карты
*/
public function getCardholder()
{
return $this->_cardholder;
}
/**
* @param string $value Имя держателя карты
*/
public function setCardholder($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty card holder value', 0, 'PaymentDataBankCardCard.cardholder'
);
} elseif (TypeCast::canCastToString($value)) {
if (preg_match('/^[a-zA-Z\s]{1,26}$/', $value)) {
$this->_cardholder = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid card holder value', 0, 'PaymentDataBankCardCard.cardholder', $value
);
}
} else {
throw new InvalidPropertyValueException(
'Invalid card holder value', 0, 'PaymentDataBankCardCard.cardholder', $value
);
}
}
}
@@ -0,0 +1,81 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Common\Exceptions\InvalidPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\PaymentMethodType;
/**
* PaymentDataCash
* Платежные данные для проведения оплаты Qiwi.
* @property string $phone
*/
class PaymentDataCash extends AbstractPaymentData
{
/**
* Номер телефона в формате ITU-T E.164 на который будет отправлена информация для оплаты.
* @var string
*/
private $_phone;
public function __construct()
{
$this->_setType(PaymentMethodType::CASH);
}
/**
* @return string
*/
public function getPhone()
{
return $this->_phone;
}
/**
* @param string $value
*/
public function setPhone($value)
{
if ($value === null || $value === '') {
$this->_phone = null;
} elseif (TypeCast::canCastToString($value)) {
if (preg_match('/^[0-9]{4,15}$/', $value)) {
$this->_phone = (string)$value;
} else {
throw new InvalidPropertyValueException(
'Invalid phone value', 0, 'PaymentDataCash.phone', $value
);
}
} else {
throw new InvalidPropertyValueTypeException(
'Invalid phone value type', 0, 'PaymentDataCash.phone', $value
);
}
}
}
@@ -0,0 +1,95 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Model\PaymentMethodType;
class PaymentDataFactory
{
private $typeClassMap = array(
PaymentMethodType::YOO_MONEY => 'PaymentDataYooMoney',
PaymentMethodType::BANK_CARD => 'PaymentDataBankCard',
PaymentMethodType::SBERBANK => 'PaymentDataSberbank',
PaymentMethodType::CASH => 'PaymentDataCash',
PaymentMethodType::MOBILE_BALANCE => 'PaymentDataMobileBalance',
PaymentMethodType::APPLE_PAY => 'PaymentDataApplePay',
PaymentMethodType::GOOGLE_PAY => 'PaymentDataGooglePay',
PaymentMethodType::QIWI => 'PaymentDataQiwi',
PaymentMethodType::WEBMONEY => 'PaymentDataWebmoney',
PaymentMethodType::ALFABANK => 'PaymentDataAlfabank',
PaymentMethodType::INSTALLMENTS => 'PaymentDataInstallments',
PaymentMethodType::B2B_SBERBANK => 'PaymentDataB2bSberbank',
PaymentMethodType::TINKOFF_BANK => 'PaymentDataTinkoffBank',
PaymentMethodType::WECHAT => 'PaymentDataWechat',
);
/**
* @param string $type
*
* @return AbstractPaymentData
*/
public function factory($type)
{
if (!is_string($type)) {
throw new \InvalidArgumentException('Invalid payment type value in payment factory');
}
if (!array_key_exists($type, $this->typeClassMap)) {
throw new \InvalidArgumentException('Invalid payment data type "'.$type.'"');
}
$className = __NAMESPACE__.'\\'.$this->typeClassMap[$type];
return new $className();
}
/**
* @param array $data
* @param string|null $type
*
* @return AbstractPaymentData
*/
public function factoryFromArray(array $data, $type = null)
{
if ($type === null) {
if (array_key_exists('type', $data)) {
$type = $data['type'];
unset($data['type']);
} else {
throw new \InvalidArgumentException(
'Parameter type not specified in PaymentDataFactory.factoryFromArray()'
);
}
}
$paymentData = $this->factory($type);
foreach ($data as $key => $value) {
if ($paymentData->offsetExists($key)) {
$paymentData->offsetSet($key, $value);
}
}
return $paymentData;
}
}
@@ -0,0 +1,108 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Common\Exceptions\EmptyPropertyValueException;
use YooKassa\Common\Exceptions\InvalidPropertyValueTypeException;
use YooKassa\Helpers\TypeCast;
use YooKassa\Model\PaymentMethodType;
/**
* PaymentDataGooglePay
* Платежные данные для проведения оплаты при помощи Google Pay.
* @property string $paymentMethodToken Криптограмма Payment Token Cryptography для проведения оплаты через Google Pay
* @property string $googleTransactionId Уникальный идентификатор транзакции, выданный Google
*/
class PaymentDataGooglePay extends AbstractPaymentData
{
/**
* @var string Криптограмма Payment Token Cryptography для проведения оплаты через Google Pay
*/
private $_paymentMethodToken;
/**
* @var string Уникальный идентификатор транзакции, выданный Google
*/
private $_googleTransactionId;
public function __construct()
{
$this->_setType(PaymentMethodType::GOOGLE_PAY);
}
/**
* @return string Криптограмма Payment Token Cryptography для проведения оплаты через Google Pay
*/
public function getPaymentMethodToken()
{
return $this->_paymentMethodToken;
}
/**
* @param string $value Криптограмма Payment Token Cryptography для проведения оплаты через Google Pay
*/
public function setPaymentMethodToken($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty value for paymentMethodToken', 0, 'PaymentDataGooglePay.paymentMethodToken'
);
} elseif (TypeCast::canCastToString($value)) {
$this->_paymentMethodToken = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid value type for paymentMethodToken', 0, 'PaymentDataGooglePay.paymentMethodToken', $value
);
}
}
/**
* @return string Уникальный идентификатор транзакции, выданный Google
*/
public function getGoogleTransactionId()
{
return $this->_googleTransactionId;
}
/**
* @param string $value Уникальный идентификатор транзакции, выданный Google
*/
public function setGoogleTransactionId($value)
{
if ($value === null || $value === '') {
throw new EmptyPropertyValueException(
'Empty value for googleTransactionId', 0, 'PaymentDataGooglePay.googleTransactionId'
);
} elseif (TypeCast::canCastToString($value)) {
$this->_googleTransactionId = (string)$value;
} else {
throw new InvalidPropertyValueTypeException(
'Invalid value type for googleTransactionId', 0, 'PaymentDataGooglePay.googleTransactionId', $value
);
}
}
}
@@ -0,0 +1,40 @@
<?php
/**
* The MIT License
*
* Copyright (c) 2020 "YooMoney", NBСO LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace YooKassa\Model\PaymentData;
use YooKassa\Model\PaymentMethodType;
/**
* Данные для проведения оплаты по частям
*/
class PaymentDataInstallments extends AbstractPaymentData
{
public function __construct()
{
$this->_setType(PaymentMethodType::INSTALLMENTS);
}
}

Some files were not shown because too many files have changed in this diff Show More