diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bfa0621 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +.idea/* diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..551ab9a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +### v1.0.1 +* Добавлена отправка информации о имени CMS и версии используемого модуля в параметре metadata платежа + +### v1.0.0 +* Добавлена возможность создания платежей через API Яндекс.Кассы с использованием Yandex Checkout SDK diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7e1177d --- /dev/null +++ b/LICENSE @@ -0,0 +1,3 @@ +Лицензионный договор. + +Любое использование Вами программы означает полное и безоговорочное принятие Вами условий лицензионного договора, размещенного по адресу https://money.yandex.ru/doc.xml?id=527132 (далее – «Лицензионный договор»). Если Вы не принимаете условия Лицензионного договора в полном объёме, Вы не имеете права использовать программу в каких-либо целях. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b90e93d --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +# yandexmoney-joomla-joomshopping + +С помощью модуля можно настроить прием платежей через Яндекс.Кассу + +[Инструкция по настройке](https://kassa.yandex.ru/manuals/joomshopping) + +### Установка модуля +Для установки данного модуля необходимо: +* перейти в раздел установка/обновление компонента JoomShopping +* указать [архив](https://github.com/yandex-money/yandex-money-cms-v2-joomshopping/blob/master/yandex-money-cms-v2-joomshopping.zip?raw=true) в качестве файла пакета обновления +* загрузить пакет, щелкнув по `Загрузить` + +Пожалуйста, обязательно делайте бекапы! + +Внимание! Если у вас пустая страница конфигурации - у вас неправильно настроен `tmp_path` в файле настроек `configuration.php`и/или папка `/tmp` недоступна для записи на момент установки модуля (исправляется командой `chmod 777 /tmp`). + +### Требования к CMS Joomla: +* версия 2.5.x, 3.2.х - 3.8.х; +* компонент JoomShopping версии 4.х + +### О Кассе +Сервис, который позволяет включить прием платежей на сайте. + +[Сайт Кассы](http://kassa.yandex.ru/) + +#### Условия +* подходит для юрлиц и ИП, +* деньги приходят на расчетный счет, +* комиссия берется с каждого успешного платежа. + +Для использования нужно [подключиться к Яндекс.Кассе](https://money.yandex.ru/joinups) и получить в личном кабинете на сайте Кассы параметры **shopId** и **Секретный ключ**. + +### Способы приема платежей +Вы можете выбрать любое количество способов из списка: + +* Банковские карты — Visa, Mastercard и Maestro, «Мир»; +* Яндекс.Деньги; +* Webmoney; +* QIWI Wallet; +* Наличные; +* Альфа-Клик; +* Сбербанк Онлайн; +* Баланс мобильного — Билайн, Мегафон, МТС, Tele2. + +### Дополнительные возможности + +**Оплата на стороне Яндекса** + +Включите в модуле оплату на стороне Яндекса — и не придется размещать на своем сайте все способы оплаты. Вместо этого останется одна кнопка «Заплатить». + +[Пример в демо-магазине Кассы](https://kassa.yandex.ru/demo/index.html) + +**Отправка данных для чеков по 54-фз** + +Если вы подключите решение Кассы для 54-фз, модуль будет отправлять в Кассу данные для чека вместе с информацией о заказе. + +[Подробности на сайте Кассы](https://kassa.yandex.ru/features) + +### Контакты +Если у вас есть вопросы или идеи для модуля, напишите нам: cms@yamoney.ru + +В письме укажите: +* версию платформы, +* версию модуля (его можно посмотреть на странице настроек), +* идею или проблему, +* снимок экрана, о котором говорите. diff --git a/src/components/com_jshopping/images/yandex_money/ab.png b/src/components/com_jshopping/images/yandex_money/ab.png new file mode 100644 index 0000000..691305a Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/ab.png differ diff --git a/src/components/com_jshopping/images/yandex_money/ac.png b/src/components/com_jshopping/images/yandex_money/ac.png new file mode 100644 index 0000000..ef7b29b Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/ac.png differ diff --git a/src/components/com_jshopping/images/yandex_money/gp.png b/src/components/com_jshopping/images/yandex_money/gp.png new file mode 100644 index 0000000..e2633f7 Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/gp.png differ diff --git a/src/components/com_jshopping/images/yandex_money/ma.png b/src/components/com_jshopping/images/yandex_money/ma.png new file mode 100644 index 0000000..c18599f Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/ma.png differ diff --git a/src/components/com_jshopping/images/yandex_money/mc.png b/src/components/com_jshopping/images/yandex_money/mc.png new file mode 100644 index 0000000..af88e5a Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/mc.png differ diff --git a/src/components/com_jshopping/images/yandex_money/pb.png b/src/components/com_jshopping/images/yandex_money/pb.png new file mode 100644 index 0000000..de8fd95 Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/pb.png differ diff --git a/src/components/com_jshopping/images/yandex_money/pc.png b/src/components/com_jshopping/images/yandex_money/pc.png new file mode 100644 index 0000000..c503dea Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/pc.png differ diff --git a/src/components/com_jshopping/images/yandex_money/qp.png b/src/components/com_jshopping/images/yandex_money/qp.png new file mode 100644 index 0000000..7158f7c Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/qp.png differ diff --git a/src/components/com_jshopping/images/yandex_money/qw.png b/src/components/com_jshopping/images/yandex_money/qw.png new file mode 100644 index 0000000..8bc2679 Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/qw.png differ diff --git a/src/components/com_jshopping/images/yandex_money/sb.png b/src/components/com_jshopping/images/yandex_money/sb.png new file mode 100644 index 0000000..7d67983 Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/sb.png differ diff --git a/src/components/com_jshopping/images/yandex_money/wm.png b/src/components/com_jshopping/images/yandex_money/wm.png new file mode 100644 index 0000000..62beb31 Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/wm.png differ diff --git a/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_kassa.php b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_kassa.php new file mode 100644 index 0000000..516563f --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_kassa.php @@ -0,0 +1,159 @@ + +
+
+

+
+
+
+
+
+
+ /> +
+
+
+
+
+
+

+
+
+
+
+
+
+
+ +

+
+
+
+
+
+
+
+
+
+ +

+
+
+
+
+
+
+

+
+
+
+
+
+
+ />
+ /> +

+
+
+
+
+
+

+
+
+ +
+
+
+ /> + +
+
+
+ + +
+
+
+
+ /> Включить
+ /> Выключить +
+
+
+
+
+
+
+
+
Ставка в вашем магазине
+
Ставка для чека в налоговую
+
+ $tax) { ?> +
+
+
+ +
+
+ +
+ +
+
+
+
+
+
+

+
+
+
+
+ +
+
+

+
+
+
+
+
+
+
+ getAllOrderStatus(), 'pm_params[kassa_transaction_end_status]', 'class="inputbox transaction-end-status" size="1" data-type="kassa"', 'status_id', 'name', $params['kassa_transaction_end_status'] ); + ?> +
+
+
+
+ + \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_money.php b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_money.php new file mode 100644 index 0000000..7ac5e32 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_money.php @@ -0,0 +1,111 @@ + +
+
+

+
+
+
+
+
+
+ /> +
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+

+
+
+
+
+
+
+
+ +

 

+
+
+
+
+
+
+
+
+
+ +

 

+
+
+
+
+
+
+

+
+
+
+
+
+
+ 'PC','cards2'=>'AC'); + foreach ($list_methods as $m_long => $m_short){?> +
+ /> + + +
+ +
+
+
+ +
+
+

+
+
+
+
+
+
+
+ getAllOrderStatus(), 'pm_params[money_transaction_end_status]', 'class="inputbox transaction-end-status" size="1" data-type="money"', 'status_id', 'name', $params['money_transaction_end_status'] ); + ?> +
+
+
+
+ + \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_payments.php b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_payments.php new file mode 100644 index 0000000..838980e --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_payments.php @@ -0,0 +1,66 @@ + +
+
+

+
+
+
+
+
+
+ /> +
+
+
+
+
+
+
+
+
+ +

 

+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+ getAllOrderStatus(), 'pm_params[payments_transaction_end_status]', 'class="inputbox transaction-end-status" size="1" data-type="payments"', 'status_id', 'name', $params['payments_transaction_end_status'] ); + ?>
+

+
+
+
+
+ \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform.php b/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform.php new file mode 100644 index 0000000..6d05722 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform.php @@ -0,0 +1,107 @@ +toString(array("scheme",'host', 'port')); +$sslurlhost = $uri->toString(array('host', 'port')); + +$notify_url = 'https://'.$sslurlhost.SEFLink("index.php?option=com_jshopping&controller=checkout&task=step7&act=notify&js_paymentclass=pm_yandex_money&no_lang=1"); + +function isSelected($params, $type) +{ + $result = null; + foreach (array('kassamode', 'moneymode', 'paymentsmode') as $mode) { + if ($mode === $type) { + if (!empty($params[$mode]) && $params[$mode] == 1) { + $result = true; + } + } elseif (!empty($params[$mode]) && $params[$mode] == 1) { + $result = false; + break; + } + } + return $result === true; +} + +function escapeValue($value) +{ + return htmlspecialchars($value); +} + +?> +
+
+

+

+ + 'kassa-tab')); ?> + + + + + + + + +
+
+
+ \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform2x.php b/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform2x.php new file mode 100644 index 0000000..8b15d69 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform2x.php @@ -0,0 +1,316 @@ + + +
+
+ + + + + + + + + + + + + +toString(array("scheme",'host', 'port')); + $sslUrlHost = 'https://'.$uri->toString(array('host', 'port')); + + $notify_url = $sslUrlHost.SEFLink("index.php?option=com_jshopping&controller=checkout&task=step7&act=notify&js_paymentclass=pm_yandex_money&no_lang=1"); +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'PC','cards'=>'AC'); +foreach ($list_methods as $m_long => $m_short) : ?> + + + + + + + + + + + + + + + + + + id="select_send_check"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + :

+ + + + + + + + + +
Redirect URI
+
+ + + +

+
+ + + +

+
+

+


+ /> Включить
+ /> Выключить +
+ + + +
+ + + +
+ + + +

+ + + +


+ + + + + getAllOrderStatus(), 'pm_params[transaction_end_status]', 'class = "inputbox" size = "1"', 'status_id', 'name', $params['transaction_end_status'] ); ?> + + + + + +


+ :

+ + + + + + + + + +
Адрес для уведомлений +
+

Этот адрес понадобится, только если его попросят специалисты Яндекс.Кассы

+
+
+
+
+
+ diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lang/ru-RU.php b/src/components/com_jshopping/payments/pm_yandex_money/lang/ru-RU.php new file mode 100644 index 0000000..70d29b6 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lang/ru-RU.php @@ -0,0 +1,117 @@ +Яндекс.Кассе."); +define('_JSHOP_YM_VERSION_DESCRIPTION','Версия модуля '); + +define('_JSHOP_YM_TAB_MONEY', 'Яндекс.Деньги'); +define('_JSHOP_YM_TAB_KASSA', 'Яндекс.Касса'); +define('_JSHOP_YM_TAB_PAYMENTS', 'Яндекс.Платежка'); + +define('_JSHOP_YM_KASSA_ON', 'Включить приём платежей через Яндекс.Кассу'); +define('_JSHOP_YM_KASSA_TEST', 'Тестовый режим'); +define('_JSHOP_YM_KASSA_WORK', 'Реальный режим'); +define('_JSHOP_YM_KASSA_HELP_CHECKURL', 'Этот адрес понадобится, только если его попросят специалисты Яндекс.Кассы'); +define('_JSHOP_YM_KASSA_HELP_SUCCESSURL', 'Включите «Использовать страницы успеха и ошибки с динамическими адресами» в настройках личного кабинета Яндекс.Кассы'); +define('_JSHOP_YM_KASSA_HELP_DYNAMICURL', 'Страницы с динамическими адресами'); + +define('_JSHOP_YM_KASSA_HEAD_LK', 'Параметры из личного кабинета Яндекс.Кассы'); +define('_JSHOP_YM_KASSA_SHOP_ID_LABEL', 'shopId'); +define('_JSHOP_YM_KASSA_SHOP_ID_DESCRIPTION', 'Скопируйте shopId из личного кабинета Яндекс.Кассы'); +define('_JSHOP_YM_KASSA_PASSWORD_LABEL', 'Секретный ключ'); +define('_JSHOP_YM_KASSA_PASSWORD_DESCRIPTION', 'Выпустите и активируйте секретный ключ в личном кабинете Яндекс.Кассы. Потом скопируйте его сюда.'); +define('_JSHOP_YM_KASSA_PARAMS', 'Shop ID, scid, ShopPassword можно посмотреть в личном кабинете после подключения Яндекс.Кассы.'); + +define('_JSHOP_YM_KASSA_PAYMODE_HEAD', 'Настройка сценария оплаты'); +define('_JSHOP_YM_KASSA_PAYMODE_LABEL', 'Выбор способа оплаты'); +define('_JSHOP_YM_KASSA_SEND_RECEIPT_LABEL', 'Отправлять в Яндекс.Кассу данные для чеков (54-ФЗ)'); +define('_JSHOP_YM_KASSA_PAYMODE_KASSA', 'На стороне Кассы'); +define('_JSHOP_YM_KASSA_PAYMODE_SHOP', 'На стороне магазина'); +define('_JSHOP_YM_KASSA_PAYMODE_LINK', 'Подробнее о сценариях оплаты'); +define('_JSHOP_YM_KASSA_SELECT_TEXT', 'Отметьте способы оплаты, которые указаны в вашем договоре с Яндекс.Деньгами'); +define('_JSHOP_YM_METHOD_YANDEX_MONEY_DESCRIPTION', 'Яндекс.Деньги'); +define('_JSHOP_YM_METHOD_CARDS_DESCRIPTION', 'Банковские карты'); +define('_JSHOP_YM_METHOD_BANK_CARD_DESCRIPTION', 'Банковские карты'); +define('_JSHOP_YM_METHOD_CASH_DESCRIPTION', 'Наличные через терминалы'); +define('_JSHOP_YM_METHOD_MOBILE_BALANCE_DESCRIPTION', 'Баланс мобильного'); +define('_JSHOP_YM_METHOD_WEBMONEY_DESCRIPTION', 'Кошелек WebMoney'); +define('_JSHOP_YM_METHOD_ALFABANK_DESCRIPTION', 'Альфа-Клик'); +define('_JSHOP_YM_METHOD_SBERBANK_DESCRIPTION', 'Сбербанк Онлайн'); +define('_JSHOP_YM_METHOD_MA_DESCRIPTION', 'MasterPass'); +define('_JSHOP_YM_METHOD_PB_DESCRIPTION', 'Интернет-банк Промсвязьбанка'); +define('_JSHOP_YM_METHOD_QIWI_DESCRIPTION', 'QIWI Wallet'); +define('_JSHOP_YM_METHOD_QP_DESCRIPTION', 'Доверительный платеж (Куппи.ру)'); +define('_JSHOP_YM_METHOD_MP_DESCRIPTION', 'Мобильный терминал'); +define('_JSHOP_YM_KASSA_MPOS_LABEL', 'Страница успеха для способа «Оплата картой при доставке»'); +define('_JSHOP_YM_KASSA_MPOS_HELP', 'Это страница с информацией о доставке. Укажите на ней, когда привезут товар и как его можно будет оплатить'); + +define('_JSHOP_YM_MONEY_HEAD', 'Для работы с модулем нужно открыть кошелек на Яндексе и + зарегистрировать приложение на сайте Яндекс.Денег'); +define('_JSHOP_YM_MONEY_ON', 'Включить прием платежей в кошелек на Яндексе'); +define('_JSHOP_YM_MONEY_REDIRECT_HELP', 'Скопируйте эту ссылку в поле Redirect URL на странице регистрации приложения.'); + +define('_JSHOP_YM_MONEY_SET_HEAD', 'Настройки приема платежей'); +define('_JSHOP_YM_MONEY_WALLET', 'Номер кошелька'); +define('_JSHOP_YM_MONEY_PSW', 'Секретное слово'); + +define('_JSHOP_YM_MONEY_SELECT_HEAD', 'Настройка сценария оплаты'); +define('_JSHOP_YM_MONEY_SELECT_LABEL', 'Способы оплаты'); +define('_JSHOP_YM_METHOD_YM2_DESCRIPTION', 'Кошелек Яндекс.Деньги'); +define('_JSHOP_YM_METHOD_CARDS2_DESCRIPTION', 'Банковская карта'); + +define('_JSHOP_YM_COMMON_HEAD', 'Дополнительные настройки для администратора'); +define('_JSHOP_YM_COMMON_STATUS', 'Статус заказа после оплаты'); + +define('_JSHOP_YM_PAYMENTS_HEAD', 'Это платежная форма на ваш сайт. Позволяет принимать платежи на счет компании — с +карт и из кошельков Яндекс.Денег, без договора.
+Для настройки нужен ID формы: он придет в письме, когда вы +соберете форму в конструкторе.'); + +define('_JSHOP_YM_PAYMENTS_ON', 'Включить прием платежей через Платежку'); +define('_JSHOP_YM_PAYMENTS_ID_LABEL', 'ID формы'); +define('_JSHOP_YM_PAYMENTS_DESCRIPTION_LABEL', 'Назначение платежа'); +define('_JSHOP_YM_PAYMENTS_DESCRIPTION_PLACEHOLDER', 'Номер заказа %order_id%. Оплата через Яндекс.Платежку'); +define('_JSHOP_YM_PAYMENTS_DESCRIPTION_INFO', 'Назначение будет в платежном поручении от банка. Напишите в нем всё, +что поможет отличить заказ, который оплатили через Платежку.'); +define('_JSHOP_YM_PAYMENTS_STATUS_LABEL', 'Статус заказа'); +define('_JSHOP_YM_PAYMENTS_STATUS_INFO', 'Статус должен показать, что результат платежа неизвестен: о том, что клиент +заплатил, можно узнать только из письма от Платежки или в своем банке.'); +define('_JSHOP_YM_PAYMENTS_FIO_LABEL', 'ФИО плательщика'); +define('_JSHOP_YM_PAYMENTS_CONFIRM_LABEL', 'Далее'); +define('_JSHOP_YM_PAYMENTS_EMPTY_NAME_ERROR', 'Укажите ФИО плательщика'); +define('_JSHOP_YM_PAYMENTS_INVALID_NAME_ERROR', 'ФИО плательщика должно состоять из фамилии, имени и отчества, разделённых пробелами'); + +// версия 2.х +define('_JSHOP_YM_LICENSE','Лицензионный договор:'); +define('_JSHOP_YM_LICENSE_TEXT2',"

Любое использование Вами программы означает полное и безоговорочное принятие Вами условий лицензионного договора, размещенного по адресу https://money.yandex.ru/doc.xml?id=527132 (далее – «Лицензионный договор»). Если Вы не принимаете условия Лицензионного договора в полном объёме, Вы не имеете права использовать программу в каких-либо целях.

"); +define('_JSHOP_YM_TESTMODE_DESCRIPTION', 'Использовать в тестовом режиме?'); +define('_JSHOP_YM_MODE_DESCRIPTION', 'Способ приема платежей:'); +define('_JSHOP_YM_MODE1_DESCRIPTION', 'Яндекс.Денеги'); +define('_JSHOP_YM_MODE2_DESCRIPTION', 'Яндекс.Касса (выбор оплаты на стороне сайта)'); +define('_JSHOP_YM_MODE3_DESCRIPTION', 'Яндекс.Касса (выбор оплаты на стороне Яндекс.Кассы)'); +define('_JSHOP_YM_MODE4_DESCRIPTION', 'Яндекс.Платежка (банковские карты, кошелек)'); +define('_JSHOP_YM_REG_IND', 'Если у вас нет аккаунта в Яндекс-Деньги, то следует зарегистрироваться тут - https://money.yandex.ru/
ВАЖНО! Вам нужно будет указать ссылку для приема HTTP уведомлений здесь - https://sp-money.yandex.ru/myservices/online.xml'); + +define('_JSHOP_YM_REG_ORG', 'Для работы с модулем необходимо подключить магазин к Яндек.Кассе. После подключения вы получите параметры для приема платежей (идентификатор магазина — shopId и номер витрины — scid).'); +define('_JSHOP_YM_METHODS_DESCRIPTION', 'Укажите необходимые способы оплаты'); +define('_JSHOP_YM_PASSWORD', 'Секретное слово (shopPassword) для обмена сообщениями:'); +define('_JSHOP_YM_SHOPID', 'Идентификатор вашего магазина в Яндекс.Деньгах (ShopID):'); +define('_JSHOP_YM_SCID', 'Идентификатор витрины вашего магазина в Яндекс.Деньгах (scid):'); +define('_JSHOP_YM_PARAM', 'Название параметра'); +define('_JSHOP_YM_VALUE', 'Значение'); +define('_JSHOP_YM_RETURNURL', 'Динамический'); +define('_JSHOP_YM_ACCOUNT_DESCRIPTION', 'Номер кошелька Яндекс:'); + +define('_JSHOP_YM_PAY', 'Оплатить!'); +define('_JSHOP_YM_TRANSACTION_END', 'Статус заказа для успешных транзакций'); +define('_JSHOP_YM_TEXT_MPOS', 'Страница с инструкцией для платеждей через мобильный терминал!'); \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/KassaPaymentMethod.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/KassaPaymentMethod.php new file mode 100644 index 0000000..f1c9683 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/KassaPaymentMethod.php @@ -0,0 +1,241 @@ +module = $module; + $this->shopId = $pmConfig['shop_id']; + $this->password = $pmConfig['shop_password']; + + $this->defaultTaxRateId = 1; + if (isset($pmConfig['tax_id'])) { + if (isset($pmConfig['ya_kassa_tax_'.$pmConfig['tax_id']])) { + $this->defaultTaxRateId = $pmConfig['ya_kassa_tax_'.$pmConfig['tax_id']]; + } + } + + $this->taxRates = array(); + foreach ($pmConfig as $key => $value) { + if (strncmp('ya_kassa_tax_', $key, 13) === 0) { + $taxRateId = substr($key, 13); + $this->taxRates[$taxRateId] = $value; + } + } + } + + public function getShopId() + { + return $this->shopId; + } + + public function getPassword() + { + return $this->password; + } + + public function createPayment($order, $cart, $returnUrl) + { + try { + $builder = CreatePaymentRequest::builder(); + $builder->setAmount($order->order_total) + ->setCapture(false) + ->setClientIp($_SERVER['REMOTE_ADDR']) + ->setMetadata(array( + 'order_id' => $order->order_id, + 'cms_name' => 'ya_api_joomshopping', + 'module_version' => _JSHOP_YM_VERSION, + )); + + $confirmation = array( + 'type' => ConfirmationType::REDIRECT, + 'returnUrl' => $returnUrl, + ); + $params = unserialize($order->payment_params_data); + if (!empty($params['payment_type'])) { + $paymentType = $params['payment_type']; + if ($paymentType === PaymentMethodType::ALFABANK) { + $paymentType = array( + 'type' => $paymentType, + 'login' => trim($params['alfaLogin']), + ); + $confirmation = ConfirmationType::EXTERNAL; + } elseif ($paymentType === PaymentMethodType::QIWI) { + $paymentType = array( + 'type' => $paymentType, + 'phone' => preg_replace('/[^\d]+/', '', $params['qiwiPhone']), + ); + } + $builder->setPaymentMethodData($paymentType); + } + $builder->setConfirmation($confirmation); + + $receipt = null; + if (count($cart->products) && isset($pmConfigs['ya_kassa_send_check']) && $pmConfigs['ya_kassa_send_check']) { + $this->factoryReceipt($builder, $cart, $order); + } + + $request = $builder->build(); + if ($request->hasReceipt()) { + $request->getReceipt()->normalize($request->getAmount()); + } + } catch (\Exception $e) { + $this->module->log('error', 'Failed to build request: ' . $e->getMessage()); + return null; + } + + try { + $tries = 0; + $key = uniqid('', true); + do { + $payment = $this->getClient()->createPayment($request, $key); + if ($payment === null) { + $tries++; + if ($tries > 3) { + break; + } + sleep(2); + } + } while ($payment === null); + } catch (\Exception $e) { + $this->module->log('error', 'Failed to create payment: ' . $e->getMessage()); + return null; + } + return $payment; + } + + /** + * @param PaymentInterface $notificationPayment + * @param bool $fetchPayment + * @return PaymentInterface|null + */ + public function capturePayment($notificationPayment, $fetchPayment = true) + { + if ($fetchPayment) { + $payment = $this->fetchPayment($notificationPayment->getId()); + } else { + $payment = $notificationPayment; + } + if ($payment->getStatus() !== PaymentStatus::WAITING_FOR_CAPTURE) { + return $payment->getStatus() === PaymentStatus::SUCCEEDED ? $payment : null; + } + + try { + $builder = CreateCaptureRequest::builder(); + $builder->setAmount($payment->getAmount()); + $request = $builder->build(); + } catch (\Exception $e) { + $this->module->log('error', 'Failed to create capture payment: ' . $e->getMessage()); + return null; + } + + try { + $tries = 0; + $key = uniqid('', true); + do { + $response = $this->getClient()->capturePayment($request, $payment->getId(), $key); + if ($response === null) { + $tries++; + if ($tries > 3) { + break; + } + sleep(2); + } + } while ($response === null); + } catch (\Exception $e) { + $this->module->log('error', 'Failed to capture payment: ' . $e->getMessage()); + return null; + } + + return $response; + } + + /** + * @param string $paymentId + * @return PaymentInterface|null + */ + public function fetchPayment($paymentId) + { + $payment = null; + try { + $payment = $this->getClient()->getPaymentInfo($paymentId); + } catch (\Exception $e) { + $this->module->log('error', 'Failed to fetch payment information from API: ' . $e->getMessage()); + } + return $payment; + } + + /** + * @param \YaMoney\Request\Payments\CreatePaymentRequestBuilder $builder + * @param $cart + * @param $order + */ + private function factoryReceipt($builder, $cart, $order) + { + $shippingModel = \JSFactory::getTable('shippingMethod', 'jshop'); + $shippingMethods = $shippingModel->getAllShippingMethodsCountry($order->d_country, $order->payment_method_id); + + $builder->setTaxSystemCode($this->defaultTaxRateId); + $builder->setReceiptEmail($order->email); + + $shipping = false; + foreach ($shippingMethods as $tmp) { + if ($tmp->shipping_id == $order->shipping_method_id) { + $shipping = $tmp; + } + } + + foreach ($cart->products as $product) { + if (isset($product['tax_id']) && isset($this->taxRates[$product['tax_id']])) { + $taxId = $this->taxRates[$product['tax_id']]; + $builder->addReceiptItem($product['product_name'], $product['price'], $product['quantity'], $taxId); + } else { + $builder->addReceiptItem($product['product_name'], $product['price'], $product['quantity']); + } + } + + if ($order->shipping_method_id && $shipping) { + if (isset($this->taxRates[$shipping->shipping_tax_id])) { + $taxId = $this->taxRates[$shipping->shipping_tax_id]; + $builder->addReceiptShipping($shipping->name, $shipping->shipping_stand_price, $taxId); + } else { + $builder->addReceiptShipping($shipping->name, $shipping->shipping_stand_price); + } + } + } + + /** + * @return YandexMoneyApi + */ + private function getClient() + { + if ($this->client === null) { + $this->client = new YandexMoneyApi(); + $this->client->setAuth($this->shopId, $this->password); + $this->client->setLogger($this->module); + } + return $this->client; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/OrderModel.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/OrderModel.php new file mode 100644 index 0000000..c5e5de4 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/OrderModel.php @@ -0,0 +1,119 @@ +_db = \JFactory::getDbo(); + } + + public function savePayment($orderId, $payment) + { + $query = $this->_db->getQuery(true); + $query->select('payment_id') + ->from('#__ya_money_payments') + ->where($this->_db->quoteName('order_id') . ' = ' . (int)$orderId); + $this->_db->setQuery($query); + $record = $this->_db->loadRow(); + if (empty($record)) { + $this->insertPayment($orderId, $payment); + } else { + $this->updatePayment($orderId, $payment); + } + } + + public function getPaymentIdByOrderId($orderId) + { + $query = $this->_db->getQuery(true); + $query->select('payment_id') + ->from('#__ya_money_payments') + ->where($this->_db->quoteName('order_id') . ' = ' . (int)$orderId); + $this->_db->setQuery($query); + $record = $this->_db->loadRow(); + if (empty($record)) { + return null; + } + return $record[0]; + } + + /** + * @param int $orderId + * @param PaymentInterface $payment + */ + private function insertPayment($orderId, $payment) + { + $paymentMethodId = ''; + if ($payment->getPaymentMethod() !== null) { + $paymentMethodId = $payment->getPaymentMethod()->getId(); + } + + $query = $this->_db->getQuery(true); + $query->clear()->insert('#__ya_money_payments') + ->columns( + array( + $this->_db->quoteName('order_id'), $this->_db->quoteName('payment_id'), + $this->_db->quoteName('status'), $this->_db->quoteName('amount'), + $this->_db->quoteName('currency'), $this->_db->quoteName('payment_method_id'), + $this->_db->quoteName('paid'), $this->_db->quoteName('created_at') + ) + ) + ->values( + (int)$orderId . ',' + . $this->_db->quote($payment->getId()) . "," + . $this->_db->quote($payment->getStatus()) . "," + . $this->_db->quote($payment->getAmount()->getValue()) . "," + . $this->_db->quote($payment->getAmount()->getCurrency()) . "," + . $this->_db->quote($paymentMethodId) . "," + . "'" . ($payment->getPaid() ? 'Y' : 'N') . "'," + . $this->_db->quote($payment->getCreatedAt()->format('Y-m-d H:i:s')) + ); + $this->_db->setQuery($query); + try { + $this->_db->execute(); + } + catch (\JDatabaseExceptionExecuting $e) { + \JError::raiseError(500, $e->getMessage()); + } + } + + /** + * @param int $orderId + * @param PaymentInterface $payment + */ + private function updatePayment($orderId, $payment) + { + $paymentMethodId = ''; + if ($payment->getPaymentMethod() !== null) { + $paymentMethodId = $payment->getPaymentMethod()->getId(); + } + + $query = $this->_db->getQuery(true); + $query->update('#__ya_money_payments') + ->set( + $this->_db->quoteName('payment_id') . ' = ' . $this->_db->quoteName('payment_id') . ',' . + $this->_db->quoteName('status') . ' = ' . $this->_db->quote($payment->getStatus()) . ',' . + $this->_db->quoteName('amount') . ' = ' . $this->_db->quote($payment->getAmount()->getValue()) . ',' . + $this->_db->quoteName('currency') . ' = ' . $this->_db->quote($payment->getAmount()->getCurrency()) . ',' . + $this->_db->quoteName('payment_method_id') . ' = ' . $this->_db->quote($paymentMethodId) . ',' . + $this->_db->quoteName('paid') . ' = \'' . ($payment->getPaid() ? 'Y' : 'N') . '\',' . + $this->_db->quoteName('created_at') . ' = ' . $this->_db->quote($payment->getCreatedAt()->format('Y-m-d H:i:s')) + ) + ->where($this->_db->quoteName('order_id') . ' = ' . (int)$orderId); + $this->_db->setQuery($query); + try { + $this->_db->execute(); + } + catch (\JDatabaseExceptionExecuting $e) { + \JError::raiseError(500, $e->getMessage()); + } + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/autoload.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/autoload.php new file mode 100644 index 0000000..b3ca8b2 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/autoload.php @@ -0,0 +1,36 @@ + 'application/json', + 'Accept' => 'application/json' + ); + + /** + * @var resource + */ + private $curl; + + /** + * @var LoggerInterface|null + */ + private $logger; + + /** + * @param LoggerInterface|null $logger + */ + public function setLogger($logger) + { + $this->logger = $logger; + } + + /** + * @inheritdoc + */ + public function call($path, $method, $queryParams, $httpBody = null, $headers = array()) + { + if ($this->logger !== null) { + $message = 'Send request: ' . $method . ' ' . $path; + if (!empty($queryParams)) { + $message .= ' with query params: ' . json_encode($queryParams); + } + if (!empty($httpBody)) { + $message .= ' with body: ' . $httpBody; + } + if (!empty($httpBody)) { + $message .= ' with headers: ' . json_encode($headers); + } + $this->logger->info($message); + } + + $url = $this->getUrl() . $path; + + if (!empty($queryParams)) { + $url = $url . '?' . http_build_query($queryParams); + } + + $headers = $this->prepareHeaders($headers); + + $this->initCurl(); + + $this->setCurlOption(CURLOPT_URL, $url); + + $this->setCurlOption(CURLOPT_RETURNTRANSFER, true); + + $this->setCurlOption(CURLOPT_HEADER, true); + + $this->setCurlOption(CURLOPT_BINARYTRANSFER, true); + + if (!$this->shopId || !$this->shopPassword) { + throw new AuthorizeException('shopId or shopPassword not set'); + } else { + $this->setCurlOption(CURLOPT_USERPWD, "{$this->shopId}:{$this->shopPassword}"); + } + + $this->setBody($method, $httpBody); + + $this->setCurlOption(CURLOPT_HTTPHEADER, $headers); + + $this->setCurlOption(CURLOPT_CONNECTTIMEOUT, $this->connectionTimeout); + + $this->setCurlOption(CURLOPT_TIMEOUT, $this->timeout); + + list($httpHeaders, $httpBody, $responseInfo) = $this->sendRequest(); + + if (!$this->keepAlive) { + $this->closeCurlConnection(); + } + + if ($this->logger !== null) { + $message = 'Response with code ' . $responseInfo['http_code'] . ' received with headers: ' + . json_encode($httpHeaders); + if (!empty($httpBody)) { + $message .= ' and body: ' . $httpBody; + } + $this->logger->info($message); + } + + 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 + */ + private function initCurl() + { + 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 + */ + 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 + * @throws ApiException + */ + public function setBody($method, $httpBody) + { + switch ($method) { + case HttpVerb::POST: + $this->setCurlOption(CURLOPT_POST, true); + $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody); + break; + case HttpVerb::PUT: + $this->setCurlOption(CURLOPT_CUSTOMREQUEST, "PUT"); + $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody); + break; + case HttpVerb::DELETE: + $this->setCurlOption(CURLOPT_CUSTOMREQUEST, "DELETE"); + $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody); + break; + case HttpVerb::PATCH: + $this->setCurlOption(CURLOPT_CUSTOMREQUEST, "PATCH"); + $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody); + break; + case HttpVerb::OPTIONS: + $this->setCurlOption(CURLOPT_CUSTOMREQUEST, "OPTIONS"); + $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody); + break; + case HttpVerb::HEAD: + $this->setCurlOption(CURLOPT_NOBODY, true); + break; + case HttpVerb::GET: + break; + default: + throw new ApiException('Invalid method verb: ' . $method); + } + } + + /** + * @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 mixed + */ + public function getConfig() + { + return $this->config; + } + + /** + * @param mixed $config + */ + public function setConfig($config) + { + $this->config = $config; + } + + /** + * @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 Yandex Money 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 bool $keepAlive + * @return CurlClient + */ + public function setKeepAlive($keepAlive) + { + $this->keepAlive = $keepAlive; + return $this; + } + + /** + * @param $headers + * @return array + */ + private function prepareHeaders($headers) + { + $headers = array_merge($this->defaultHeaders, $headers); + $headers = array_map(function ($key, $value) { + return $key . ":" . $value; + }, array_keys($headers), $headers); + + return $headers; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/StreamClient.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/StreamClient.php new file mode 100644 index 0000000..f2871e4 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/StreamClient.php @@ -0,0 +1,280 @@ +logger = $logger; + } + + /** + * @inheritdoc + */ + public function call($path, $method, $queryParams, $httpBody = null, $headers = array()) + { + if ($this->logger !== null) { + $message = 'Send request: ' . $method . ' ' . $path; + if (!empty($queryParams)) { + $message .= ' with query params: ' . json_encode($queryParams); + } + if (!empty($httpBody)) { + $message .= ' with body: ' . $httpBody; + } + if (!empty($httpBody)) { + $message .= ' with headers: ' . json_encode($headers); + } + $this->logger->info($message); + } + + $url = $this->getUrl() . $path; + + $options = array( + 'http' => array( + 'method' => $method, + 'header' => $this->prepareHeaders($headers), + 'content' => $httpBody, + 'timeout' => $this->timeout, + 'ignore_errors' => true + ), + 'ssl' => array( + 'verify_peer' => true, + 'verify_peer_name' => true, + ), + ); + + $this->initStream($options); + if ($this->sendRequest($url)) { + $httpHeaders = array_map(function ($header) { + return explode(':', $header); + }, $this->responseHeaders); + $httpBody = $this->responseBody; + + if ($this->logger !== null) { + $message = 'Response with code 200 received with headers: ' + . json_encode($httpHeaders); + if (!empty($httpBody)) { + $message .= ' and body: ' . $httpBody; + } + $this->logger->info($message); + } + + return new ResponseObject(array( + 'headers' => $httpHeaders, + 'body' => $httpBody + )); + } else { + throw new ApiConnectionException('Stream returned an empty response', 660); + } + } + + /** + * @param $url + * @return bool + */ + public function sendRequest($url) + { + $response = $this->fileGetContents($url); + $this->setData($response); + return (bool)$response; + } + + /** + * @param array $headers + * @return string + */ + public function prepareHeaders($headers) + { + $headers = array_merge($this->getDefaultHeaders(), $headers); + + $headersPrepared = array_map(function ($key, $value) { + return $key . ":" . $value; + }, array_keys($headers), $headers); + + return implode("\r\n", $headersPrepared); + } + + /** + * @return array + */ + public function getConfig() + { + return $this->config; + } + + /** + * @param array $config + */ + public function setConfig($config) + { + $this->config = $config; + } + + /** + * @param array $options + */ + public function initStream($options) + { + $this->stream = stream_context_create($options); + } + + /** + * @param $url + * @return bool|string + */ + private function fileGetContents($url) + { + $fp = fopen($url, 'rb', false, $this->stream); + $metadata = stream_get_meta_data($fp); + $response = stream_get_contents($fp); + return $response; + } + + /** + * @param $response + */ + private function setData($response) + { + $this->responseBody = $response; + $this->responseHeaders = $http_response_header ?: array(); + } + + /** + * @return string + */ + private function getUrl() + { + $config = $this->config; + return $config['url']; + } + + /** + * @return string + */ + public function getShopId() + { + return $this->shopId; + } + + /** + * @param string $shopId + * @return $this + */ + public function setShopId($shopId) + { + $this->shopId = $shopId; + return $this; + } + + /** + * @return string + */ + public function getShopPassword() + { + return $this->shopPassword; + } + + /** + * @param string $shopPassword + * @return $this + */ + public function setShopPassword($shopPassword) + { + $this->shopPassword = $shopPassword; + return $this; + } + + /** + * @return array + */ + private function getDefaultHeaders() + { + return array( + 'Authorization' => $this->generateAuth(), + 'Content-Type' => 'application/json', + 'Accept' => 'application/json' + ); + } + + /** + * @return string + * @throws AuthorizeException + */ + private function generateAuth() + { + if (!$this->shopId || !$this->shopPassword) { + throw new AuthorizeException('shopId or shopPassword not set'); + } + return 'Basic ' . base64_encode($this->shopId . $this->shopPassword); + } + + /** + * @return int + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * @param int $timeout + */ + public function setTimeout($timeout) + { + $this->timeout = $timeout; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/YandexMoneyApi.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/YandexMoneyApi.php new file mode 100644 index 0000000..170d453 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/YandexMoneyApi.php @@ -0,0 +1,487 @@ +load()->getConfig(); + $this->setConfig($config); + $apiClient->setConfig($config); + } + + $this->apiClient = $apiClient; + } + + /** + * @param $login + * @param $password + * @return YandexMoneyApi $this + */ + public function setAuth($login, $password) + { + $this->login = $login; + $this->password = $password; + + $this->apiClient + ->setShopId($this->login) + ->setShopPassword($this->password); + + return $this; + } + + /** + * @return ApiClientInterface + */ + public function getApiClient() + { + return $this->apiClient; + } + + /** + * @param ApiClientInterface $apiClient + * + * @return YandexMoneyApi + */ + 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); + } + } + + /** + * Доступные способы оплаты. + * Используйте этот метод, чтобы получить способы оплаты и сценарии, доступные для вашего заказа. + * @param PaymentOptionsRequestInterface $paymentOptionsRequest + * @return PaymentOptionsResponse + */ + public function getPaymentOptions(PaymentOptionsRequestInterface $paymentOptionsRequest = null) + { + $path = "/payment_options"; + + if ($paymentOptionsRequest === null) { + $queryParams = array(); + } else { + $serializer = new PaymentOptionsRequestSerializer(); + $serializedData = $serializer->serialize($paymentOptionsRequest); + $queryParams = $serializedData; + } + + $response = $this->apiClient->call($path, HttpVerb::GET, $queryParams); + + $result = null; + if ($response->getCode() == 200) { + $responseArray = json_decode($response->getBody(), true); + $result = new PaymentOptionsResponse($responseArray); + } else { + $this->handleError($response); + } + return $result; + } + + /** + * Получить список платежей магазина. + * @param PaymentsRequestInterface $payments + * @return PaymentsResponse + */ + public function getPayments(PaymentsRequestInterface $payments = null) + { + $path = '/payments'; + + if ($payments) { + $serializer = new PaymentsRequestSerializer(); + $serializedData = $serializer->serialize($payments); + $queryParams = $serializedData; + } else { + $queryParams = array(); + } + + $response = $this->apiClient->call($path, HttpVerb::GET, $queryParams); + $paymentResponse = null; + if ($response->getCode() == 200) { + $responseArray = json_decode($response->getBody(), true); + $paymentResponse = new PaymentsResponse($responseArray); + } else { + $this->handleError($response); + } + return $paymentResponse; + } + + /** + * Проведение оплаты. + * + * @param CreatePaymentRequestInterface $payment + * @param null $idempotencyKey + * + * @return CreatePaymentResponse + * @throws BadApiRequestException + * @throws ForbiddenException + * @throws InternalServerError + * @throws UnauthorizedException + */ + public function createPayment(CreatePaymentRequestInterface $payment, $idempotencyKey = null) + { + $path = '/payments'; + + $headers = array(); + + if ($idempotencyKey) { + $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey; + } + + $serializer = new CreatePaymentRequestSerializer(); + $serializedData = $serializer->serialize($payment); + $httpBody = $this->encodeData($serializedData); + + $response = $this->apiClient->call($path, HttpVerb::POST, null, $httpBody, $headers); + $paymentResponse = null; + if ($response->getCode() == 200) { + $resultArray = json_decode($response->getBody(), true); + $paymentResponse = new CreatePaymentResponse($resultArray); + } else { + $this->handleError($response); + } + return $paymentResponse; + } + + /** + * Получить информацию о платеже + * @param $paymentId + * @return PaymentResponse + */ + public function getPaymentInfo($paymentId) + { + if ($paymentId === null) { + throw new \InvalidArgumentException('Missing the required parameter $paymentId'); + } + + $path = '/payments/' . $paymentId; + + $response = $this->apiClient->call($path, HttpVerb::GET, null); + $result = null; + if ($response->getCode() == 200) { + $resultArray = json_decode($response->getBody(), true); + $result = new PaymentResponse($resultArray); + } else { + $this->handleError($response); + } + return $result; + } + + /** + * Подтвердить оплату. + * @param CreateCaptureRequestInterface $captureRequest + * @param $paymentId + * @param null $idempotencyKey + * @return CreateCaptureResponse + */ + public function capturePayment(CreateCaptureRequestInterface $captureRequest, $paymentId, $idempotencyKey = null) + { + if ($paymentId === null) { + throw new \InvalidArgumentException('Missing the required parameter $paymentId'); + } + + $path = '/payments/' . $paymentId . '/capture'; + + $headers = array(); + + if ($idempotencyKey) { + $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey; + } + + $serializer = new CreateCaptureRequestSerializer(); + $serializedData = $serializer->serialize($captureRequest); + $httpBody = $this->encodeData($serializedData); + $response = $this->apiClient->call($path, HttpVerb::POST, null, $httpBody, $headers); + + $result = null; + if ($response->getCode() == 200) { + $resultArray = json_decode($response->getBody(), true); + $result = new CreateCaptureResponse($resultArray); + } else { + $this->handleError($response); + } + return $result; + } + + /** + * Отменить незавершенную оплату заказа. + * @param $paymentId + * @param null $idempotencyKey + * @return CancelResponse + */ + public function cancelPayment($paymentId, $idempotencyKey = null) + { + if ($paymentId === null) { + throw new \InvalidArgumentException('Missing the required parameter $paymentId'); + } + + $path = '/payments/' . $paymentId . '/cancel'; + + $headers = array(); + + if ($idempotencyKey) { + $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey; + } + + $response = $this->apiClient->call($path, HttpVerb::POST, null, null, $headers); + + $result = null; + if ($response->getCode() == 200) { + $resultArray = json_decode($response->getBody(), true); + $result = new CancelResponse($resultArray); + } else { + $this->handleError($response); + } + return $result; + } + + /** + * Получить список возвратов платежей + * @param RefundsRequestInterface $refundsRequest + * @return RefundsResponse + */ + public function getRefunds(RefundsRequestInterface $refundsRequest = null) + { + $path = '/refunds'; + + if ($refundsRequest) { + $serializer = new RefundsRequestSerializer(); + $serializedData = $serializer->serialize($refundsRequest); + + $queryParams = $serializedData; + } else { + $queryParams = array(); + } + + $response = $this->apiClient->call($path, HttpVerb::GET, $queryParams); + $refundsResponse = null; + if ($response->getCode() == 200) { + $resultArray = json_decode($response->getBody(), true); + $refundsResponse = new RefundsResponse($resultArray); + } else { + $this->handleError($response); + } + return $refundsResponse; + } + + /** + * Проведение возврата платежа + * @param CreateRefundRequestInterface $refundsRequest + * @param null $idempotencyKey + * @return CreateRefundResponse + */ + public function createRefund(CreateRefundRequestInterface $refundsRequest, $idempotencyKey = null) + { + $path = '/refunds'; + + $headers = array(); + + if ($idempotencyKey) { + $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey; + } + + $serializer = new CreateRefundRequestSerializer(); + $serializedData = $serializer->serialize($refundsRequest); + $httpBody = $this->encodeData($serializedData); + $response = $this->apiClient->call($path, HttpVerb::POST, null, $httpBody, $headers); + + $result = null; + if ($response->getCode() == 200) { + $resultArray = json_decode($response->getBody(), true); + $result = new CreateRefundResponse($resultArray); + } else { + $this->handleError($response); + } + return $result; + } + + /** + * Получить информацию о возврате + * @param $refundId + * @return RefundResponse + */ + public function getRefundInfo($refundId) + { + if ($refundId === null) { + throw new \InvalidArgumentException('Missing the required parameter $refundId'); + } + + $path = '/refunds/' . $refundId; + $response = $this->apiClient->call($path, HttpVerb::GET, null); + + $result = null; + if ($response->getCode() == 200) { + $resultArray = json_decode($response->getBody(), true); + $result = new RefundResponse($resultArray); + } else { + $this->handleError($response); + } + return $result; + } + + /** + * @return array + */ + public function getConfig() + { + return $this->config; + } + + /** + * @param array $config + */ + public function setConfig($config) + { + $this->config = $config; + } + + /** + * @param $serializedData + * @return string + * @throws \Exception + */ + private function encodeData($serializedData) + { + $result = json_encode($serializedData); + if ($result === false) { + $errorCode = json_last_error(); + throw new JsonException("Failed serialize json.", $errorCode); + } + + return $result; + } + + /** + * @param ResponseObject $response + * @throws BadApiRequestException + * @throws ForbiddenException + * @throws InternalServerError + * @throws UnauthorizedException + * @throws ApiException + */ + private 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; + default: + if ($response->getCode() > 399) { + throw new ApiException( + 'Unexpected response error code', + $response->getCode(), + $response->getHeaders(), + $response->getBody() + ); + } + } + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractEnum.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractEnum.php new file mode 100644 index 0000000..9b68071 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractEnum.php @@ -0,0 +1,50 @@ + $enabled) { + if ($enabled) { + $result[] = $key; + } + } + return $result; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractObject.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractObject.php new file mode 100644 index 0000000..39c2681 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractObject.php @@ -0,0 +1,120 @@ +unknownProperties); + } + + /** + * Возвращает значение свойства + * @param string $offset Имя свойства + * @return mixed Значение свойства + */ + public function offsetGet($offset) + { + $method = 'get' . ucfirst($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 { + $this->unknownProperties[$offset] = $value; + } + } + + /** + * Удаляет свойство + * @param string $offset Имя удаляемого свойства + */ + public function offsetUnset($offset) + { + $method = 'set' . ucfirst($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); + } + + /** + * @return array + */ + protected function getUnknownProperties() + { + return $this->unknownProperties; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequest.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequest.php new file mode 100644 index 0000000..7582de8 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequest.php @@ -0,0 +1,48 @@ +_validationError = null; + } + + /** + * Устанавливает ошибку валидации + * @param string $value Ошибка, произошедшая при валидации объекта + */ + protected function setValidationError($value) + { + $this->_validationError = $value; + } + + /** + * Возвращает последнюю ошибку валидации + * @return string Последняя произошедшая ошибка валидации + */ + public function getLastValidationError() + { + return $this->_validationError; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequestBuilder.php new file mode 100644 index 0000000..7c06f2d --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequestBuilder.php @@ -0,0 +1,88 @@ +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); + } + } + return $this; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/ApiConnectionException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/ApiConnectionException.php new file mode 100644 index 0000000..e3d360a --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/ApiConnectionException.php @@ -0,0 +1,10 @@ +responseHeaders = $responseHeaders; + $this->responseBody = $responseBody; + } + + /** + * @return string[] + */ + public function getResponseHeaders() + { + return $this->responseHeaders; + } + + /** + * @return mixed + */ + public function getResponseBody() + { + return $this->responseBody; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/AuthorizeException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/AuthorizeException.php new file mode 100644 index 0000000..3f501af --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/AuthorizeException.php @@ -0,0 +1,9 @@ +retryAfter = $errorData['retry_after']; + } + + if (isset($errorData['type'])) { + $this->retryAfter = $errorData['type']; + } + + parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/EmptyPropertyValueException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/EmptyPropertyValueException.php new file mode 100644 index 0000000..f310c35 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/EmptyPropertyValueException.php @@ -0,0 +1,17 @@ +retryAfter = $errorData['retry_after']; + } + + if (isset($errorData['type'])) { + $this->type = $errorData['type']; + } + + parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InternalServerError.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InternalServerError.php new file mode 100644 index 0000000..2bd1f8a --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InternalServerError.php @@ -0,0 +1,41 @@ +retryAfter = $errorData['retry_after']; + } + + if (isset($errorData['type'])) { + $this->type = $errorData['type']; + } + + parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyException.php new file mode 100644 index 0000000..56b51d9 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyException.php @@ -0,0 +1,31 @@ +propertyName = (string)$property; + } + + /** + * @return string + */ + public function getProperty() + { + return $this->propertyName; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueException.php new file mode 100644 index 0000000..4ae6bbe --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueException.php @@ -0,0 +1,34 @@ +invalidValue = $value; + } + } + + /** + * @return mixed + */ + public function getValue() + { + return $this->invalidValue; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueTypeException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueTypeException.php new file mode 100644 index 0000000..d083c0d --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueTypeException.php @@ -0,0 +1,38 @@ +type = 'null'; + } elseif (is_object($value)) { + $this->type = get_class($value); + } else { + $this->type = gettype($value); + } + } + + /** + * @return string + */ + public function getType() + { + return $this->type; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidRequestException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidRequestException.php new file mode 100644 index 0000000..5ce802a --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidRequestException.php @@ -0,0 +1,38 @@ +getLastValidationError().'"'; + $this->errorRequest = $error; + } else { + $message = $error; + } + parent::__construct($message, $code, $previous); + } + + /** + * @return AbstractRequest|null + */ + public function getRequestObject() + { + return $this->errorRequest; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/JsonException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/JsonException.php new file mode 100644 index 0000000..8a266e7 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/JsonException.php @@ -0,0 +1,24 @@ + '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, \Throwable $previous = null) + { + $errorMsg = isset(self::$errorLabels[$code]) ? self::$errorLabels[$code] : 'Unknown error'; + $message = sprintf('%s %s', $message, $errorMsg); + parent::__construct($message, $code, $previous); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/NotFoundException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/NotFoundException.php new file mode 100644 index 0000000..e8d052c --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/NotFoundException.php @@ -0,0 +1,42 @@ +retryAfter = $errorData['retry_after']; + } + + if (isset($errorData['type'])) { + $this->type = $errorData['type']; + } + + parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/TechnicalError.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/TechnicalError.php new file mode 100644 index 0000000..4defc17 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/TechnicalError.php @@ -0,0 +1,16 @@ +retryAfter = $errorData['retry_after']; + } + + if (isset($errorData['type'])) { + $this->type = $errorData['type']; + } + + parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/HttpVerb.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/HttpVerb.php new file mode 100644 index 0000000..b1228ba --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/HttpVerb.php @@ -0,0 +1,26 @@ + true, + 'POST' => true, + 'PATCH' => true, + 'HEAD' => true, + 'OPTIONS' => true, + 'PUT' => true, + 'DELETE' => true + ); +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/LoggerWrapper.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/LoggerWrapper.php new file mode 100644 index 0000000..87731cd --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/LoggerWrapper.php @@ -0,0 +1,168 @@ +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)); + } + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/RequestObjectInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/RequestObjectInterface.php new file mode 100644 index 0000000..68bf80f --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/RequestObjectInterface.php @@ -0,0 +1,9 @@ +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; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoader.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoader.php new file mode 100644 index 0000000..bb60e43 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoader.php @@ -0,0 +1,28 @@ +configParams = $paramsArray; + + return $this; + } + + public function getConfig() + { + return $this->configParams; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoaderInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoaderInterface.php new file mode 100644 index 0000000..8f922e0 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoaderInterface.php @@ -0,0 +1,8 @@ +value = (string)$value; + } + + /** + * @return string + */ + public function __toString() + { + return $this->value; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/TypeCast.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/TypeCast.php new file mode 100644 index 0000000..c5cb556 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/TypeCast.php @@ -0,0 +1,88 @@ += 0; + } elseif (is_string($value)) { + return $value !== ''; + } elseif (is_object($value)) { + return method_exists($value, '__toString') && ((string)$value) !== ''; + } + return false; + } + + /** + * @param string|int|\DateTime $value + * @return \DateTime|null + */ + 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 + */ + public static function canCastToBoolean($value) + { + if (is_numeric($value) || is_bool($value)) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/AmountInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/AmountInterface.php new file mode 100644 index 0000000..907b9e4 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/AmountInterface.php @@ -0,0 +1,32 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationCodeVerification.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationCodeVerification.php new file mode 100644 index 0000000..e7be14e --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationCodeVerification.php @@ -0,0 +1,18 @@ +_setType(ConfirmationType::CODE_VERIFICATION); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationDeepLink.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationDeepLink.php new file mode 100644 index 0000000..1ce066e --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationDeepLink.php @@ -0,0 +1,18 @@ +_setType(ConfirmationType::DEEPLINK); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationExternal.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationExternal.php new file mode 100644 index 0000000..e3b7a73 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationExternal.php @@ -0,0 +1,19 @@ +_setType(ConfirmationType::EXTERNAL); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationFactory.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationFactory.php new file mode 100644 index 0000000..0a3923f --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationFactory.php @@ -0,0 +1,62 @@ + 'ConfirmationCodeVerification', + ConfirmationType::DEEPLINK => 'ConfirmationDeepLink', + ConfirmationType::EXTERNAL => 'ConfirmationExternal', + ConfirmationType::REDIRECT => 'ConfirmationRedirect', + ); + + /** + * @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; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationRedirect.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationRedirect.php new file mode 100644 index 0000000..b30a186 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationRedirect.php @@ -0,0 +1,116 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/AbstractConfirmationAttributes.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/AbstractConfirmationAttributes.php new file mode 100644 index 0000000..a3893b5 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/AbstractConfirmationAttributes.php @@ -0,0 +1,55 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesCodeVerification.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesCodeVerification.php new file mode 100644 index 0000000..63760a4 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesCodeVerification.php @@ -0,0 +1,18 @@ +_setType(ConfirmationType::CODE_VERIFICATION); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesDeepLink.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesDeepLink.php new file mode 100644 index 0000000..43203d4 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesDeepLink.php @@ -0,0 +1,18 @@ +_setType(ConfirmationType::DEEPLINK); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesExternal.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesExternal.php new file mode 100644 index 0000000..91017d0 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesExternal.php @@ -0,0 +1,18 @@ +_setType(ConfirmationType::EXTERNAL); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesFactory.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesFactory.php new file mode 100644 index 0000000..31b5ecb --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesFactory.php @@ -0,0 +1,62 @@ + 'ConfirmationAttributesCodeVerification', + ConfirmationType::DEEPLINK => 'ConfirmationAttributesDeepLink', + ConfirmationType::EXTERNAL => 'ConfirmationAttributesExternal', + ConfirmationType::REDIRECT => 'ConfirmationAttributesRedirect', + ); + + /** + * @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; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesRedirect.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesRedirect.php new file mode 100644 index 0000000..dc122da --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesRedirect.php @@ -0,0 +1,83 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationType.php new file mode 100644 index 0000000..e2ceebc --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationType.php @@ -0,0 +1,30 @@ + true, + self::EXTERNAL => true, + self::DEEPLINK => false, + self::CODE_VERIFICATION => false, + ); +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/CurrencyCode.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/CurrencyCode.php new file mode 100644 index 0000000..3c87cbb --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/CurrencyCode.php @@ -0,0 +1,21 @@ + true, + self::USD => true, + self::EUR => true, + ); +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Metadata.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Metadata.php new file mode 100644 index 0000000..3b798ff --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Metadata.php @@ -0,0 +1,35 @@ +getUnknownProperties(); + } + + /** + * @return \Iterator + */ + public function getIterator() + { + return new \ArrayIterator($this->getUnknownProperties()); + } + + /** + * @return int + */ + public function count() + { + return count($this->getUnknownProperties()); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/MonetaryAmount.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/MonetaryAmount.php new file mode 100644 index 0000000..d5535e9 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/MonetaryAmount.php @@ -0,0 +1,189 @@ + 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; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/AbstractNotification.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/AbstractNotification.php new file mode 100644 index 0000000..64fd145 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/AbstractNotification.php @@ -0,0 +1,88 @@ +_type; + } + + /** + * @param string $value + */ + 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 + ); + } + } + + /** + * @return string + */ + public function getEvent() + { + return $this->_event; + } + + /** + * @param string $value + */ + 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 + ); + } + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/NotificationWaitingForCapture.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/NotificationWaitingForCapture.php new file mode 100644 index 0000000..e2cc659 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/NotificationWaitingForCapture.php @@ -0,0 +1,56 @@ +_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']); + } + + /** + * @return PaymentInterface + */ + public function getObject() + { + return $this->_object; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationEventType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationEventType.php new file mode 100644 index 0000000..b3eb3df --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationEventType.php @@ -0,0 +1,14 @@ + true, + ); +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationType.php new file mode 100644 index 0000000..bf732e5 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationType.php @@ -0,0 +1,14 @@ + true, + ); +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Order.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Order.php new file mode 100644 index 0000000..1dfbe39 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Order.php @@ -0,0 +1,81 @@ +_amount = new MonetaryAmount(); + } + + /** + * @return AmountInterface + */ + public function getAmount() + { + return $this->_amount; + } + + /** + * @param AmountInterface $value + */ + public function setAmount(AmountInterface $value) + { + $this->_amount = $value; + } + + /** + * @return ReceiptInterface Данные фискального чека 54-ФЗ + */ + public function getReceipt() + { + return $this->_receipt; + } + + /** + * @param ReceiptInterface $value Данные фискального чека 54-ФЗ + */ + public function setReceipt(ReceiptInterface $value) + { + $this->_receipt = $value; + } + + /** + * @return bool + */ + public function hasReceipt() + { + return $this->_receipt !== null; + } + + /** + * + */ + public function removeReceipt() + { + $this->_receipt = null; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/OrderInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/OrderInterface.php new file mode 100644 index 0000000..9568e7f --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/OrderInterface.php @@ -0,0 +1,29 @@ +_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 PaymentErrorInterface|null Описание ошибки или null если ошибка не задана + */ + public function getError() + { + return $this->_error; + } + + /** + * Устанавливает описание ошибки + * @param PaymentErrorInterface $value Инстанс объекта с описанием ошибки + */ + public function setError(PaymentErrorInterface $value) + { + $this->_error = $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 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 Выбрасывается если был передан аргумент, который невозможно + * интерпретировать как дату или время + */ + 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 Выбрасывается если был передан аргумент, который невозможно + * интерпретировать как дату или время + */ + 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 + ); + } + } + + /** + * Возвращает состояние регистрации фискального чека + * @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; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/AbstractPaymentData.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/AbstractPaymentData.php new file mode 100644 index 0000000..acf4294 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/AbstractPaymentData.php @@ -0,0 +1,54 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAlfabank.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAlfabank.php new file mode 100644 index 0000000..021d26b --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAlfabank.php @@ -0,0 +1,50 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAndroidPay.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAndroidPay.php new file mode 100644 index 0000000..7a8a356 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAndroidPay.php @@ -0,0 +1,52 @@ +_setType(PaymentMethodType::ANDROID_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, 'PaymentDataAndroidPay.paymentData' + ); + } elseif (TypeCast::canCastToString($value)) { + $this->_paymentData = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid value type for paymentData', 0, 'PaymentDataAndroidPay.paymentData', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataApplePay.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataApplePay.php new file mode 100644 index 0000000..3d7fd1f --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataApplePay.php @@ -0,0 +1,53 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCard.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCard.php new file mode 100644 index 0000000..f102148 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCard.php @@ -0,0 +1,56 @@ +_setType(PaymentMethodType::BANK_CARD); + } + + /** + * @return PaymentDataBankCardCard Данные банковской карты + */ + public function getBankCard() + { + return $this->_card; + } + + /** + * @param PaymentDataBankCardCard|array $value Данные банковской карты + */ + public function setBankCard($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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCardCard.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCardCard.php new file mode 100644 index 0000000..59e3ce9 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCardCard.php @@ -0,0 +1,213 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataCash.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataCash.php new file mode 100644 index 0000000..a56cb3b --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataCash.php @@ -0,0 +1,57 @@ +_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 + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataFactory.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataFactory.php new file mode 100644 index 0000000..270d85a --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataFactory.php @@ -0,0 +1,63 @@ + 'PaymentDataYandexWallet', + PaymentMethodType::BANK_CARD => 'PaymentDataBankCard', + PaymentMethodType::SBERBANK => 'PaymentDataSberbank', + PaymentMethodType::CASH => 'PaymentDataCash', + PaymentMethodType::MOBILE_BALANCE => 'PaymentDataMobileBalance', + PaymentMethodType::APPLE_PAY => 'PaymentDataApplePay', + PaymentMethodType::ANDROID_PAY => 'PaymentDataAndroidPay', + PaymentMethodType::QIWI => 'PaymentDataQiwi', + PaymentMethodType::WEBMONEY => 'PaymentDataWebmoney', + PaymentMethodType::ALFABANK => 'PaymentDataAlfabank', + ); + + /** + * @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; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataMobileBalance.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataMobileBalance.php new file mode 100644 index 0000000..76c6f00 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataMobileBalance.php @@ -0,0 +1,58 @@ +_setType(PaymentMethodType::MOBILE_BALANCE); + } + + /** + * @return string + */ + public function getPhone() + { + return $this->_phone; + } + + /** + * @param string $value + */ + public function setPhone($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentDataMobileBalance.phone'); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{4,15}$/', $value)) { + $this->_phone = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid phone value', 0, 'PaymentDataMobileBalance.phone', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid phone value type', 0, 'PaymentDataMobileBalance.phone', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataQiwi.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataQiwi.php new file mode 100644 index 0000000..e9cc7a6 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataQiwi.php @@ -0,0 +1,57 @@ +_setType(PaymentMethodType::QIWI); + } + + /** + * @return string + */ + public function getPhone() + { + return $this->_phone; + } + + /** + * @param string $value + */ + public function setPhone($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentDataQiwi.phone'); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{4,15}$/', $value)) { + $this->_phone = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid phone value', 0, 'PaymentDataQiwi.phone', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid phone value type', 0, 'PaymentDataQiwi.phone', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataSberbank.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataSberbank.php new file mode 100644 index 0000000..70202ac --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataSberbank.php @@ -0,0 +1,89 @@ +_setType(PaymentMethodType::SBERBANK); + } + + /** + * @return string + */ + public function getPhone() + { + return $this->_phone; + } + + /** + * @param string $value + */ + public function setPhone($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentDataSberbank.phone'); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{4,15}$/', $value)) { + $this->_phone = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid phone value', 0, 'PaymentDataSberbank.phone', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid phone value type', 0, 'PaymentDataSberbank.phone', $value + ); + } + } + + /** + * @return string Идентификатор привязки клиента СБОЛ. + */ + public function getBindId() + { + return $this->_bindId; + } + + /** + * @param string $value Идентификатор привязки клиента СБОЛ. + */ + public function setBindId($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty bindId value', 0, 'PaymentDataSberbank.bindId'); + } elseif (TypeCast::canCastToString($value)) { + $this->_bindId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid bindId value type', 0, 'PaymentDataSberbank.bindId', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataWebmoney.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataWebmoney.php new file mode 100644 index 0000000..a578235 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataWebmoney.php @@ -0,0 +1,17 @@ +_setType(PaymentMethodType::WEBMONEY); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataYandexWallet.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataYandexWallet.php new file mode 100644 index 0000000..7ff8039 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataYandexWallet.php @@ -0,0 +1,95 @@ +_setType(PaymentMethodType::YANDEX_MONEY); + } + + /** + * @return string Номер телефона в формате ITU-T E.164 на который зарегестрирован аккаунт в Яндекс Денгах. Необходим для оплаты `waiting` сценарием + */ + public function getPhone() + { + return $this->_phone; + } + + /** + * @param string $value Номер телефона в формате ITU-T E.164 на который зарегестрирован аккаунт в Яндекс Денгах. Необходим для оплаты `waiting` сценарием + */ + public function setPhone($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentDataYandexWallet.phone'); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{4,15}$/', $value)) { + $this->_phone = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid phone value', 0, 'PaymentDataYandexWallet.phone', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid phone value type', 0, 'PaymentDataYandexWallet.phone', $value + ); + } + } + + /** + * @return string Номер кошелька в Яндекс.Деньгах, из которого спишутся деньги при оплате. Необходим для оплаты `waiting` сценарием + */ + public function getAccountNumber() + { + return $this->_accountNumber; + } + + /** + * @param string $value Номер кошелька в Яндекс.Деньгах, из которого спишутся деньги при оплате. Необходим для оплаты `waiting` сценарием + */ + public function setAccountNumber($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty accountNumber value', 0, 'PaymentDataYandexWallet.accountNumber' + ); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{11,33}$/', $value)) { + $this->_accountNumber = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid accountNumber value', 0, 'PaymentDataYandexWallet.accountNumber', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid accountNumber value type', 0, 'PaymentDataYandexWallet.accountNumber', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentError.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentError.php new file mode 100644 index 0000000..fad2fdc --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentError.php @@ -0,0 +1,97 @@ +_code; + } + + /** + * @param string $value Код ошибки + */ + public function setCode($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty code value in PaymentError', 0, 'PaymentError.code'); + } elseif (TypeCast::canCastToEnumString($value)) { + $castedValue = (string)$value; + if (PaymentErrorCode::valueExists($castedValue)) { + $this->_code = $castedValue; + } else { + throw new InvalidPropertyValueException( + 'Invalid code value in PaymentError', 0, 'PaymentError.code', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid code value type in PaymentError', 0, 'PaymentError.code', $value + ); + } + } + + /** + * @return string Дополнительное текстовое пояснение ошибки + */ + public function getDescription() + { + return $this->_description; + } + + /** + * @param string $value Дополнительное текстовое пояснение ошибки + */ + public function setDescription($value) + { + if ($value === null || $value === '') { + $this->_description = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_description = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid description value type in PaymentError', 0, 'PaymentError.description', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorCode.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorCode.php new file mode 100644 index 0000000..59e9309 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorCode.php @@ -0,0 +1,26 @@ + true, + self::AUTHORIZATION_REJECTED => true, + self::PAYMENT_EXPIRED => true, + self::IDENTIFICATION_REQUIRED => true, + self::INSUFFICIENT_FUNDS => true, + self::PAYER_NOT_FOUND => true, + self::INAPPROPRIATE_STATUS => true, + ); +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorInterface.php new file mode 100644 index 0000000..d1e6fa1 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorInterface.php @@ -0,0 +1,24 @@ +_type; + } + + /** + * @param string $value Тип объекта + */ + protected function _setType($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty payment data type', 0, 'PaymentMethod.type' + ); + } elseif (TypeCast::canCastToEnumString($value)) { + if (PaymentMethodType::valueExists($value)) { + $this->_type = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid value for "type" parameter in PaymentMethod', 0, 'PaymentMethod.type', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid value type for "type" parameter in PaymentMethod', 0, 'PaymentMethod.type', $value + ); + } + } + + /** + * @return string Идентификатор записи о сохраненных платежных данных + */ + public function getId() + { + return $this->_id; + } + + /** + * @param string $value Идентификатор записи о сохраненных платежных данных + */ + public function setId($value) + { + if ($value === null || $value === '') { + $this->_id = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_id = (string)$value; + } else { + throw new InvalidPropertyValueTypeException('Invalid id value type', 0, 'PaymentMethod.id', $value); + } + } + + /** + * @return bool Возможность многократного использования + */ + public function getSaved() + { + return $this->_saved; + } + + /** + * @param bool $value Возможность многократного использования + */ + public function setSaved($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty saved value', 0, 'PaymentMethod.saved'); + } elseif (TypeCast::canCastToBoolean($value)) { + $this->_saved = (bool)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid saved value type', 0, 'PaymentMethod.saved', $value + ); + } + } + + /** + * @return string Название метода оплаты + */ + public function getTitle() + { + return $this->_title; + } + + /** + * @param string $value Название метода оплаты + */ + public function setTitle($value) + { + if ($value === null || $value === '') { + $this->_title = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_title = (string)$value; + } else { + throw new InvalidPropertyValueTypeException('Invalid title value type', 0, 'PaymentMethod.title', $value); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAlfaBank.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAlfaBank.php new file mode 100644 index 0000000..7a20a3c --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAlfaBank.php @@ -0,0 +1,51 @@ +_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, 'PaymentMethodAlfaBank.login'); + } elseif (TypeCast::canCastToString($value)) { + $this->_login = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid login value type', 0, 'PaymentMethodAlfaBank.login', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAndroidPay.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAndroidPay.php new file mode 100644 index 0000000..5cf2572 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAndroidPay.php @@ -0,0 +1,17 @@ +_setType(PaymentMethodType::ANDROID_PAY); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodApplePay.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodApplePay.php new file mode 100644 index 0000000..151b4b1 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodApplePay.php @@ -0,0 +1,17 @@ +_setType(PaymentMethodType::APPLE_PAY); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodBankCard.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodBankCard.php new file mode 100644 index 0000000..854ecf7 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodBankCard.php @@ -0,0 +1,179 @@ +_setType(PaymentMethodType::BANK_CARD); + } + + /** + * @return string Последние 4 цифры номера карты + */ + public function getLast4() + { + return $this->_last4; + } + + /** + * @param string $value Последние 4 цифры номера карты + */ + public function setLast4($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty card last4 value', 0, 'PaymentMethodBankCard.last4'); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{4}$/', (string)$value)) { + $this->_last4 = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid card last4 value', 0, 'PaymentMethodBankCard.last4', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid card last4 value type', 0, 'PaymentMethodBankCard.last4', $value + ); + } + } + + /** + * @return string Срок действия, год + */ + public function getExpiryYear() + { + return $this->_expiryYear; + } + + /** + * @param string $value Срок действия, год + */ + public function setExpiryYear($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty card expiry year value', 0, 'PaymentMethodBankCard.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, 'PaymentMethodBankCard.expiryYear', $value + ); + } + $this->_expiryYear = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid card expiry year value', 0, 'PaymentMethodBankCard.expiryYear', $value + ); + } + } + + /** + * @return string Срок действия, месяц + */ + public function getExpiryMonth() + { + return $this->_expiryMonth; + } + + /** + * @param string $value Срок действия, месяц + */ + public function setExpiryMonth($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty card expiry month value', 0, 'PaymentMethodBankCard.expiryMonth' + ); + } elseif (is_numeric($value)) { + if (!preg_match('/^\d\d$/', $value)) { + throw new InvalidPropertyValueException( + 'Invalid card expiry month value', 0, 'PaymentMethodBankCard.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, 'PaymentMethodBankCard.expiryMonth', $value + ); + } else { + $this->_expiryMonth = (string)$value; + } + } else { + throw new InvalidPropertyValueException( + 'Invalid card expiry month value', 0, 'PaymentMethodBankCard.expiryMonth', $value + ); + } + } + + /** + * @return string Тип банковской карты + */ + public function getCardType() + { + return $this->_cardType; + } + + /** + * @param string $value Тип банковской карты + */ + public function setCardType($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty cardType value', 0, 'PaymentMethodBankCard.cardType'); + } elseif (TypeCast::canCastToString($value)) { + $castedValue = (string)$value; + if (PaymentMethodCardType::valueExists($castedValue)) { + $this->_cardType = $castedValue; + } else { + throw new InvalidPropertyValueException( + 'Invalid cardType value', 0, 'PaymentMethodBankCard.cardType', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid cardType value type', 0, 'PaymentMethodBankCard.cardType', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCardType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCardType.php new file mode 100644 index 0000000..924e30c --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCardType.php @@ -0,0 +1,26 @@ + true, + self::VISA => true, + self::MIR => true, + self::UNION_PAY => true, + self::JCB => true, + self::AMERICAN_EXPRESS => true, + self::UNKNOWN => true, + ); +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCash.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCash.php new file mode 100644 index 0000000..6028acd --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCash.php @@ -0,0 +1,17 @@ +_setType(PaymentMethodType::CASH); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodFactory.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodFactory.php new file mode 100644 index 0000000..1da3b77 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodFactory.php @@ -0,0 +1,74 @@ + 'PaymentMethodYandexWallet', + PaymentMethodType::BANK_CARD => 'PaymentMethodBankCard', + PaymentMethodType::SBERBANK => 'PaymentMethodSberbank', + PaymentMethodType::CASH => 'PaymentMethodCash', + PaymentMethodType::MOBILE_BALANCE => 'PaymentMethodMobileBalance', + PaymentMethodType::APPLE_PAY => 'PaymentMethodApplePay', + PaymentMethodType::ANDROID_PAY => 'PaymentMethodAndroidPay', + PaymentMethodType::QIWI => 'PaymentMethodQiwi', + PaymentMethodType::WEBMONEY => 'PaymentMethodWebmoney', + PaymentMethodType::ALFABANK => 'PaymentMethodAlfaBank', + ); + + private $optionsMap = array( + 'card_type' => 'cardType', + 'expiry_month' => 'expiryMonth', + 'expiry_year' => 'expiryYear', + 'bind_id' => 'bindId', + 'account_number' => 'accountNumber', + ); + + /** + * @param string $type + * @return AbstractPaymentMethod + */ + public function factory($type) + { + if (!is_string($type)) { + throw new \InvalidArgumentException('Invalid payment method type value in payment factory'); + } + if (!array_key_exists($type, $this->typeClassMap)) { + throw new \InvalidArgumentException('Invalid payment method data type "'.$type.'"'); + } + $className = __NAMESPACE__ . '\\' . $this->typeClassMap[$type]; + return new $className(); + } + + /** + * @param array $data + * @param string|null $type + * @return AbstractPaymentMethod + */ + 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 (array_key_exists($key, $this->optionsMap)) { + $key = $this->optionsMap[$key]; + } + if ($paymentData->offsetExists($key)) { + $paymentData->offsetSet($key, $value); + } + } + return $paymentData; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodMobileBalance.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodMobileBalance.php new file mode 100644 index 0000000..1f1e18c --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodMobileBalance.php @@ -0,0 +1,58 @@ +_setType(PaymentMethodType::MOBILE_BALANCE); + } + + /** + * @return string + */ + public function getPhone() + { + return $this->_phone; + } + + /** + * @param string $value + */ + public function setPhone($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentMethodMobileBalance.phone'); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{4,15}$/', $value)) { + $this->_phone = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid phone value', 0, 'PaymentMethodMobileBalance.phone', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid phone value type', 0, 'PaymentMethodMobileBalance.phone', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodQiwi.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodQiwi.php new file mode 100644 index 0000000..9ba59e4 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodQiwi.php @@ -0,0 +1,17 @@ +_setType(PaymentMethodType::QIWI); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodSberbank.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodSberbank.php new file mode 100644 index 0000000..60b2599 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodSberbank.php @@ -0,0 +1,89 @@ +_setType(PaymentMethodType::SBERBANK); + } + + /** + * @return string + */ + public function getPhone() + { + return $this->_phone; + } + + /** + * @param string $value + */ + public function setPhone($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentMethodSberbank.phone'); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{4,15}$/', $value)) { + $this->_phone = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid phone value', 0, 'PaymentMethodSberbank.phone', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid phone value type', 0, 'PaymentMethodSberbank.phone', $value + ); + } + } + + /** + * @return string Идентификатор привязки клиента СБОЛ. + */ + public function getBindId() + { + return $this->_bindId; + } + + /** + * @param string $value Идентификатор привязки клиента СБОЛ. + */ + public function setBindId($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty bindId value', 0, 'PaymentMethodSberbank.bindId'); + } elseif (TypeCast::canCastToString($value)) { + $this->_bindId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid bindId value type', 0, 'PaymentMethodSberbank.bindId', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodWebmoney.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodWebmoney.php new file mode 100644 index 0000000..0b74320 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodWebmoney.php @@ -0,0 +1,17 @@ +_setType(PaymentMethodType::WEBMONEY); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodYandexWallet.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodYandexWallet.php new file mode 100644 index 0000000..d1686f8 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodYandexWallet.php @@ -0,0 +1,95 @@ +_setType(PaymentMethodType::YANDEX_MONEY); + } + + /** + * @return string Номер телефона в формате ITU-T E.164 с которого была произведена оплата. + */ + public function getPhone() + { + return $this->_phone; + } + + /** + * @param string $value Номер телефона в формате ITU-T E.164 с которого была произведена оплата. + */ + public function setPhone($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentMethodYandexWallet.phone'); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{4,15}$/', $value)) { + $this->_phone = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid phone value', 0, 'PaymentMethodYandexWallet.phone', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid phone value type', 0, 'PaymentMethodYandexWallet.phone', $value + ); + } + } + + /** + * @return string Номер кошелька в Яндекс.Деньгах с которого была произведена оплата. + */ + public function getAccountNumber() + { + return $this->_accountNumber; + } + + /** + * @param string $value Номер кошелька в Яндекс.Деньгах с которого была произведена оплата. + */ + public function setAccountNumber($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty accountNumber value', 0, 'PaymentMethodYandexWallet.accountNumber' + ); + } elseif (TypeCast::canCastToString($value)) { + if (preg_match('/^[0-9]{11,33}$/', $value)) { + $this->_accountNumber = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid accountNumber value', 0, 'PaymentMethodYandexWallet.accountNumber', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid accountNumber value type', 0, 'PaymentMethodYandexWallet.accountNumber', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethodType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethodType.php new file mode 100644 index 0000000..514025e --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethodType.php @@ -0,0 +1,46 @@ + true, + self::BANK_CARD => true, + self::SBERBANK => true, + self::CASH => true, + self::MOBILE_BALANCE => false, + self::APPLE_PAY => false, + self::ANDROID_PAY => false, + self::QIWI => true, + self::ALFABANK => true, + self::WEBMONEY => true, + ); +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentStatus.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentStatus.php new file mode 100644 index 0000000..738a3c1 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentStatus.php @@ -0,0 +1,30 @@ + true, + self::WAITING_FOR_CAPTURE => true, + self::SUCCEEDED => true, + self::CANCELED => true, + ); +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Receipt.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Receipt.php new file mode 100644 index 0000000..b89d42c --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Receipt.php @@ -0,0 +1,256 @@ +_items; + } + + /** + * @param array $value Список товаров в заказе + */ + public function setItems($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty items value in receipt', 0, 'receipt.items'); + } + if (!is_array($value) && !($value instanceof \Traversable)) { + throw new InvalidPropertyValueTypeException( + 'Invalid items value type in receipt', 0, 'receipt.items', $value + ); + } + $this->_items = array(); + $this->_shippingItems = array(); + foreach ($value as $key => $val) { + $this->_items[$key] = $val; + if ($val->isShipping()) { + $this->_shippingItems[] = $val; + } + } + } + + public function addItem(ReceiptItemInterface $value) + { + $this->_items[] = $value; + if ($value->isShipping()) { + $this->_shippingItems[] = $value; + } + } + + /** + * @return int Код системы налогообложения. Число 1-6. + */ + public function getTaxSystemCode() + { + return $this->_taxSystemCode; + } + + /** + * Устанавливает код системы налогообложения + * @param int $value Код системы налогообложения. Число 1-6 + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент - не число + * @throws InvalidPropertyValueException Выбрасывается если переданный аргумент меньше одного или больше шести + */ + public function setTaxSystemCode($value) + { + if ($value === null || $value === '') { + $this->_taxSystemCode = null; + } elseif (!is_numeric($value)) { + throw new InvalidPropertyValueTypeException( + 'Invalid taxSystemCode value type', 0, 'receipt.taxSystemCode' + ); + } else { + $castedValue = (int)$value; + if ($castedValue < 1 || $castedValue > 6) { + throw new InvalidPropertyValueException( + 'Invalid taxSystemCode value: ' . $value, 0, 'receipt.taxSystemCode' + ); + } + $this->_taxSystemCode = $castedValue; + } + } + + /** + * @return string Номер телефона плательщика в формате ITU-T E.164 на который будет выслан чек. + */ + public function getPhone() + { + return $this->_phone; + } + + /** + * @param string $value Номер телефона плательщика в формате ITU-T E.164 на который будет выслан чек. + */ + public function setPhone($value) + { + if ($value === null || $value === '') { + $this->_phone = null; + } elseif (!TypeCast::canCastToString($value)) { + throw new InvalidPropertyValueTypeException('Invalid phone value type', 0, 'receipt.phone'); + } elseif (!preg_match('/^[0-9]{4,15}$/', (string)$value)) { + throw new InvalidPropertyValueException('Invalid phone value: "' . $value . '"', 0, 'receipt.phone'); + } else { + $this->_phone = (string)$value; + } + } + + /** + * @return string E-mail адрес плательщика на который будет выслан чек. + */ + public function getEmail() + { + return $this->_email; + } + + /** + * @param string $value E-mail адрес плательщика на который будет выслан чек. + */ + public function setEmail($value) + { + if ($value === null || $value === '') { + $this->_email = null; + } elseif (!TypeCast::canCastToString($value)) { + throw new InvalidPropertyValueTypeException('Invalid email value type', 0, 'receipt.email'); + } else { + $this->_email = (string)$value; + } + } + + /** + * @return bool + */ + public function notEmpty() + { + return !empty($this->_items); + } + + /** + * Возвращает стоимость заказа исходя из состава чека + * @param bool $withShipping Добавить ли к стоимости заказа стоимость доставки + * @return int Общая стоимость заказа в центах/копейках + */ + public function getAmountValue($withShipping = true) + { + $result = 0; + foreach ($this->_items as $item) { + if ($withShipping || !$item->isShipping()) { + $result += $item->getAmount(); + } + } + return $result; + } + + /** + * Возвращает стоимость доставки исходя из состава чека + * @return int Стоимость доставки из состава чека в центах/копейках + */ + public function getShippingAmountValue() + { + $result = 0; + foreach ($this->_items as $item) { + if ($item->isShipping()) { + $result += $item->getAmount(); + } + } + return $result; + } + + /** + * Подгоняет стоимость товаров в чеке к общей цене заказа + * @param AmountInterface $orderAmount Общая стоимость заказа + * @param bool $withShipping Поменять ли заодно и цену доставки + */ + public function normalize(AmountInterface $orderAmount, $withShipping = false) + { + $amount = $orderAmount->getIntegerValue(); + if (!$withShipping) { + if ($this->_shippingItems !== null) { + $amount -= $this->getShippingAmountValue(); + } + } + $realAmount = $this->getAmountValue($withShipping); + if ($realAmount !== $amount) { + $coefficient = (float)$amount / (float)$realAmount; + $realAmount = 0; + $aloneId = null; + foreach ($this->_items as $index => $item) { + if ($withShipping || !$item->isShipping()) { + $item->applyDiscountCoefficient($coefficient); + $realAmount += $item->getAmount(); + if ($aloneId === null && $item->getQuantity() === 1.0 && !$item->isShipping()) { + $aloneId = $index; + } + } + } + if ($aloneId === null) { + foreach ($this->_items as $index => $item) { + if (!$item->isShipping()) { + $aloneId = $index; + break; + } + } + } + if ($aloneId === null) { + $aloneId = 0; + } + $diff = $amount - $realAmount; + if (abs($diff) >= 0.1) { + if ($this->_items[$aloneId]->getQuantity() === 1.0) { + $this->_items[$aloneId]->increasePrice($diff / 100.0); + } elseif ($this->_items[$aloneId]->getQuantity() > 1.0) { + $item = $this->_items[$aloneId]->fetchItem(1); + $item->increasePrice($diff / 100.0); + array_splice($this->_items, $aloneId + 1, 0, array($item)); + } else { + $item = $this->_items[$aloneId]->fetchItem($this->_items[$aloneId]->getQuantity() / 2); + $item->increasePrice($diff / 100.0); + array_splice($this->_items, $aloneId + 1, 0, array($item)); + } + } + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptInterface.php new file mode 100644 index 0000000..fd1236a --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptInterface.php @@ -0,0 +1,41 @@ +_description; + } + + /** + * Устанавливает наименование товара + * @param string $value Наименование товара + * + * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение + * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента была передана не строка + */ + public function setDescription($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description' + ); + } elseif (TypeCast::canCastToString($value)) { + $castedValue = (string)$value; + if ($castedValue === '') { + throw new EmptyPropertyValueException( + 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description' + ); + } + $this->_description = $castedValue; + } else { + throw new InvalidPropertyValueTypeException( + 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description', $value + ); + } + } + + /** + * Возвращает количество товара + * @return float Количество купленного товара + */ + public function getQuantity() + { + return $this->_quantity; + } + + /** + * Устанавливает количество покупаемого товара + * @param int $value Количество + * + * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение + * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента был передан ноль + * или отрицательное число + * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число + */ + public function setQuantity($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty quantity value in ReceiptItem', 0, 'ReceiptItem.quantity'); + } elseif (!is_numeric($value)) { + throw new InvalidPropertyValueTypeException( + 'Invalid quantity value type in ReceiptItem', 0, 'ReceiptItem.quantity', $value + ); + } elseif ($value <= 0.0) { + throw new InvalidPropertyValueException( + 'Invalid quantity value in ReceiptItem', 0, 'ReceiptItem.quantity', $value + ); + } else { + $this->_quantity = (float)$value; + } + } + + /** + * Возвращает общую стоимость покупаемого товара в копейках/центах + * @return int Сумма стоимости покупаемого товара + */ + public function getAmount() + { + return (int)round($this->_amount->getIntegerValue() * $this->_quantity); + } + + /** + * Возвращает цену товара + * @return AmountInterface Цена товара + */ + public function getPrice() + { + return $this->_amount; + } + + /** + * Устанавливает цену товара + * @param AmountInterface $value Цена товара + */ + public function setPrice(AmountInterface $value) + { + $this->_amount = $value; + } + + /** + * Возвращает ставку НДС + * @return int|null Ставка НДС, число 1-6, или null если ставка не задана + */ + public function getVatCode() + { + return $this->_vatCode; + } + + /** + * Устанавливает ставку НДС + * @param int $value Ставка НДС, число 1-6 + * + * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента было передано число меньше одного + * или больше шести + * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число + */ + public function setVatCode($value) + { + if ($value === null || $value === '') { + $this->_vatCode = null; + } elseif (!is_numeric($value)) { + throw new InvalidPropertyValueTypeException( + 'Invalid vatId value type in ReceiptItem', 0, 'ReceiptItem.vatId', $value + ); + } elseif ($value < 1 || $value > 6) { + throw new InvalidPropertyValueException( + 'Invalid vatId value in ReceiptItem', 0, 'ReceiptItem.vatId', $value + ); + } else { + $this->_vatCode = (int)$value; + } + } + + /** + * Устанавливает флаг доставки для текущего объекта айтема в чеке + * @param bool $value True если айтем является доставкой, false если нет + * + * @throws InvalidPropertyValueException Генерируется если передано значение невалидного типа + */ + public function setIsShipping($value) + { + if ($value === null || $value === '') { + $this->_shipping = false; + } elseif (TypeCast::canCastToBoolean($value)) { + $this->_shipping = $value ? true : false; + } else { + throw new InvalidPropertyValueException( + 'Invalid isShipping value in ReceiptItem', 0, 'ReceiptItem.isShipping', $value + ); + } + } + + /** + * Проверяет, является ли текущий элемент чека доствкой + * @return bool True если доставка, false если обычный товар + */ + public function isShipping() + { + return $this->_shipping; + } + + /** + * Применяет для товара скидку + * @param float $coefficient Множитель скидки + */ + public function applyDiscountCoefficient($coefficient) + { + $this->_amount->multiply($coefficient); + } + + /** + * Увеличивает цену товара на указанную величину + * @param float $value Сумма на которую цену товара увеличиваем + */ + public function increasePrice($value) + { + $this->_amount->increase($value); + } + + /** + * Уменьшает количество покупаемого товара на указанное, возвращает объект позиции в чеке с уменьшаемым количеством + * @param float $count Количество на которое уменьшаем позицию в чеке + * @return ReceiptItem Новый инстанс позиции в чеке + * + * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение + * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента был передан ноль + * или отрицательное число, или число больше текущего количества покупаемого товара + * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число + */ + public function fetchItem($count) + { + if ($count === null || $count === '') { + throw new EmptyPropertyValueException( + 'Empty quantity value in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity' + ); + } elseif (!is_numeric($count)) { + throw new InvalidPropertyValueTypeException( + 'Invalid quantity value type in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity', $count + ); + } elseif ($count <= 0.0 || $count >= $this->_quantity) { + throw new InvalidPropertyValueException( + 'Invalid quantity value in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity', $count + ); + } + $result = new ReceiptItem(); + $result->_description = $this->_description; + $result->_quantity = $count; + $result->_vatCode = $this->_vatCode; + $result->_amount = new MonetaryAmount( + $this->_amount->getValue(), + $this->_amount->getCurrency() + ); + $this->_quantity -= $count; + return $result; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptItemInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptItemInterface.php new file mode 100644 index 0000000..8c5728a --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptItemInterface.php @@ -0,0 +1,53 @@ + true, + self::SUCCEEDED => true, + self::CANCELED => true, + ); +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Recipient.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Recipient.php new file mode 100644 index 0000000..2b5bd0f --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Recipient.php @@ -0,0 +1,85 @@ +_accountId; + } + + /** + * Устанавливает идентификатор магазина + * @param string $value Идентификатор магазина + * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение + * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение + */ + public function setAccountId($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty accountId value in Recipient', 0, 'Recipient.accountId'); + } elseif (TypeCast::canCastToString($value)) { + $this->_accountId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid accountId value type in Recipient', 0, 'Recipient.accountId', $value + ); + } + } + + /** + * Возвращает идентификатор товара + * @return string Идентификатор товара + */ + public function getGatewayId() + { + return $this->_gatewayId; + } + + /** + * Устанавливает идентификатор товара + * @param string $value Идентификатор товара + * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение + * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение + */ + public function setGatewayId($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty gatewayId value in Recipient', 0, 'Recipient.gatewayId' + ); + } elseif (TypeCast::canCastToString($value)) { + $this->_gatewayId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid gatewayId value type in Recipient', 0, 'Recipient.gatewayId', $value + ); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RecipientInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RecipientInterface.php new file mode 100644 index 0000000..6df4b3d --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RecipientInterface.php @@ -0,0 +1,24 @@ +_id; + } + + /** + * Устанавливает идентификатор возврата + * @param string $value Идентификатор возврата + * + * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент + * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение + * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой + */ + public function setId($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty refund id', 0, 'Refund.id'); + } elseif (TypeCast::canCastToString($value)) { + $castedValue = (string)$value; + $length = mb_strlen($castedValue, 'utf-8'); + if ($length === 36) { + $this->_id = $castedValue; + } else { + throw new InvalidPropertyValueException('Invalid refund id value', 0, 'Refund.id', $value); + } + } else { + throw new InvalidPropertyValueTypeException('Invalid refund id value type', 0, 'Refund.id', $value); + } + } + + /** + * Возвращает идентификатор платежа + * @return string Идентификатор платежа + */ + public function getPaymentId() + { + return $this->_paymentId; + } + + /** + * Устанавливает идентификатор платежа + * @param string $value Идентификатор платежа + * + * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент + * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение + * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой + */ + public function setPaymentId($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty refund paymentId', 0, 'Refund.paymentId'); + } elseif (TypeCast::canCastToString($value)) { + $castedValue = (string)$value; + $length = mb_strlen($castedValue, 'utf-8'); + if ($length === 36) { + $this->_paymentId = $castedValue; + } else { + throw new InvalidPropertyValueException( + 'Invalid refund paymentId value', 0, 'Refund.paymentId', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid refund paymentId value type', 0, 'Refund.paymentId', $value + ); + } + } + + /** + * Возвращает статус текущего возврата + * @return string Статус возврата + */ + public function getStatus() + { + return $this->_status; + } + + /** + * Усианавливает стутус возврата платежа + * @param string $value Статус возврата платежа + * + * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент + * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение + * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой + */ + public function setStatus($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty refund status', 0, 'Refund.status'); + } elseif (TypeCast::canCastToEnumString($value)) { + $castedValue = (string)$value; + if (RefundStatus::valueExists($castedValue)) { + $this->_status = $castedValue; + } else { + throw new InvalidPropertyValueException( + 'Invalid refund status value', 0, 'Refund.status', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid refund status value type', 0, 'Refund.status', $value + ); + } + } + + /** + * Возвращает описание ошибки, если она есть, либо null + * @return RefundErrorInterface Инстанс объекта с описанием ошибки или null + */ + public function getError() + { + return $this->_error; + } + + /** + * Устанавливает информацию о ошибке проведения возврата + * @param RefundErrorInterface $value Инстанс объекта с описанием ошибки + */ + public function setError(RefundErrorInterface $value) + { + $this->_error = $value; + } + + /** + * Возвращает дату создания возврата + * @return \DateTime Время создания возврата + */ + public function getCreatedAt() + { + return $this->_createdAt; + } + + /** + * Устанавливает вермя создания возврата + * @param \DateTime $value Время создания возврата + * + * @throws EmptyPropertyValueException Выбрасывается если быо передано пустое значение + * @throws InvalidPropertyValueException Выбрасывается если переданную строку или число не удалось интерпретировать + * как дату и время + * @throws InvalidPropertyValueTypeException Выбрасывается если было передано значение невалидного типа + */ + public function setCreatedAt($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty refund created_at value', 0, 'Refund.createdAt'); + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException('Invalid created_at value', 0, 'Refund.createdAt', $value); + } + $this->_createdAt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException('Invalid created_at value', 0, 'Refund.createdAt', $value); + } + } + + /** + * Возвращает дату проведения возврата + * @return \DateTime|null Время проведения возврата + * + * @throws InvalidPropertyValueException Выбрасывается если переданную строку или число не удалось интерпретировать + * как дату и время + * @throws InvalidPropertyValueTypeException Выбрасывается если было передано значение невалидного типа + */ + public function getAuthorizedAt() + { + return $this->_authorizedAt; + } + + /** + * Устанавливает время проведения возврата + * @param \DateTime|null $value Время проведения возврата + * + * + */ + public function setAuthorizedAt($value) + { + if ($value === null || $value === '') { + $this->_authorizedAt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException('Invalid authorizedAt value', 0, 'Refund.authorizedAt', $value); + } + $this->_authorizedAt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException('Invalid authorizedAt value', 0, 'Refund.authorizedAt', $value); + } + } + + /** + * Возвращает сумму возврата + * @return AmountInterface Сумма возврата + */ + public function getAmount() + { + return $this->_amount; + } + + /** + * Устанавливает сумму возврата + * @param AmountInterface $value Сумма возврата + * + * @throws InvalidPropertyValueException Выбрасывается если переданная сумма меньше или равна нулю + */ + public function setAmount(AmountInterface $value) + { + if ($value->getIntegerValue() <= 0) { + throw new InvalidPropertyValueException('Invalid refund amount', 0, 'Refund.amount', $value->getValue()); + } + $this->_amount = $value; + } + + /** + * Возвращает статус регистрации чека + * @return string Статус регистрации чека + */ + public function getReceiptRegistration() + { + return $this->_receiptRegistration; + } + + /** + * Устанавливает статус регистрации чека + * @param string $value Статус регистрации чека + * + * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент + * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение + * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой + */ + public function setReceiptRegistration($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty refund receiptRegistration', 0, 'Refund.receiptRegistration'); + } elseif (TypeCast::canCastToEnumString($value)) { + $castedValue = (string)$value; + if (ReceiptRegistrationStatus::valueExists($castedValue)) { + $this->_receiptRegistration = $castedValue; + } else { + throw new InvalidPropertyValueException( + 'Invalid refund receiptRegistration value', 0, 'Refund.receiptRegistration', $value + ); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid refund receiptRegistration value type', 0, 'Refund.receiptRegistration', $value + ); + } + } + + /** + * Возвращает комментарий к возврату + * @return string Комментарий, основание для возврата средств покупателю + */ + public function getComment() + { + return $this->_comment; + } + + /** + * Устанавливает комментарий к возврату + * @param string $value Комментарий, основание для возврата средств покупателю + * + * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент + * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение + * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой + */ + public function setComment($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty refund comment', 0, 'Refund.comment'); + } elseif (TypeCast::canCastToEnumString($value)) { + $length = mb_strlen((string)$value, 'utf-8'); + if ($length > 250) { + throw new InvalidPropertyValueException('Empty refund comment', 0, 'Refund.comment', $value); + } + $this->_comment = (string)$value; + } else { + throw new InvalidPropertyValueTypeException('Empty refund comment', 0, 'Refund.comment', $value); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundError.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundError.php new file mode 100644 index 0000000..a0a2526 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundError.php @@ -0,0 +1,62 @@ +_code; + } + + /** + * @param string $value Код ошибки + */ + public function setCode($value) + { + if ($value === null || $value === '') { + throw new \InvalidArgumentException('Invalid value'); + } + $this->_code = (string)$value; + } + + /** + * @return string Дополнительное текстовое пояснение ошибки + */ + public function getDescription() + { + return $this->_description; + } + + /** + * @param string $value Дополнительное текстовое пояснение ошибки + */ + public function setDescription($value) + { + $this->_description = (string)$value; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundErrorInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundErrorInterface.php new file mode 100644 index 0000000..a1fbe18 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundErrorInterface.php @@ -0,0 +1,24 @@ + true, + self::SUCCEEDED => true, + self::CANCELED => true, + ); +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Status.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Status.php new file mode 100644 index 0000000..c7e1558 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Status.php @@ -0,0 +1,21 @@ + true, + self::PENDING => true, + self::CANCELED => true, + ); +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequest.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequest.php new file mode 100644 index 0000000..c04c3c5 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequest.php @@ -0,0 +1,257 @@ +_accountId; + } + + /** + * Проверяет, был ли установлен идентификатор магазина + * @return bool True если идентификатор магазина был установлен, false если нет + */ + public function hasAccountId() + { + return $this->_accountId !== null; + } + + /** + * Устанавливает идентификатор магазина + * @param string|null $value Значение идентификатора магазина, null если требуется удалить значение + */ + public function setAccountId($value) + { + if ($value === null || $value === '') { + $this->_accountId = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_accountId = (string)$value; + } else { + throw new \InvalidArgumentException('Invalid account_id value type "' . gettype($value) . '"'); + } + } + + /** + * Возвращает идентификатор товара + * @return string Идентификатор товара + */ + public function getGatewayId() + { + return $this->_gatewayId; + } + + /** + * Проверяет, был ли установлен идентификатор товара + * @return bool True если идентификатор товара был установлен, false если нет + */ + public function hasGatewayId() + { + return !empty($this->_gatewayId); + } + + /** + * Устанавливает идентификатор товара + * @param string|null $value Значение идентификатора товара, null если требуется удалить значение + */ + public function setGatewayId($value) + { + if ($value === null || $value === '') { + $this->_gatewayId = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_gatewayId = (string)$value; + } else { + throw new \InvalidArgumentException('Invalid gateway_id value type "' . gettype($value) . '"'); + } + } + + /** + * Возвращает сумму заказа + * @return string Сумма заказа + */ + public function getAmount() + { + return $this->_amount; + } + + /** + * Проверяет, была ли установлена сумма заказа + * @return bool True если сумма заказа была установлена, false если нет + */ + public function hasAmount() + { + return !empty($this->_amount); + } + + /** + * Устанавливает сумму платежа + * @param string|null $value Сумма платежа, null если требуется удалить значение + */ + public function setAmount($value) + { + if ($value === null || $value === '') { + $this->_amount = null; + } else { + if (!is_scalar($value)) { + if (!is_object($value) || !method_exists($value, '__toString')) { + throw new InvalidPropertyValueTypeException( + 'Invalid amount value type', 0, 'amount.value', $value + ); + } + $value = (string)$value; + } + if (!is_numeric($value) || $value < 0.0) { + throw new InvalidPropertyValueException( + 'Invalid amount value "' . $value . '"', 0, 'amount.value', $value + ); + } elseif ($value < 0.01) { + $this->_amount = null; + } else { + $this->_amount = (string)round($value, 2); + } + } + } + + /** + * Возвращает код валюты, в которой осуществляется покупка + * @return string Код валюты + */ + public function getCurrency() + { + return $this->_currency; + } + + /** + * Проверяет был ли установлен код валюты + * @return bool True если код валюты был установлен, false если нет + */ + public function hasCurrency() + { + return !empty($this->_currency); + } + + /** + * Устанавливает код валюты в которой требуется провести платёж + * @param string $value Код валюты, null если требуется удалить значение + */ + public function setCurrency($value) + { + if ($value === null || $value === '') { + $this->_currency = null; + } elseif (TypeCast::canCastToEnumString($value)) { + $value = strtoupper($value); + if (!CurrencyCode::valueExists($value)) { + throw new \InvalidArgumentException('Invalid currency value: "' . $value . '"'); + } + $this->_currency = $value; + } else { + throw new \InvalidArgumentException('Invalid currency value type: "' . gettype($value) . '"'); + } + } + + /** + * Возвращает сценарий подтверждения платежа, для которого запрашивается список способов оплаты + * @return string Сценарий подтверждения платежа + */ + public function getConfirmationType() + { + return $this->_confirmationTypes; + } + + /** + * Проверяет был ли установлен сценарий подтверждения платежа + * @return bool True если сценарий подтверждения платежа был установлен, false если нет + */ + public function hasConfirmationType() + { + return !empty($this->_confirmationTypes); + } + + /** + * Устанавливает сценарий подтверждения платежа, для которого запрашивается список способов оплаты + * @param string $value Сценарий подтверждения платежа + */ + public function setConfirmationType($value) + { + if ($value === null || $value === '') { + $this->_confirmationTypes = null; + } elseif (TypeCast::canCastToEnumString($value)) { + if (!ConfirmationType::valueExists((string)$value)) { + throw new \InvalidArgumentException('Invalid confirmation_type value: "' . $value . '"'); + } + $this->_confirmationTypes = $value; + } else { + throw new \InvalidArgumentException('Invalid confirmation_type value type: "' . gettype($value) . '"'); + } + } + + /** + * Валидирует текущий запрос, проверяет все ли нужные свойства установлены + * @return bool True если запрос валиден, false если нет + */ + public function validate() + { + if (empty($this->_accountId)) { + $this->setValidationError('Account id not specified'); + return false; + } + return true; + } + + /** + * Возвращает инстанс билдера объектов запросов списока способов оплаты + * @return PaymentOptionsRequestBuilder Билдер запросов списока способов оплаты + */ + public static function builder() + { + return new PaymentOptionsRequestBuilder(); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestBuilder.php new file mode 100644 index 0000000..01bf9a9 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestBuilder.php @@ -0,0 +1,102 @@ +currentObject->setAccountId($value); + return $this; + } + + /** + * Устанавливает идентификатор товара + * @param string|null $value Значение идентификатора товара, null если требуется удалить значение + * @return PaymentOptionsRequestBuilder Инстанс текущего билдера запросов + */ + public function setGatewayId($value) + { + $this->currentObject->setGatewayId($value); + return $this; + } + + /** + * Устанавливает сумму платежа + * @param string|AmountInterface|null $value Сумма платежа, null если требуется удалить значение + * @return PaymentOptionsRequestBuilder Инстанс текущего билдера запросов + */ + public function setAmount($value) + { + if (empty($value)) { + $this->currentObject->setAmount(null); + } elseif ($value instanceof AmountInterface) { + if ($value->getValue() > 0.0) { + $this->currentObject->setAmount($value->getValue()); + } + $this->currentObject->setCurrency($value->getCurrency()); + } else { + $this->currentObject->setAmount($value); + } + return $this; + } + + /** + * Устанавливает код валюты в которой требуется провести платёж + * @param string $value Код валюты, null если требуется удалить значение + * @return PaymentOptionsRequestBuilder Инстанс текущего билдера запросов + */ + public function setCurrency($value) + { + $this->currentObject->setCurrency($value); + return $this; + } + + /** + * Устанавливает сценарий подтверждения платежа, для которого запрашивается список способов оплаты + * @param string $value Сценарий подтверждения платежа + * @return PaymentOptionsRequestBuilder Инстанс текущего билдера запросов + */ + public function setConfirmationType($value) + { + $this->currentObject->setConfirmationType($value); + return $this; + } + + /** + * Собирает и возвращает готовый объект запроса получения списка возможных способов оплаты + * @param array|null $options Массив для устанавливаемых значений + * @return PaymentOptionsRequestInterface Инстанс объекта запроса + */ + public function build(array $options = null) + { + return parent::build($options); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestInterface.php new file mode 100644 index 0000000..d0002db --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestInterface.php @@ -0,0 +1,77 @@ + $request->getAccountId(), + ); + if ($request->hasGatewayId()) { + $result['gateway_id'] = $request->getGatewayId(); + } + if ($request->hasAmount()) { + $result['amount'] = $request->getAmount(); + } + if ($request->hasCurrency()) { + $result['currency'] = $request->getCurrency(); + } + if ($request->hasConfirmationType()) { + $result['confirmation_types'] = $request->getConfirmationType(); + } + return $result; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponse.php new file mode 100644 index 0000000..aadb869 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponse.php @@ -0,0 +1,44 @@ +_items = array(); + foreach ($response['items'] as $item) { + $this->_items[] = new PaymentOptionsResponseItem($item); + } + } + + /** + * Возаращает список способов оплаты подходящих для оплаты заказа + * Если нет ни одного доступного способа оплаты, список будет пустым + * @return PaymentOptionsResponseItem[] Список способов оплаты + */ + public function getItems() + { + return $this->_items; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponseItem.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponseItem.php new file mode 100644 index 0000000..93126c0 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponseItem.php @@ -0,0 +1,118 @@ +_paymentMethodType = $options['payment_method_type']; + $this->_confirmationTypes = array(); + foreach ($options['confirmation_types'] as $opt) { + $this->_confirmationTypes[] = $opt; + } + + $this->_charge = new MonetaryAmount($options['charge']['value'], $options['charge']['currency']); + $this->_fee = new MonetaryAmount(); + if (!empty($options['fee'])) { + $this->_fee->setValue($options['fee']['value']); + $this->_fee->setCurrency($options['fee']['currency']); + } else { + $this->_fee->setCurrency($options['charge']['currency']); + } + + $this->_extraFee = false; + if (!empty($options['extra_fee'])) { + $this->_extraFee = (bool)$options['extra_fee']; + } + } + + /** + * Возвращает тип источника средств для проведения платежа + * @return string Тип источника средств для проведения платежа + * @see PaymentMethodType + */ + public function getPaymentMethodType() + { + return $this->_paymentMethodType; + } + + /** + * Возвращает список возможных сценариев подтверждения платежа + * @return string[] Список возможных сценариев подтверждения платежа + * @see ConfirmationType + */ + public function getConfirmationTypes() + { + return $this->_confirmationTypes; + } + + /** + * Возвращает сумму платежа + * @return AmountInterface Сумма платежа + */ + public function getCharge() + { + return $this->_charge; + } + + /** + * Возвращает сумму дополнительной комиссии при проведении платежа с помощью текущего способа оплаты + * @return AmountInterface Сумма комиссии + */ + public function getFee() + { + return $this->_fee; + } + + /** + * Возвращает признак присутствия дополнительной комиссии на стороне партнера + * @return bool True если комиссия на стороне партнёра имеется, false если нет + */ + public function getExtraFee() + { + return $this->_extraFee; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/AbstractPaymentResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/AbstractPaymentResponse.php new file mode 100644 index 0000000..262a7c8 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/AbstractPaymentResponse.php @@ -0,0 +1,115 @@ +setId($paymentInfo['id']); + $this->setStatus($paymentInfo['status']); + $this->setAmount($this->factoryAmount($paymentInfo['amount'])); + $this->setCreatedAt($paymentInfo['created_at']); + $this->setPaid($paymentInfo['paid']); + if (!empty($paymentInfo['payment_method'])) { + $this->setPaymentMethod($this->factoryPaymentMethod($paymentInfo['payment_method'])); + } + + if (!empty($paymentInfo['error'])) { + $error = new PaymentError(); + $error->setCode($paymentInfo['error']['code']); + if (!empty($paymentInfo['error']['description'])) { + $error->setDescription($paymentInfo['error']['description']); + } + $this->setError($error); + } + /* @todo не устанавливаем пока реципиента + if (!empty($paymentInfo['recipient'])) { + $recipient = new Recipient(); + $recipient->setAccountId($paymentInfo['recipient']['account_id']); + $recipient->setGatewayId($paymentInfo['recipient']['gateway_id']); + $this->setRecipient($recipient); + } + */ + if (!empty($paymentInfo['captured_at'])) { + $this->setCapturedAt(strtotime($paymentInfo['captured_at'])); + } + if (!empty($paymentInfo['confirmation'])) { + if ($paymentInfo['confirmation']['type'] === ConfirmationType::REDIRECT) { + $confirmation = new ConfirmationRedirect(); + $confirmation->setConfirmationUrl($paymentInfo['confirmation']['confirmation_url']); + if (empty($paymentInfo['confirmation']['enforce'])) { + $confirmation->setEnforce(false); + } else { + $confirmation->setEnforce($paymentInfo['confirmation']['enforce']); + } + if (!empty($paymentInfo['confirmation']['return_url'])) { + $confirmation->setReturnUrl($paymentInfo['confirmation']['return_url']); + } + } else { + $confirmation = new ConfirmationExternal(); + } + $this->setConfirmation($confirmation); + } + if (!empty($paymentInfo['refunded_amount'])) { + $this->setRefundedAmount($this->factoryAmount($paymentInfo['refunded_amount'])); + } + if (!empty($paymentInfo['receipt_registration'])) { + $this->setReceiptRegistration($paymentInfo['receipt_registration']); + } + if (!empty($paymentInfo['metadata'])) { + $metadata = new Metadata(); + foreach ($paymentInfo['metadata'] as $key => $value) { + $metadata->offsetSet($key, $value); + } + $this->setMetadata($metadata); + } + } + + /** + * Фабричный метод для создания способа оплаты + * @param array $options Настройки способа оплаты в массиве + * @return AbstractPaymentMethod Инстанс способа оплаты нужного типа + */ + private function factoryPaymentMethod($options) + { + $factory = new PaymentMethodFactory(); + return $factory->factoryFromArray($options); + } + + /** + * Фабричный метод создания суммы + * @param array $options Сумма в виде ассоциативного массива + * @return AmountInterface Созданный инстанс суммы + */ + private function factoryAmount($options) + { + $amount = new MonetaryAmount(null, $options['currency']); + if ($options['value'] > 0) { + $amount->setValue($options['value']); + } + return $amount; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequest.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequest.php new file mode 100644 index 0000000..5bcd8be --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequest.php @@ -0,0 +1,561 @@ +_recipient; + } + + /** + * Проверяет наличие получателя платежа в запросе + * @return bool True если получатель платежа задан, false если нет + */ + public function hasRecipient() + { + return !empty($this->_recipient); + } + + /** + * Возвращает сумму заказа + * @return AmountInterface Сумма заказа + */ + public function getAmount() + { + return $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 $value Данные фискального чека 54-ФЗ + */ + public function setReceipt(ReceiptInterface $value) + { + $this->_receipt = $value; + } + + /** + * Проверяет наличие чека в создаваемом платеже + * @return bool True если чек есть, false если нет + */ + public function hasReceipt() + { + return $this->_receipt !== null; + } + + /** + * Удаляет чек из запроса + */ + public function removeReceipt() + { + $this->_receipt = null; + } + + /** + * Устанавливает объект с информацией о получателе платежа + * @param RecipientInterface|null $value Инстанс объекта информации о получателе платежа или null + */ + public function setRecipient($value) + { + if ($value === null || $value === '') { + $this->_recipient = null; + } elseif (is_object($value) && $value instanceof RecipientInterface) { + $this->_recipient = $value; + } else { + throw new \InvalidArgumentException('Invalid recipient value type'); + } + } + + /** + * Возвращает одноразовый токен для проведения оплаты + * @return string Одноразовый токен для проведения оплаты, сформированный Yandex.Checkout JS widget + */ + public function getPaymentToken() + { + return $this->_paymentToken; + } + + /** + * Проверяет наличие одноразового токена для проведения оплаты + * @return bool True если токен установлен, false если нет + */ + public function hasPaymentToken() + { + return !empty($this->_paymentToken); + } + + /** + * Устанавливает одноразовый токен для проведения оплаты, сформированный Yandex.Checkout JS widget + * @param string $value Одноразовый токен для проведения оплаты + * + * @throws InvalidPropertyValueException Выбрасывается если переданное значение длинее 200 символов + * @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является строкой + */ + public function setPaymentToken($value) + { + if ($value === null || $value === '') { + $this->_paymentToken = null; + } elseif (TypeCast::canCastToString($value)) { + $length = mb_strlen((string)$value, 'utf-8'); + if ($length > 200) { + throw new InvalidPropertyValueException( + 'Invalid paymentToken value', 0, 'CreatePaymentRequest.paymentToken', $value + ); + } + $this->_paymentToken = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid paymentToken value type', 0, 'CreatePaymentRequest.paymentToken', $value + ); + } + } + + /** + * Устанавливает идентификатор закиси платёжных данных покупателя + * @return string Идентификатор записи о сохраненных платежных данных покупателя + */ + public function getPaymentMethodId() + { + return $this->_paymentMethodId; + } + + /** + * Проверяет наличие идентификатора записи о платёжных данных покупателя + * @return bool True если идентификатор задан, false если нет + */ + public function hasPaymentMethodId() + { + return !empty($this->_paymentMethodId); + } + + /** + * Устанавливает идентификатор записи о сохранённых данных покупателя + * @param string $value Идентификатор записи о сохраненных платежных данных покупателя + * + * @throws InvalidPropertyValueTypeException Генерируется если переданные значение не является строкой или null + */ + public function setPaymentMethodId($value) + { + if ($value === null || $value === '') { + $this->_paymentMethodId = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_paymentMethodId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid paymentMethodId value type in CreatePaymentRequest', + 0, + 'CreatePaymentRequest.CreatePaymentRequest', + $value + ); + } + } + + /** + * Возвращает данные для создания метода оплаты + * @return AbstractPaymentData Данные используемые для создания метода оплаты + */ + public function getPaymentMethodData() + { + return $this->_paymentMethodData; + } + + /** + * Проверяет установлен ли объект с методом оплаты + * @return bool True если объект метода оплаты установлен, false если нет + */ + public function hasPaymentMethodData() + { + return !empty($this->_paymentMethodData); + } + + /** + * Устанавливает объект с информацией для создания метода оплаты + * @param AbstractPaymentData|null $value Объект с создания метода оплаты или null + * + * @throws InvalidPropertyValueTypeException Выбрасывается если был передан объект невалидного типа + */ + public function setPaymentMethodData($value) + { + if ($value === null || $value === '') { + $this->_paymentMethodData = null; + } elseif (is_object($value) && $value instanceof AbstractPaymentData) { + $this->_paymentMethodData = $value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid paymentMethodData value type in CreatePaymentRequest', + 0, + 'CreatePaymentRequest.paymentMethodData', + $value + ); + } + } + + /** + * Возвращает способ подтверждения платежа + * @return AbstractConfirmationAttributes Способ подтверждения платежа + */ + public function getConfirmation() + { + return $this->_confirmation; + } + + /** + * Проверяет был ли установлен способ подтверждения платежа + * @return bool True если способ подтверждения платежа был установлен, false если нет + */ + public function hasConfirmation() + { + return $this->_confirmation !== null; + } + + /** + * Устанавливает способ подтверждения платежа + * @param AbstractConfirmationAttributes|null $value Способ подтверждения платежа + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является объектом типа + * AbstractConfirmationAttributes или null + */ + public function setConfirmation($value) + { + if ($value === null || $value === '') { + $this->_confirmation = null; + } elseif (is_object($value) && $value instanceof AbstractConfirmationAttributes) { + $this->_confirmation = $value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid confirmation value type in CreatePaymentRequest', + 0, + 'CreatePaymentRequest.confirmation', + $value + ); + } + } + + /** + * Возвращает флаг сохранения платёжных данных + * @return bool Флаг сохранения платёжных данных + */ + public function getSavePaymentMethod() + { + return $this->_savePaymentMethod; + } + + /** + * Проверяет был ли установлен флаг сохранения платёжных данных + * @return bool True если флыг был установлен, false если нет + */ + public function hasSavePaymentMethod() + { + return $this->_savePaymentMethod !== null; + } + + /** + * Устанавливает флаг сохранения платёжных данных. Значение true инициирует создание многоразового payment_method. + * @param bool $value Сохранить платежные данные для последующего использования + * + * @throws InvalidPropertyValueTypeException Генерируется если переданный аргумент не кастится в bool + */ + public function setSavePaymentMethod($value) + { + if ($value === null || $value === '') { + $this->_savePaymentMethod = null; + } elseif (TypeCast::canCastToBoolean($value)) { + $this->_savePaymentMethod = (bool)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid savePaymentMethod value type in CreatePaymentRequest', + 0, + 'CreatePaymentRequest.savePaymentMethod', + $value + ); + } + } + + /** + * Возвращает флаг автоматического принятия поступившей оплаты + * @return bool True если требуется автоматически принять поступившую оплату, false если нет + */ + public function getCapture() + { + return $this->_capture; + } + + /** + * Проверяет был ли установлен флаг автоматического приняти поступившей оплаты + * @return bool True если флаг автоматического принятия оплаты был установлен, false если нет + */ + public function hasCapture() + { + return $this->_capture !== null; + } + + /** + * Устанавливает флаг автоматического принятия поступившей оплаты + * @param bool $value Автоматически принять поступившую оплату + * + * @throws InvalidPropertyValueTypeException Генерируется если переданный аргумент не кастится в bool + */ + public function setCapture($value) + { + if ($value === null || $value === '') { + $this->_capture = null; + } elseif (TypeCast::canCastToBoolean($value)) { + $this->_capture = (bool)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid capture value type in CreatePaymentRequest', 0, 'CreatePaymentRequest.capture', $value + ); + } + } + + /** + * Возвращает IPv4 или IPv6-адрес покупателя + * @return string IPv4 или IPv6-адрес покупателя + */ + public function getClientIp() + { + return $this->_clientIp; + } + + /** + * Проверяет был ли установлен IPv4 или IPv6-адрес покупателя + * @return bool True если IP адрес покупателя был установлен, false если нет + */ + public function hasClientIp() + { + return $this->_clientIp !== null; + } + + /** + * Устанавливает IP адрес покупателя + * @param string $value IPv4 или IPv6-адрес покупателя + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не является строкой + */ + public function setClientIp($value) + { + if ($value === null || $value === '') { + $this->_clientIp = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_clientIp = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid clientIp value type in CreatePaymentRequest', 0, 'CreatePaymentRequest.clientIp', $value + ); + } + } + + /** + * Возвращает данные оплаты установленные мерчантом + * @return Metadata Метаданные, привязанные к платежу + */ + public function getMetadata() + { + return $this->_metadata; + } + + /** + * Проверяет были ли установлены метаданные заказа + * @return bool True если метаданные были установлены, false если нет + */ + public function hasMetadata() + { + return !empty($this->_metadata) && $this->_metadata->count() > 0; + } + + /** + * Устанавливает метаданные, привязанные к платежу + * @param Metadata|null $value Метаданные платежа, устанавливаемые мерчантом + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданные данные не удалось интерпретировать как + * метаданные платежа + */ + public function setMetadata($value) + { + if ($value === null || (is_array($value) && empty($value))) { + $this->_metadata = null; + } elseif (is_object($value) && $value instanceof Metadata) { + $this->_metadata = $value; + } elseif (is_array($value)) { + $this->_metadata = new Metadata(); + foreach ($value as $key => $val) { + $this->_metadata->offsetSet($key, (string)$val); + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid metadata value type in CreatePaymentRequest', 0, 'CreatePaymentRequest.metadata', $value + ); + } + } + + /** + * Проверяет на валидность текущий объект + * @return bool True если объект запроса валиден, false если нет + */ + public function validate() + { + $amount = $this->_amount; + if ($amount === null) { + $this->setValidationError('Payment amount not specified'); + return false; + } + if ($amount->getValue() <= 0.0) { + $this->setValidationError('Invalid payment amount value: ' . $amount->getValue()); + return false; + } + if ($this->_receipt !== null && $this->_receipt->notEmpty()) { + $email = $this->_receipt->getEmail(); + $phone = $this->_receipt->getPhone(); + if (empty($email) && empty($phone)) { + $this->setValidationError('Both email and phone values are empty in receipt'); + return false; + } + if ($this->_receipt->getTaxSystemCode() === null) { + foreach ($this->_receipt->getItems() as $item) { + if ($item->getVatCode() === null) { + $this->setValidationError('Item vat_id and receipt tax_system_id not specified'); + return false; + } + } + } + } + if ($this->hasPaymentToken()) { + if ($this->hasPaymentMethodId()) { + $this->setValidationError('Both paymentToken and paymentMethodID values are specified'); + return false; + } + if ($this->hasPaymentMethodData()) { + $this->setValidationError('Both paymentToken and paymentData values are specified'); + return false; + } + } elseif ($this->hasPaymentMethodId()) { + if ($this->hasPaymentMethodData()) { + $this->setValidationError('Both paymentMethodID and paymentData values are specified'); + return false; + } + } /* elseif (!$this->hasPaymentMethodData()) { + $this->setValidationError('Payment method not specified, set paymentToken, paymentMethodID or paymentData'); + return false; + }*/ + return true; + } + + /** + * Возвращает билдер объектов запросов создания платежа + * @return CreatePaymentRequestBuilder Инстанс билдера объектов запрсов + */ + public static function builder() + { + return new CreatePaymentRequestBuilder(); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestBuilder.php new file mode 100644 index 0000000..7e63547 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestBuilder.php @@ -0,0 +1,447 @@ +recipient = new Recipient(); + $this->receipt = new Receipt(); + $this->amount = new MonetaryAmount(); + + return $request; + } + + /** + * Устанавливает идентификатор магазина получателя платежа + * @param string $value Идентификатор магазина + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение + * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение + */ + public function setAccountId($value) + { + $this->recipient->setAccountId($value); + return $this; + } + + /** + * Устанавливает идентификатор товара + * @param string $value Идентификатор товара + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение + * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение + */ + public function setGatewayId($value) + { + $this->recipient->setGatewayId($value); + return $this; + } + + /** + * Устанавливает сумму заказа + * @param AmountInterface|string $value Сумма заказа + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение + * @throws InvalidPropertyValueException Выбрасывается если был передан ноль или отрицательное значение + * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение + */ + public function setAmount($value) + { + if ($value instanceof AmountInterface) { + $this->amount->setValue($value->getValue()); + $this->amount->setCurrency($value->getCurrency()); + } elseif ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty payment amount value', 0, 'CreatePaymentRequest.amount'); + } elseif (!is_numeric($value)) { + throw new InvalidPropertyValueTypeException( + 'Invalid payment amount value type', 0, 'CreatePaymentRequest.amount', $value + ); + } elseif ($value > 0) { + $this->amount->setValue($value); + } else { + throw new InvalidPropertyValueException( + 'Invalid payment amount value', 0, 'CreatePaymentRequest.amount', $value + ); + } + return $this; + } + + /** + * Устанавливает валюту в которой заказ оплачивается + * @param string $value Код валюты заказа + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws EmptyPropertyValueException Генерируется если было передано пустое значение + * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа + * @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты + */ + public function setCurrency($value) + { + $this->amount->setCurrency($value); + foreach ($this->receipt->getItems() as $item) { + $item->getPrice()->setCurrency($value); + } + return $this; + } + + /** + * Устанавлвиает список товаров в заказе для создания чека + * @param array $value Массив товаров в заказе + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @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, + 'CreatePaymentRequest.items[' . $index . '].title', + json_encode($item) + ); + } + if (empty($item['price'])) { + throw new InvalidPropertyValueException( + 'Item#' . $index . ' price not specified', + 0, + 'CreatePaymentRequest.items[' . $index . '].price', + json_encode($item) + ); + } + $this->addReceiptItem( + empty($item['title']) ? $item['description'] : $item['title'], + $item['price'], + empty($item['quantity']) ? 1.0 : $item['quantity'], + empty($item['vatCode']) ? null : $item['vatCode'] + ); + } + $index++; + } + return $this; + } + + /** + * Добавляет в чек товар + * @param string $title Название или описание товара + * @param string $price Цена товара в валюте, заданной в заказе + * @param float $quantity Количество покупаемого товара + * @param int|null $vatCode Ставка НДС, или null если используется ставка НДС заказа + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + */ + public function addReceiptItem($title, $price, $quantity = 1.0, $vatCode = null) + { + $item = new ReceiptItem(); + $item->setDescription($title); + $item->setQuantity($quantity); + $item->setVatCode($vatCode); + $item->setPrice(new MonetaryAmount($price, $this->amount->getCurrency())); + $this->receipt->addItem($item); + return $this; + } + + /** + * Добавляет в чек доставку товара + * @param string $title Название доставки в чеке + * @param string $price Стоимость доставки + * @param int|null $vatCode Ставка НДС, или null если используется ставка НДС заказа + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + */ + public function addReceiptShipping($title, $price, $vatCode = null) + { + $item = new ReceiptItem(); + $item->setDescription($title); + $item->setQuantity(1); + $item->setVatCode($vatCode); + $item->setIsShipping(true); + $item->setPrice(new MonetaryAmount($price, $this->amount->getCurrency())); + $this->receipt->addItem($item); + return $this; + } + + /** + * Устанавливает адрес электронной почты получателя чека + * @param string $value Email получателя чека + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа + */ + public function setReceiptEmail($value) + { + $this->receipt->setEmail($value); + return $this; + } + + /** + * Устанавливает телефон получателя чека + * @param string $value Телефон получателя чека + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если был передан не телефон, а что-то другое + * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа + */ + public function setReceiptPhone($value) + { + $this->receipt->setPhone($value); + return $this; + } + + /** + * Устанавливает код системы налогообложения. + * @param int $value Код системы налогообложения. Число 1-6. + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент - не число + * @throws InvalidPropertyValueException Выбрасывается если переданный аргумент меньше одного или больше шести + */ + public function setTaxSystemCode($value) + { + $this->receipt->setTaxSystemCode($value); + return $this; + } + + /** + * Устанавливает одноразовый токен для проведения оплаты + * @param string $value Одноразовый токен для проведения оплаты + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Выбрасывается если переданное значение длинее 200 символов + * @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является строкой + */ + public function setPaymentToken($value) + { + $this->currentObject->setPaymentToken($value); + return $this; + } + + /** + * Устанавливает идентификатор записи о сохранённых данных покупателя + * @param string $value Идентификатор записи о сохраненных платежных данных покупателя + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Генерируется если переданные значение не является строкой или null + */ + public function setPaymentMethodId($value) + { + $this->currentObject->setPaymentMethodId($value); + return $this; + } + + /** + * Устанавливает объект с информацией для создания метода оплаты + * @param AbstractPaymentData|string|array|null $value Объект с создания метода оплаты или null + * @param array $options Настройки способа оплаты в виде ассоциативного массива + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если был передан объект невалидного типа + */ + public function setPaymentMethodData($value, array $options = null) + { + if (is_string($value) && $value !== '') { + if (empty($options)) { + $value = $this->getPaymentDataFactory()->factory($value); + } else { + $value = $this->getPaymentDataFactory()->factoryFromArray($options, $value); + } + } elseif (is_array($value)) { + $value = $this->getPaymentDataFactory()->factoryFromArray($value); + } + $this->currentObject->setPaymentMethodData($value); + return $this; + } + + /** + * Устанавливает способ подтверждения платежа + * @param AbstractConfirmationAttributes|string|array|null $value Способ подтверждения платежа + * @param array|null $options Настройки способа подтверждения платежа в виде массива + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является объектом типа + * AbstractConfirmationAttributes или null + */ + public function setConfirmation($value, array $options = null) + { + if (is_string($value) && $value !== '') { + if (empty($options)) { + $value = $this->getConfirmationFactory()->factory($value); + } else { + $value = $this->getConfirmationFactory()->factoryFromArray($options, $value); + } + } elseif (is_array($value)) { + $value = $this->getConfirmationFactory()->factoryFromArray($value); + } + $this->currentObject->setConfirmation($value); + return $this; + } + + /** + * Устанавливает флаг сохранения платёжных данных. Значение true инициирует создание многоразового payment_method. + * @param bool $value Сохранить платежные данные для последующего использования + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Генерируется если переданный аргумент не кастится в bool + */ + public function setSavePaymentMethod($value) + { + $this->currentObject->setSavePaymentMethod($value); + return $this; + } + + /** + * Устанавливает флаг автоматического принятия поступившей оплаты + * @param bool $value Автоматически принять поступившую оплату + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Генерируется если переданный аргумент не кастится в bool + + */ + public function setCapture($value) + { + $this->currentObject->setCapture($value); + return $this; + } + + /** + * Устанавливает IP адрес покупателя + * @param string $value IPv4 или IPv6-адрес покупателя + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не является строкой + */ + public function setClientIp($value) + { + $this->currentObject->setClientIp($value); + return $this; + } + + /** + * Устанавливает метаданные, привязанные к платежу + * @param Metadata|null $value Метаданные платежа, устанавливаемые мерчантом + * @return CreatePaymentRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданные данные не удалось интерпретировать как + * метаданные платежа + */ + public function setMetadata($value) + { + $this->currentObject->setMetadata($value); + return $this; + } + + /** + * Строит и возвращает объект запроса для отправки в API яндекс денег + * @param array|null $options Массив параметров для установки в объект запроса + * @return CreatePaymentRequestInterface Инстанс объекта запроса + * + * @throws InvalidRequestException Выбрасывается если собрать объект запроса не удалось + */ + public function build(array $options = null) + { + if (!empty($options)) { + $this->setOptions($options); + } + $accountId = $this->recipient->getAccountId(); + $gatewayId = $this->recipient->getGatewayId(); + if (!empty($accountId) && !empty($gatewayId)) { + $this->currentObject->setRecipient($this->recipient); + } + if ($this->receipt->notEmpty()) { + $this->currentObject->setReceipt($this->receipt); + } + $this->currentObject->setAmount($this->amount); + return parent::build(); + } + + /** + * Возвращает фабрику методов проведения платежей + * @return PaymentDataFactory Фабрика методов проведения платежей + */ + protected function getPaymentDataFactory() + { + if ($this->paymentDataFactory === null) { + $this->paymentDataFactory = new PaymentDataFactory(); + } + return $this->paymentDataFactory; + } + + /** + * Возвращает фабрику для создания методов подтверждения платежей + * @return ConfirmationAttributesFactory Фабрика объектов методов подтверждения платежей + */ + protected function getConfirmationFactory() + { + if ($this->confirmationFactory === null) { + $this->confirmationFactory = new ConfirmationAttributesFactory(); + } + return $this->confirmationFactory; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestInterface.php new file mode 100644 index 0000000..e36c803 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestInterface.php @@ -0,0 +1,157 @@ + 'referenceId', + 'payment_token' => 'paymentToken', + 'payment_method_id' => 'paymentMethodId', + 'save_payment_method' => 'savePaymentMethod', + 'capture' => 'capture', + 'client_ip' => 'clientIp', + ); + + private static $paymentDataSerializerMap = array( + PaymentMethodType::BANK_CARD => 'serializePaymentDataBankCard', + PaymentMethodType::YANDEX_MONEY => 'serializePaymentDataYandexWallet', + PaymentMethodType::APPLE_PAY => 'serializePaymentDataMobile', + PaymentMethodType::ANDROID_PAY => 'serializePaymentDataMobile', + PaymentMethodType::SBERBANK => 'serializePaymentDataSberbank', + PaymentMethodType::ALFABANK => 'serializePaymentDataAlfabank', + PaymentMethodType::WEBMONEY => 'serializePaymentData', + PaymentMethodType::QIWI => 'serializePaymentDataMobilePhone', + PaymentMethodType::CASH => 'serializePaymentDataMobilePhone', + PaymentMethodType::MOBILE_BALANCE => 'serializePaymentDataMobilePhone', + ); + + public function serialize(CreatePaymentRequestInterface $request) + { + $result = array( + 'amount' => $this->serializeAmount($request->getAmount()), + ); + if ($request->hasReceipt()) { + $receipt = $request->getReceipt(); + if ($receipt->notEmpty()) { + $result['receipt'] = array(); + foreach ($receipt->getItems() as $item) { + $vatId = $item->getVatCode(); + if ($vatId === null) { + $vatId = $receipt->getTaxSystemCode(); + } + $result['receipt']['items'][] = array( + 'description' => $item->getDescription(), + 'amount' => $this->serializeAmount($item->getPrice()), + 'quantity' => $item->getQuantity(), + 'vat_code' => $vatId, + ); + } + $value = $receipt->getEmail(); + if (!empty($value)) { + $result['receipt']['email'] = $value; + } + $value = $receipt->getPhone(); + if (!empty($value)) { + $result['receipt']['phone'] = $value; + } + $value = $receipt->getTaxSystemCode(); + if (!empty($value)) { + $result['receipt']['tax_system_code'] = $value; + } + } + } + if ($request->hasRecipient()) { + $result['recipient']['account_id'] = $request->getRecipient()->getAccountId(); + $result['recipient']['gateway_id'] = $request->getRecipient()->getGatewayId(); + } + if ($request->hasPaymentMethodData()) { + $method = self::$paymentDataSerializerMap[$request->getPaymentMethodData()->getType()]; + $result['payment_method_data'] = $this->{$method}($request->getPaymentMethodData()); + } + if ($request->hasConfirmation()) { + $result['confirmation'] = array( + 'type' => $request->getConfirmation()->getType(), + ); + $confirmation = $request->getConfirmation(); + if ($confirmation->getType() === ConfirmationType::REDIRECT) { + if ($confirmation->getEnforce()) { + $result['confirmation']['enforce'] = $confirmation->getEnforce(); + } + $result['confirmation']['return_url'] = $confirmation->getReturnUrl(); + } + } + if ($request->hasMetadata()) { + $result['metadata'] = $request->getMetadata()->toArray(); + } + + foreach (self::$propertyMap as $name => $property) { + $value = $request->{$property}; + if (!empty($value)) { + $result[$name] = $value; + } + } + return $result; + } + + private function serializeAmount(AmountInterface $amount) + { + return array( + 'value' => $amount->getValue(), + 'currency' => $amount->getCurrency(), + ); + } + + private function serializePaymentDataBankCard(PaymentDataBankCard $paymentData) + { + $result = array( + 'type' => $paymentData->getType(), + ); + if ($paymentData->getBankCard() !== null) { + $result['bank_card'] = array( + 'cardholder' => $paymentData->getBankCard()->getCardholder(), + 'expiry_year' => $paymentData->getBankCard()->getExpiryYear(), + 'expiry_month' => $paymentData->getBankCard()->getExpiryMonth(), + 'number' => $paymentData->getBankCard()->getNumber(), + 'csc' => $paymentData->getBankCard()->getCsc(), + ); + } + return $result; + } + + private function serializePaymentDataYandexWallet(PaymentDataYandexWallet $paymentData) + { + $result = array( + 'type' => $paymentData->getType(), + ); + if ($paymentData->getAccountNumber() !== null) { + $result['account_number'] = $paymentData->getAccountNumber(); + } + if ($paymentData->getPhone() !== null) { + $result['phone'] = $paymentData->getPhone(); + } + return $result; + } + + private function serializePaymentDataMobile(AbstractPaymentData $paymentData) + { + $result = array( + 'type' => $paymentData->getType(), + ); + if ($paymentData->getPaymentData() !== null) { + $result['payment_data'] = $paymentData->getPaymentData(); + } + return $result; + } + + private function serializePaymentDataSberbank(PaymentDataSberbank $paymentData) + { + $result = array( + 'type' => $paymentData->getType(), + ); + if ($paymentData->getBindId() !== null) { + $result['bind_id'] = $paymentData->getBindId(); + } + if ($paymentData->getPhone() !== null) { + $result['phone'] = $paymentData->getPhone(); + } + return $result; + } + + private function serializePaymentDataAlfabank(PaymentDataAlfabank $paymentData) + { + $result = array( + 'type' => $paymentData->getType(), + ); + if ($paymentData->getLogin() !== null) { + $result['login'] = $paymentData->getLogin(); + } + return $result; + } + + private function serializePaymentData(AbstractPaymentData $paymentData) + { + return array( + 'type' => $paymentData->getType(), + ); + } + + private function serializePaymentDataMobilePhone(AbstractPaymentData $paymentData) + { + $result = array( + 'type' => $paymentData->getType(), + ); + if ($paymentData->getPhone() !== null) { + $result['phone'] = $paymentData->getPhone(); + } + return $result; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentResponse.php new file mode 100644 index 0000000..35c05de --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentResponse.php @@ -0,0 +1,11 @@ +_amount; + } + + /** + * Проверяет была ли установлена сумма оплаты + * @return bool True если сумма оплаты была установлена, false если нет + */ + public function hasAmount() + { + return !empty($this->_amount); + } + + /** + * Устанавливает сумму оплаты + * @param AmountInterface $value Подтверждаемая сумма оплаты + */ + public function setAmount(AmountInterface $value) + { + $this->_amount = $value; + } + + /** + * Валидирует объект запроса + * @return bool True если запрос валиден и его можно отправить в API, false если нет + */ + public function validate() + { + if ($this->_amount === null) { + $this->setValidationError('Amount not specified in CreateCaptureRequest'); + return false; + } + $value = $this->_amount->getValue(); + if (empty($value) || $value <= 0.0) { + $this->setValidationError('Invalid amount value: ' . $value); + return false; + } + return true; + } + + /** + * Возвращает билдер объектов запросов на подтверждение оплаты + * @return CreateCaptureRequestBuilder Инстанс билдера + */ + public static function builder() + { + return new CreateCaptureRequestBuilder(); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestBuilder.php new file mode 100644 index 0000000..2ff2613 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestBuilder.php @@ -0,0 +1,97 @@ +amount = new MonetaryAmount(); + return new CreateCaptureRequest(); + } + + /** + * Устанавливает сумму оплаты + * @param AmountInterface|string $value Подтверждаемая сумма оплаты + * @return CreateCaptureRequestBuilder Инстанс билдера запросов на подтверждение суммы оплаты + * + * @throws EmptyPropertyValueException Генерируется если было передано пустое значение + * @throws InvalidPropertyValueException Выбрасывается если переданная сумма меньше или равна нулю + * @throws InvalidPropertyValueTypeException Выбрасывается если переданная сумма не является числом или объектом + * типа AmountInterface + */ + public function setAmount($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException('Empty currency value', 0, 'amount.currency'); + } elseif (is_object($value) && $value instanceof AmountInterface) { + $this->amount->setValue($value->getValue()); + $this->amount->setCurrency($value->getCurrency()); + } elseif (is_numeric($value)) { + $this->amount->setValue($value); + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid amount value type in CreateCaptureRequestBuilder', + 0, + 'CreateCaptureRequestBuilder.amount', + $value + ); + } + return $this; + } + + /** + * Устанавливает валюту в которой будет происходить подтверждение оплаты заказа + * @param string $value Валюта в которой подтверждается оплата + * @return CreateCaptureRequestBuilder Инстанс билдера запросов на подтверждение суммы оплаты + * + * @throws EmptyPropertyValueException Генерируется если было передано пустое значение + * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа + * @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты + */ + public function setCurrency($value) + { + $this->amount->setCurrency($value); + return $this; + } + + /** + * Осуществляет сборку объекта запроса к API + * @param array|null $options Массив дополнительных настроек объекта + * @return CreateCaptureRequestInterface Иснатс объекта запроса к API + * + * @throws InvalidRequestException Выбрасывается если при валидации запроса произошла ошибка + * @throws InvalidPropertyException Выбрасывается если не удалось установить один из параметров, переданных в + * массиве настроек + */ + public function build(array $options = null) + { + if (!empty($options)) { + $this->setOptions($options); + } + $this->currentObject->setAmount($this->amount); + return parent::build(); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestInterface.php new file mode 100644 index 0000000..90d5d1e --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestInterface.php @@ -0,0 +1,28 @@ + array( + 'value' => $request->getAmount()->getValue(), + 'currency' => $request->getAmount()->getCurrency(), + ), + ); + return $result; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureResponse.php new file mode 100644 index 0000000..368675e --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureResponse.php @@ -0,0 +1,13 @@ +_paymentId; + } + + /** + * Проверяет, был ли задан идентификатор платежа + * @return bool True если идентификатор был задан, false если нет + */ + public function hasPaymentId() + { + return $this->_paymentId !== null; + } + + /** + * Устанавливает идентификатор платежа или null если требуется его удалить + * @param string|null $value Идентификатор платежа + * + * @throws InvalidPropertyValueException Выбрасывается если длина переданной строки не равна 36 символам + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setPaymentId($value) + { + if ($value === null || $value === '') { + $this->_paymentId = null; + } elseif (TypeCast::canCastToString($value)) { + $length = mb_strlen((string)$value, 'utf-8'); + if ($length != 36) { + throw new InvalidPropertyValueException( + 'Invalid payment_id value length in PaymentsRequest (' . $length . ' != 36)', + 0, 'PaymentsRequest.paymentId', $value + ); + } + $this->_paymentId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid payment_id value type in PaymentsRequest', 0, 'PaymentsRequest.paymentId', $value + ); + } + } + + /** + * Возвращает идентификатор магазина, если он был задан + * @return string|null Идентификатор магазина + */ + public function getAccountId() + { + return $this->_accountId; + } + + /** + * Проверяет, был ли установлен идентификатор магазина + * @return bool True если идентификатор магазина был установлен, false если нет + */ + public function hasAccountId() + { + return $this->_accountId !== null; + } + + /** + * Устанавлвиает идентификатор магазина + * @param string $value Идентификатор магазина или null чтобы удалить значение + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setAccountId($value) + { + if ($value === null || $value === '') { + $this->_accountId = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_accountId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid accountId value type in PaymentsRequest', 0, 'PaymentsRequest.accountId', $value + ); + } + } + + /** + * Возвращает идентификатор товара + * @return string|null Идентификатор товара + */ + public function getGatewayId() + { + return $this->_gatewayId; + } + + /** + * Проверяет был ли установлен идентификатор товара + * @return bool True если идентификатор товара был установлен, false если нет + */ + public function hasGatewayId() + { + return $this->_gatewayId !== null; + } + + /** + * Устанавливает идентификатор товара + * @param string|null $value Идентификатор товара или null чтобы удалить значение + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setGatewayId($value) + { + if ($value === null || $value === '') { + $this->_gatewayId = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_gatewayId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid gatewayId value type in PaymentsRequest', 0, 'PaymentsRequest.gatewayId', $value + ); + } + } + + /** + * Возвращает дату создания от которой будут возвращены платежи или null если дата не была установлена + * @return \DateTime|null Время создания, от (включительно) + */ + public function getCreatedGte() + { + return $this->_createdGte; + } + + /** + * Проверяет была ли установлена дата создания от которой выбираются платежи + * @return bool True если дата была установлена, false если нет + */ + public function hasCreatedGte() + { + return $this->_createdGte !== null; + } + + /** + * Устанавливает дату создания от которой выбираются платежи + * @param \DateTime|string|int|null $value Время создания, от (включительно) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedGte($value) + { + if ($value === null || $value === '') { + $this->_createdGte = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid created_gte value in PaymentsRequest', 0, 'PaymentRequest.createdGte' + ); + } + $this->_createdGte = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid created_gte value type in PaymentsRequest', 0, 'PaymentRequest.createdGte' + ); + } + } + + /** + * Возвращает дату создания от которой будут возвращены платежи или null если дата не была установлена + * @return \DateTime|null Время создания, от (не включая) + */ + public function getCreatedGt() + { + return $this->_createdGt; + } + + /** + * Проверяет была ли установлена дата создания от которой выбираются платежи + * @return bool True если дата была установлена, false если нет + */ + public function hasCreatedGt() + { + return $this->_createdGt !== null; + } + + /** + * Устанавливает дату создания от которой выбираются платежи + * @param \DateTime|string|int|null $value Время создания, от (не включая) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedGt($value) + { + if ($value === null || $value === '') { + $this->_createdGt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid created_gt value in PaymentsRequest', 0, 'PaymentRequest.createdGt' + ); + } + $this->_createdGt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid created_gt value type in PaymentsRequest', 0, 'PaymentRequest.createdGt' + ); + } + } + + /** + * Возвращает дату создания до которой будут возвращены платежи или null если дата не была установлена + * @return \DateTime|null Время создания, до (включительно) + */ + public function getCreatedLte() + { + return $this->_createdLte; + } + + /** + * Проверяет была ли установлена дата создания до которой выбираются платежи + * @return bool True если дата была установлена, false если нет + */ + public function hasCreatedLte() + { + return $this->_createdLte !== null; + } + + /** + * Устанавливает дату создания до которой выбираются платежи + * @param \DateTime|string|int|null $value Время создания, до (включительно) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedLte($value) + { + if ($value === null || $value === '') { + $this->_createdLte = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid created_lte value in PaymentsRequest', 0, 'PaymentRequest.createdLte' + ); + } + $this->_createdLte = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid created_lte value type in PaymentsRequest', 0, 'PaymentRequest.createdLte' + ); + } + } + + /** + * Возвращает дату создания до которой будут возвращены платежи или null если дата не была установлена + * @return \DateTime|null Время создания, до (не включая) + */ + public function getCreatedLt() + { + return $this->_createdLt; + } + + /** + * Проверяет была ли установлена дата создания до которой выбираются платежи + * @return bool True если дата была установлена, false если нет + */ + public function hasCreatedLt() + { + return $this->_createdLt !== null; + } + + /** + * Устанавливает дату создания до которой выбираются платежи + * @param \DateTime|string|int|null $value Время создания, до (не включая) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedLt($value) + { + if ($value === null || $value === '') { + $this->_createdLt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid created_lt value in PaymentsRequest', 0, 'PaymentRequest.createdLt' + ); + } + $this->_createdLt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid created_lt value type in PaymentsRequest', 0, 'PaymentRequest.createdLt' + ); + } + } + + /** + * Возвращает дату проведения от которой будут возвращены платежи или null если дата не была установлена + * @return \DateTime|null Время проведения операции, от (включительно) + */ + public function getAuthorizedGte() + { + return $this->_authorizedGte; + } + + /** + * Проверяет была ли установлена дата проведения от которой выбираются платежи + * @return bool True если дата была установлена, false если нет + */ + public function hasAuthorizedGte() + { + return $this->_authorizedGte !== null; + } + + /** + * Устанавливает дату проведения от которой выбираются платежи + * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить + * значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedGte($value) + { + if ($value === null || $value === '') { + $this->_authorizedGte = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid authorized_gte value in PaymentsRequest', 0, 'PaymentRequest.authorizedGte' + ); + } + $this->_authorizedGte = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid authorized_gte value type in PaymentsRequest', 0, 'PaymentRequest.authorizedGte' + ); + } + } + + /** + * Возвращает дату проведения от которой будут возвращены платежи или null если дата не была установлена + * @return \DateTime|null Время проведения операции, от (не включая) + */ + public function getAuthorizedGt() + { + return $this->_authorizedGt; + } + + /** + * Проверяет была ли установлена дата проведения от которой выбираются платежи + * @return bool True если дата была установлена, false если нет + */ + public function hasAuthorizedGt() + { + return $this->_authorizedGt !== null; + } + + /** + * Устанавливает дату проведения от которой выбираются платежи + * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить + * значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedGt($value) + { + if ($value === null || $value === '') { + $this->_authorizedGt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid authorized_gt value in PaymentsRequest', 0, 'PaymentRequest.authorizedGt' + ); + } + $this->_authorizedGt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid authorized_gt value type in PaymentsRequest', 0, 'PaymentRequest.authorizedGt' + ); + } + } + + /** + * Возвращает дату проведения до которой будут возвращены платежи или null если дата не была установлена + * @return \DateTime|null Время проведения, до (включительно) + */ + public function getAuthorizedLte() + { + return $this->_authorizedLte; + } + + /** + * Проверяет была ли установлена дата проведения до которой выбираются платежи + * @return bool True если дата была установлена, false если нет + */ + public function hasAuthorizedLte() + { + return $this->_authorizedLte !== null; + } + + /** + * Устанавливает дату проведения до которой выбираются платежи + * @param \DateTime|string|int|null $value Время проведения, до (включительно) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedLte($value) + { + if ($value === null || $value === '') { + $this->_authorizedLte = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid authorized_lte value in PaymentsRequest', 0, 'PaymentRequest.authorizedLte' + ); + } + $this->_authorizedLte = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid authorized_lte value type in PaymentsRequest', 0, 'PaymentRequest.authorizedLte' + ); + } + } + + /** + * Возвращает дату проведения до которой будут возвращены платежи платежи или null если она не была установлена + * @return \DateTime|null Время проведения, до (не включая) + */ + public function getAuthorizedLt() + { + return $this->_authorizedLt; + } + + /** + * Проверяет была ли установлена дата проведения до которой выбираются платежи + * @return bool True если дата была установлена, false если нет + */ + public function hasAuthorizedLt() + { + return $this->_authorizedLt !== null; + } + + /** + * Устанавливает дату проведения до которой выбираются платежи + * @param \DateTime|string|int|null $value Время проведения, до (не включая) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedLt($value) + { + if ($value === null || $value === '') { + $this->_authorizedLt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid authorized_lt value in PaymentsRequest', 0, 'PaymentRequest.authorizedLt' + ); + } + $this->_authorizedLt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid authorized_lt value type in PaymentsRequest', 0, 'PaymentRequest.authorizedLt' + ); + } + } + + /** + * Возвращает статус выбираемых платежей или null если он до этого не был установлен + * @return string|null Статус выбираемых платежей + */ + public function getStatus() + { + return $this->_status; + } + + /** + * Проверяет был ли установлен статус выбираемых платежей + * @return bool True если статус был установлен, false если нет + */ + public function hasStatus() + { + return $this->_status !== null; + } + + /** + * Устанавливает статус выбираемых платежей + * @param string $value Статус выбираемых платежей или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Выбрасывается если переданное значение не является валидным статусом + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setStatus($value) + { + if ($value === null || $value === '') { + $this->_status = null; + } elseif (TypeCast::canCastToEnumString($value)) { + if (!Status::valueExists((string)$value)) { + throw new InvalidPropertyValueException( + 'Invalid status value in PaymentsRequest', 0, 'PaymentsRequest.status', $value + ); + } else { + $this->_status = (string)$value; + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid status value in PaymentsRequest', 0, 'PaymentsRequest.status', $value + ); + } + } + + /** + * Возвращает токен для получения следующей страницы выборки + * @return string|null Токен для получения следующей страницы выборки + */ + public function getNextPage() + { + return $this->_nextPage; + } + + /** + * Проверяет был ли установлен токен следующей страницы + * @return bool True если токен был установлен, false если нет + */ + public function hasNextPage() + { + return $this->_nextPage !== null; + } + + /** + * Устанавливает токен следующей страницы выборки + * @param string $value Токен следующей страницы выборки или null чтобы удалить значение + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setNextPage($value) + { + if ($value === null || $value === '') { + $this->_nextPage = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_nextPage = (string) $value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid status value in PaymentsRequest', 0, 'PaymentsRequest.status', $value + ); + } + } + + /** + * Проверяет валидность текущего объекта запроса + * @return bool True если объект валиден, false если нет + */ + public function validate() + { + if (empty($this->_accountId)) { + $this->setValidationError('Shop id not specified'); + return false; + } + return true; + } + + /** + * Возвращает инстанс билдера объектов запросов списка платежей магазина + * @return PaymentsRequestBuilder Билдер объектов запросов списка платежей + */ + public static function builder() + { + return new PaymentsRequestBuilder(); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestBuilder.php new file mode 100644 index 0000000..8d2e92d --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestBuilder.php @@ -0,0 +1,236 @@ +currentObject->setPaymentId($value); + return $this; + } + + /** + * Устанавливает идентификатор магазина + * @param string|null $value Идентификатор магазина или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setAccountId($value) + { + $this->currentObject->setAccountId($value); + return $this; + } + + /** + * Устанавливает идентификатор товара + * @param string|null $value Идентификатор товара или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setGatewayId($value) + { + $this->currentObject->setGatewayId($value); + return $this; + } + + /** + * Устанавливает статус выбираемых платежей + * @param string $value Статус выбираемых платежей или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Выбрасывается если переданное значение не является валидным статусом + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setStatus($value) + { + $this->currentObject->setStatus($value); + return $this; + } + + /** + * Устанавливает токен следующей страницы выборки + * @param string $value Токен следующей страницы выборки или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setNextPage($value) + { + $this->currentObject->setNextPage($value); + return $this; + } + + /** + * Устанавливает дату создания от которой выбираются платежи + * @param \DateTime|string|int|null $value Время создания, от (не включая) или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedGt($value) + { + $this->currentObject->setCreatedGt($value); + return $this; + } + + /** + * Устанавливает дату создания от которой выбираются платежи + * @param \DateTime|string|int|null $value Время создания, от (включительно) или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedGte($value) + { + $this->currentObject->setCreatedGte($value); + return $this; + } + + /** + * Устанавливает дату создания до которой выбираются платежи + * @param \DateTime|string|int|null $value Время создания, до (не включая) или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedLt($value) + { + $this->currentObject->setCreatedLt($value); + return $this; + } + + /** + * Устанавливает дату создания до которой выбираются платежи + * @param \DateTime|string|int|null $value Время создания, до (включительно) или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedLte($value) + { + $this->currentObject->setCreatedLte($value); + return $this; + } + + /** + * Устанавливает дату проведения от которой выбираются платежи + * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить + * значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedGt($value) + { + $this->currentObject->setAuthorizedGt($value); + return $this; + } + + /** + * Устанавливает дату проведения от которой выбираются платежи + * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить + * значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedGte($value) + { + $this->currentObject->setAuthorizedGte($value); + return $this; + } + + /** + * Устанавливает дату проведения до которой выбираются платежи + * @param \DateTime|string|int|null $value Время проведения, до (не включая) или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedLt($value) + { + $this->currentObject->setAuthorizedLt($value); + return $this; + } + + /** + * Устанавливает дату проведения до которой выбираются платежи + * @param \DateTime|string|int|null $value Время проведения, до (включительно) или null чтобы удалить значение + * @return PaymentsRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedLte($value) + { + $this->currentObject->setAuthorizedLte($value); + return $this; + } + + /** + * Собирает и возвращает объект запроса списка платежей магазина + * @param array|null $options Массив с настройками запроса + * @return PaymentsRequestInterface Инстанс объекта запроса к API для получения списка плаитежей магазина + */ + public function build(array $options = null) + { + return parent::build($options); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestInterface.php new file mode 100644 index 0000000..abda6af --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestInterface.php @@ -0,0 +1,181 @@ + 'payment_id', + 'gatewayId' => 'gateway_id', + 'createdGte' => 'created_gte', + 'createdGt' => 'created_gt', + 'createdLte' => 'created_lte', + 'createdLt' => 'created_lt', + 'authorizedGte' => 'authorized_gte', + 'authorizedGt' => 'authorized_gt', + 'authorizedLte' => 'authorized_lte', + 'authorizedLt' => 'authorized_lt', + 'status' => 'status', + 'nextPage' => 'next_page', + ); + + /** + * Сериализует объект запроса к API для дальнейшей его отправки + * @param PaymentsRequestInterface $request Сериализуемый объект + * @return array Массив с инфомрацией, отпарвляемый в дальнейшем в API + */ + public function serialize(PaymentsRequestInterface $request) + { + $result = array( + 'account_id' => $request->getAccountId(), + ); + foreach (self::$propertyMap as $property => $name) { + $value = $request->{$property}; + if (!empty($value)) { + if ($value instanceof \DateTime) { + if ($value->getTimestamp() > 1) { + $result[$name] = $value->format(DATE_ATOM); + } + } else { + $result[$name] = $value; + } + } + } + return $result; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsResponse.php new file mode 100644 index 0000000..9fa0df6 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsResponse.php @@ -0,0 +1,141 @@ +items = array(); + foreach ($options['items'] as $paymentInfo) { + $payment = new Payment(); + $payment->setId($paymentInfo['id']); + $payment->setStatus($paymentInfo['status']); + $payment->setAmount(new MonetaryAmount( + $paymentInfo['amount']['value'], + $paymentInfo['amount']['currency'] + )); + $payment->setCreatedAt(strtotime($paymentInfo['created_at'])); + $payment->setPaymentMethod($this->factoryPaymentMethod($paymentInfo['payment_method'])); + $payment->setPaid($paymentInfo['paid']); + + if (!empty($paymentInfo['error'])) { + $error = new PaymentError(); + $error->setCode($paymentInfo['error']['code']); + if (!empty($paymentInfo['error']['description'])) { + $error->setDescription($paymentInfo['error']['description']); + } + $payment->setError($error); + + } + if (!empty($paymentInfo['recipient'])) { + $recipient = new Recipient(); + $recipient->setAccountId($paymentInfo['recipient']['account_id']); + $recipient->setGatewayId($paymentInfo['recipient']['gateway_id']); + $payment->setRecipient($recipient); + } + if (!empty($paymentInfo['captured_at'])) { + $payment->setCapturedAt(strtotime($paymentInfo['captured_at'])); + } + if (!empty($paymentInfo['confirmation'])) { + if ($paymentInfo['confirmation']['type'] === ConfirmationType::REDIRECT) { + $confirmation = new ConfirmationRedirect(); + $confirmation->setConfirmationUrl($paymentInfo['confirmation']['confirmation_url']); + $confirmation->setEnforce($paymentInfo['confirmation']['enforce']); + $confirmation->setReturnUrl($paymentInfo['confirmation']['return_url']); + } else { + $confirmation = new ConfirmationExternal(); + } + $payment->setConfirmation($confirmation); + } + if (!empty($paymentInfo['refunded_amount'])) { + $payment->setRefundedAmount(new MonetaryAmount( + $paymentInfo['refunded_amount']['value'], $paymentInfo['refunded_amount']['currency'] + )); + } + if (!empty($paymentInfo['receipt_registration'])) { + $payment->setReceiptRegistration($paymentInfo['receipt_registration']); + } + if (!empty($paymentInfo['metadata'])) { + $metadata = new Metadata(); + foreach ($paymentInfo['metadata'] as $key => $value) { + $metadata->offsetSet($key, $value); + } + $payment->setMetadata($metadata); + } + $this->items[] = $payment; + } + if (!empty($options['next_page'])) { + $this->nextPage = $options['next_page']; + } + } + + /** + * Возвращает список платежей + * @return PaymentInterface[] Список платежей + */ + public function getItems() + { + return $this->items; + } + + /** + * Возвращает токен следующей страницы, если он задан, или null + * @return string|null Токен следующей страницы + */ + public function getNextPage() + { + return $this->nextPage; + } + + /** + * Проверяет имееотся ли в ответе токен следующей страницы + * @return bool True если токен следующей страницы есть, false если нет + */ + public function hasNextPage() + { + return $this->nextPage !== null; + } + + /** + * Фабричный метод для создания объектов методов оплаты + * @param array $options Массив настроек метода оплаты + * @return AbstractPaymentMethod Используемый способ оплаты + */ + private function factoryPaymentMethod($options) + { + $factory = new PaymentMethodFactory(); + return $factory->factoryFromArray($options); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/AbstractRefundResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/AbstractRefundResponse.php new file mode 100644 index 0000000..6f13bfd --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/AbstractRefundResponse.php @@ -0,0 +1,49 @@ +setId(empty($options['id']) ? null : $options['id']); + $this->setPaymentId(empty($options['payment_id']) ? null : $options['payment_id']); + $this->setStatus(empty($options['status']) ? null : $options['status']); + $this->setCreatedAt(empty($options['created_at']) ? null : $options['created_at']); + $this->setAmount(new MonetaryAmount($options['amount']['value'], $options['amount']['currency'])); + + if (!empty($options['error'])) { + $error = new RefundError(); + $error->setCode($options['error']['code']); + if (!empty($options['error']['description'])) { + $error->setDescription($options['error']['description']); + } + $this->setError($error); + } + + if (!empty($options['authorized_at'])) { + $this->setAuthorizedAt($options['authorized_at']); + } + + if (!empty($options['receipt_registration'])) { + $this->setReceiptRegistration($options['receipt_registration']); + } + + if (!empty($options['comment'])) { + $this->setComment($options['comment']); + } + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequest.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequest.php new file mode 100644 index 0000000..7f4b04e --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequest.php @@ -0,0 +1,222 @@ +_paymentId; + } + + /** + * Устанавливает айди платежа для которого создаётся возврат + * @param string $value Айди платежа + * + * @throws EmptyPropertyValueException Выбрасывается если передано пустое значение айди платежа + * @throws InvalidPropertyValueException Выбрасывается если переданное значение является строкой, но не является + * валидным значением айди платежа + * @throws InvalidPropertyValueTypeException Выбрасывается если передано значение не валидного типа + */ + public function setPaymentId($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty payment id value in CreateRefundRequest', 0, 'CreateRefundRequest.paymentId' + ); + } elseif (TypeCast::canCastToString($value)) { + $length = mb_strlen($value, 'utf-8'); + if ($length != 36) { + throw new InvalidPropertyValueException( + 'Invalid payment id value in CreateRefundRequest', 0, 'CreateRefundRequest.paymentId', $value + ); + } + $this->_paymentId = (string)$value; + } else { + throw new InvalidPropertyValueException( + 'Invalid payment id value type in CreateRefundRequest', 0, 'CreateRefundRequest.paymentId', $value + ); + } + } + + /** + * Возвращает сумму возвращаемых средств + * @return AmountInterface Сумма возврата + */ + public function getAmount() + { + return $this->_amount; + } + + /** + * Устанавливает сумму возвращаемых средств + * @param AmountInterface $value Сумма возврата + */ + public function setAmount(AmountInterface $value) + { + $this->_amount = $value; + } + + /** + * Возвращает комментарий к возврату или null, если комментарий не задан + * @return string Комментарий к операции возврата, основание для возврата средств покупателю. + */ + public function getComment() + { + return $this->_comment; + } + + /** + * Проверяет задан ли комментарий к создаваемому возврату + * @return bool True если комментарий установлен, false если нет + */ + public function hasComment() + { + return $this->_comment !== null; + } + + /** + * Устанавливает комментарий к возврату + * @param string $value Комментарий к операции возврата, основание для возврата средств покупателю + * + * @throws InvalidPropertyValueException Выбрасывается если переданная строка длинее 250 символов + * @throws InvalidPropertyValueTypeException Выбрасывается если была передана не строка + */ + public function setComment($value) + { + if ($value === null || $value === '') { + $this->_comment = null; + } elseif (TypeCast::canCastToString($value)) { + $length = mb_strlen($value, 'utf-8'); + if ($length > 250) { + throw new InvalidPropertyValueException( + 'Invalid commend value in CreateRefundRequest', 0, 'CreateRefundRequest.comment', $value + ); + } + $this->_comment = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid commend value type in CreateRefundRequest', 0, 'CreateRefundRequest.comment', $value + ); + } + } + + /** + * Возвращает инстанс чека или null если чек не задан + * @return ReceiptInterface|null Инстанс чека или null + */ + public function getReceipt() + { + return $this->_receipt; + } + + /** + * Проверяет задан ли чек + * @return bool True если чек есть, false если нет + */ + public function hasReceipt() + { + return $this->_receipt !== null && $this->_receipt->notEmpty(); + } + + /** + * Устанавливает чек для печати + * @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 validate() + { + if (empty($this->_paymentId)) { + $this->setValidationError('Payment id not specified'); + return false; + } + if (empty($this->_amount)) { + $this->setValidationError('Amount not specified'); + return false; + } + if ($this->_amount->getValue() <= 0.0) { + $this->setValidationError('Invalid amount value: ' . $this->_amount->getValue()); + return false; + } + if ($this->_receipt !== null && $this->_receipt->notEmpty()) { + $email = $this->_receipt->getEmail(); + $phone = $this->_receipt->getPhone(); + if (empty($email) && empty($phone)) { + $this->setValidationError('Both email and phone values are empty in receipt'); + return false; + } + if ($this->_receipt->getTaxSystemCode() === null) { + foreach ($this->_receipt->getItems() as $item) { + if ($item->getVatCode() === null) { + $this->setValidationError('Item vat_id and receipt tax_system_id not specified'); + return false; + } + } + } + } + return true; + } + + /** + * Возвращает билдер объектов текущего типа + * @return CreateRefundRequestBuilder Инстанс билдера запрсов + */ + public static function builder() + { + return new CreateRefundRequestBuilder(); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestBuilder.php new file mode 100644 index 0000000..13a40da --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestBuilder.php @@ -0,0 +1,252 @@ +amount = new MonetaryAmount(); + $this->receipt = new Receipt(); + return $request; + } + + /** + * Устанавливает айди платежа для которого создаётся возврат + * @param string $value Айди платежа + * @return CreateRefundRequestBuilder Инстанс текущего билдера + * + * @throws EmptyPropertyValueException Выбрасывается если передано пустое значение айди платежа + * @throws InvalidPropertyValueException Выбрасывается если переданное значение является строкой, но не является + * валидным значением айди платежа + * @throws InvalidPropertyValueTypeException Выбрасывается если передано значение не валидного типа + */ + public function setPaymentId($value) + { + $this->currentObject->setPaymentId($value); + return $this; + } + + /** + * Устанавливает сумму возвращаемых средств + * @param AmountInterface $value Сумма возврата + * @return CreateRefundRequestBuilder Инстанс текущего билдера + * + * @throws EmptyPropertyValueException Генерируется если было передано пустое значение + * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа + * @throws InvalidPropertyValueException Генерируется если было передано не валидное значение + */ + public function setAmount($value) + { + if ($value instanceof AmountInterface) { + $this->amount->setValue($value->getValue()); + $this->amount->setCurrency($value->getCurrency()); + } else { + $this->amount->setValue($value); + } + return $this; + } + + /** + * Устанавливает валюту в которой средства возвращаются + * @param string $value Код валюты + * @return CreateRefundRequestBuilder Инстанс текущего билдера + * + * @throws EmptyPropertyValueException Генерируется если было передано пустое значение + * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа + * @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты + */ + public function setCurrency($value) + { + $this->amount->setCurrency($value); + return $this; + } + + /** + * Устанавливает комментарий к возврату + * @param string $value Комментарий к возврату + * @return CreateRefundRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Выбрасывается если переданная строка длинее 250 символов + * @throws InvalidPropertyValueTypeException Выбрасывается если была передана не строка + */ + public function setComment($value) + { + $this->currentObject->setComment($value); + return $this; + } + + /** + * Устанавлвиает список товаров в заказе для создания чека + * @param array $value Массив товаров в заказе + * @return CreateRefundRequestBuilder Инстанс текущего билдера + * + * @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, + 'CreatePaymentRequest.items[' . $index . '].title', + json_encode($item) + ); + } + if (empty($item['price'])) { + throw new InvalidPropertyValueException( + 'Item#' . $index . ' price not specified', + 0, + 'CreatePaymentRequest.items[' . $index . '].price', + json_encode($item) + ); + } + $this->addReceiptItem( + empty($item['title']) ? $item['description'] : $item['title'], + $item['price'], + empty($item['quantity']) ? 1.0 : $item['quantity'], + empty($item['vatCode']) ? null : $item['vatCode'] + ); + } + $index++; + } + return $this; + } + + /** + * Добавляет в чек товар + * @param string $title Название или описание товара + * @param string $price Цена товара в валюте, заданной в заказе + * @param float $quantity Количество покупаемого товара + * @param int|null $vatCode Ставка НДС, или null если используется ставка НДС заказа + * @return CreateRefundRequestBuilder Инстанс текущего билдера + */ + public function addReceiptItem($title, $price, $quantity = 1.0, $vatCode = null) + { + $item = new ReceiptItem(); + $item->setDescription($title); + $item->setQuantity($quantity); + $item->setVatCode($vatCode); + $item->setPrice(new MonetaryAmount($price, $this->amount->getCurrency())); + $this->receipt->addItem($item); + return $this; + } + + /** + * Добавляет в чек доставку товара + * @param string $title Название доставки в чеке + * @param string $price Стоимость доставки + * @param int|null $vatCode Ставка НДС, или null если используется ставка НДС заказа + * @return CreateRefundRequestBuilder Инстанс текущего билдера + */ + public function addReceiptShipping($title, $price, $vatCode = null) + { + $item = new ReceiptItem(); + $item->setDescription($title); + $item->setQuantity(1); + $item->setVatCode($vatCode); + $item->setIsShipping(true); + $item->setPrice(new MonetaryAmount($price, $this->amount->getCurrency())); + $this->receipt->addItem($item); + return $this; + } + + /** + * Устанавливает адрес электронной почты получателя чека + * @param string $value Email получателя чека + * @return CreateRefundRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа + */ + public function setReceiptEmail($value) + { + $this->receipt->setEmail($value); + return $this; + } + + /** + * Устанавливает телефон получателя чека + * @param string $value Телефон получателя чека + * @return CreateRefundRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueException Генерируется если был передан не телефон, а что-то другое + * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа + */ + public function setReceiptPhone($value) + { + $this->receipt->setPhone($value); + return $this; + } + + /** + * Устанавливает код системы налогообложения. + * @param int $value Код системы налогообложения. Число 1-6. + * @return CreateRefundRequestBuilder Инстанс текущего билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент - не число + * @throws InvalidPropertyValueException Выбрасывается если переданный аргумент меньше одного или больше шести + */ + public function setTaxSystemCode($value) + { + $this->receipt->setTaxSystemCode($value); + return $this; + } + + /** + * Строит объект запроса к API + * @param array|null $options Устаналвиваемые параметры запроса + * @return CreateRefundRequestInterface Инстанс сгенерированного объекта запроса к API + */ + public function build(array $options = null) + { + if (!empty($options)) { + $this->setOptions($options); + } + $this->currentObject->setAmount($this->amount); + if ($this->receipt->notEmpty()) { + $this->currentObject->setReceipt($this->receipt); + } + return parent::build(); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestInterface.php new file mode 100644 index 0000000..a6ec6fa --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestInterface.php @@ -0,0 +1,55 @@ + $request->getPaymentId(), + 'amount' => array( + 'value' => $request->getAmount()->getValue(), + 'currency' => $request->getAmount()->getCurrency(), + ), + ); + if ($request->hasComment()) { + $result['comment'] = $request->getComment(); + } + if ($request->hasReceipt()) { + $receipt = $request->getReceipt(); + $result['receipt'] = array(); + foreach ($receipt->getItems() as $item) { + $vatId = $item->getVatCode(); + if ($vatId === null) { + $vatId = $receipt->getTaxSystemCode(); + } + $result['receipt']['items'][] = array( + 'description' => $item->getDescription(), + 'amount' => array( + 'value' => $item->getPrice()->getValue(), + 'currency' => $item->getPrice()->getCurrency(), + ), + 'quantity' => $item->getQuantity(), + 'vat_code' => $vatId, + ); + } + $value = $receipt->getEmail(); + if (!empty($value)) { + $result['receipt']['email'] = $value; + } + $value = $receipt->getPhone(); + if (!empty($value)) { + $result['receipt']['phone'] = $value; + } + $value = $receipt->getTaxSystemCode(); + if (!empty($value)) { + $result['receipt']['tax_system_code'] = $value; + } + } + return $result; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundResponse.php new file mode 100644 index 0000000..faf77a6 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundResponse.php @@ -0,0 +1,11 @@ +_refundId; + } + + /** + * Проверяет был ли установлен идентификатор возврата + * @return bool True если идентификатор возврата был установлен, false если не был + */ + public function hasRefundId() + { + return $this->_refundId !== null; + } + + /** + * Устанавливает идентификатор возврата + * @param string $value Идентификатор возврата, который ищется в API + * + * @throws InvalidPropertyValueException Выбрасывается если длина переданного значения не равна 36 + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setRefundId($value) + { + if ($value === null || $value === '') { + $this->_refundId = null; + } elseif (TypeCast::canCastToString($value)) { + $length = mb_strlen((string)$value, 'utf-8'); + if ($length != 36) { + throw new InvalidPropertyValueException( + 'Invalid refund id value', 0, 'RefundsRequest.refundId', $value + ); + } + $this->_refundId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid refund id value type', 0, 'RefundsRequest.refundId', $value + ); + } + } + + /** + * Возвращает идентификатор платежа если он задан или null + * @return string|null Идентификатор платежа + */ + public function getPaymentId() + { + return $this->_paymentId; + } + + /** + * Проверяет, был ли задан идентификатор платежа + * @return bool True если идентификатор был задан, false если нет + */ + public function hasPaymentId() + { + return !empty($this->_paymentId); + } + + /** + * Устанавливает идентификатор платежа или null если требуется его удалить + * @param string|null $value Идентификатор платежа + * + * @throws InvalidPropertyValueException Выбрасывается если длина переданной строки не равна 36 символам + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setPaymentId($value) + { + if ($value === null || $value === '') { + $this->_paymentId = null; + } elseif (TypeCast::canCastToString($value)) { + $length = mb_strlen((string)$value, 'utf-8'); + if ($length != 36) { + throw new InvalidPropertyValueException( + 'Invalid payment id value in RefundsRequest', 0, 'RefundsRequest.paymentId', $value + ); + } + $this->_paymentId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid payment id value type in RefundsRequest', 0, 'RefundsRequest.paymentId', $value + ); + } + } + + /** + * Возвращает идентификатор магазина, если он был задан + * @return string|null Идентификатор магазина + */ + public function getAccountId() + { + return $this->_accountId; + } + + /** + * Проверяет, был ли установлен идентификатор магазина + * @return bool True если идентификатор магазина был установлен, false если нет + */ + public function hasAccountId() + { + return !empty($this->_accountId); + } + + /** + * Устанавлвиает идентификатор магазина + * @param string $value Идентификатор магазина или null чтобы удалить значение + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setAccountId($value) + { + if ($value === null || $value === '') { + $this->_accountId = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_accountId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid accountId value type in RefundsRequest', 0, 'RefundsRequest.accountId', $value + ); + } + } + + /** + * Возвращает идентификатор товара + * @return string|null Идентификатор товара + */ + public function getGatewayId() + { + return $this->_gatewayId; + } + + /** + * Проверяет был ли установлен идентификатор товара + * @return bool True если идентификатор товара был установлен, false если нет + */ + public function hasGatewayId() + { + return !empty($this->_gatewayId); + } + + /** + * Устанавливает идентификатор товара + * @param string|null $value Идентификатор товара или null чтобы удалить значение + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setGatewayId($value) + { + if ($value === null || $value === '') { + $this->_gatewayId = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_gatewayId = (string)$value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid gatewayId value type in RefundsRequest', 0, 'RefundsRequest.gatewayId', $value + ); + } + } + + /** + * Возвращает дату создания от которой будут возвращены возвраты или null если дата не была установлена + * @return \DateTime|null Время создания, от (включительно) + */ + public function getCreatedGte() + { + return $this->_createdGte; + } + + /** + * Проверяет была ли установлена дата создания от которой выбираются возвраты + * @return bool True если дата была установлена, false если нет + */ + public function hasCreatedGte() + { + return !empty($this->_createdGte); + } + + /** + * Устанавливает дату создания от которой выбираются возвраты + * @param \DateTime|string|int|null $value Время создания, от (включительно) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedGte($value) + { + if ($value === null || $value === '') { + $this->_createdGte = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid created_gte value in RefundsRequest', 0, 'RefundsRequest.createdGte' + ); + } + $this->_createdGte = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid created_gte value type in RefundsRequest', 0, 'RefundsRequest.createdGte' + ); + } + } + + /** + * Возвращает дату создания от которой будут возвращены возвраты или null если дата не была установлена + * @return \DateTime|null Время создания, от (не включая) + */ + public function getCreatedGt() + { + return $this->_createdGt; + } + + /** + * Проверяет была ли установлена дата создания от которой выбираются возвраты + * @return bool True если дата была установлена, false если нет + */ + public function hasCreatedGt() + { + return !empty($this->_createdGt); + } + + /** + * Устанавливает дату создания от которой выбираются возвраты + * @param \DateTime|string|int|null $value Время создания, от (не включая) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedGt($value) + { + if ($value === null || $value === '') { + $this->_createdGt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid created_gt value in RefundsRequest', 0, 'RefundsRequest.createdGt' + ); + } + $this->_createdGt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid created_gt value type in RefundsRequest', 0, 'RefundsRequest.createdGt' + ); + } + } + + /** + * Возвращает дату создания до которой будут возвращены возвраты или null если дата не была установлена + * @return \DateTime|null Время создания, до (включительно) + */ + public function getCreatedLte() + { + return $this->_createdLte; + } + + /** + * Проверяет была ли установлена дата создания до которой выбираются возвраты + * @return bool True если дата была установлена, false если нет + */ + public function hasCreatedLte() + { + return !empty($this->_createdLte); + } + + /** + * Устанавливает дату создания до которой выбираются возвраты + * @param \DateTime|string|int|null $value Время создания, до (включительно) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedLte($value) + { + if ($value === null || $value === '') { + $this->_createdLte = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid created_lte value in RefundsRequest', 0, 'RefundsRequest.createdLte' + ); + } + $this->_createdLte = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid created_lte value type in RefundsRequest', 0, 'RefundsRequest.createdLte' + ); + } + } + + /** + * Возвращает дату создания до которой будут возвращены возвраты или null если дата не была установлена + * @return \DateTime|null Время создания, до (не включая) + */ + public function getCreatedLt() + { + return $this->_createdLt; + } + + /** + * Проверяет была ли установлена дата создания до которой выбираются возвраты + * @return bool True если дата была установлена, false если нет + */ + public function hasCreatedLt() + { + return !empty($this->_createdLt); + } + + /** + * Устанавливает дату создания до которой выбираются возвраты + * @param \DateTime|string|int|null $value Время создания, до (не включая) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedLt($value) + { + if ($value === null || $value === '') { + $this->_createdLt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid created_lt value in RefundsRequest', 0, 'RefundsRequest.createdLt' + ); + } + $this->_createdLt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid created_lt value type in RefundsRequest', 0, 'RefundsRequest.createdLt' + ); + } + } + + /** + * Возвращает дату проведения от которой будут возвращены возвраты или null если дата не была установлена + * @return \DateTime|null Время проведения операции, от (включительно) + */ + public function getAuthorizedGte() + { + return $this->_authorizedGte; + } + + /** + * Проверяет была ли установлена дата проведения от которой выбираются возвраты + * @return bool True если дата была установлена, false если нет + */ + public function hasAuthorizedGte() + { + return !empty($this->_authorizedGte); + } + + /** + * Устанавливает дату проведения от которой выбираются возвраты + * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить + * значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedGte($value) + { + if ($value === null || $value === '') { + $this->_authorizedGte = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid authorized_gte value in RefundsRequest', 0, 'RefundsRequest.authorizedGte' + ); + } + $this->_authorizedGte = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid authorized_gte value type in RefundsRequest', 0, 'RefundsRequest.authorizedGte' + ); + } + } + + /** + * Возвращает дату проведения от которой будут возвращены возвраты или null если дата не была установлена + * @return \DateTime|null Время проведения операции, от (не включая) + */ + public function getAuthorizedGt() + { + return $this->_authorizedGt; + } + + /** + * Проверяет была ли установлена дата проведения от которой выбираются возвраты + * @return bool True если дата была установлена, false если нет + */ + public function hasAuthorizedGt() + { + return !empty($this->_authorizedGt); + } + + /** + * Устанавливает дату проведения от которой выбираются возвраты + * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить + * значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedGt($value) + { + if ($value === null || $value === '') { + $this->_authorizedGt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid authorized_gt value in RefundsRequest', 0, 'RefundsRequest.authorizedGt' + ); + } + $this->_authorizedGt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid authorized_gt value type in RefundsRequest', 0, 'RefundsRequest.authorizedGt' + ); + } + } + + /** + * Возвращает дату проведения до которой будут возвращены возвраты или null если дата не была установлена + * @return \DateTime|null Время проведения, до (включительно) + */ + public function getAuthorizedLte() + { + return $this->_authorizedLte; + } + + /** + * Проверяет была ли установлена дата проведения до которой выбираются возвраты + * @return bool True если дата была установлена, false если нет + */ + public function hasAuthorizedLte() + { + return !empty($this->_authorizedLte); + } + + /** + * Устанавливает дату проведения до которой выбираются возвраты + * @param \DateTime|string|int|null $value Время проведения, до (включительно) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedLte($value) + { + if ($value === null || $value === '') { + $this->_authorizedLte = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid authorized_lte value in RefundsRequest', 0, 'RefundsRequest.authorizedLte' + ); + } + $this->_authorizedLte = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid authorized_lte value type in RefundsRequest', 0, 'RefundsRequest.authorizedLte' + ); + } + } + + /** + * Возвращает дату проведения до которой будут возвращены платежи возвраты или null если она не была установлена + * @return \DateTime|null Время проведения, до (не включая) + */ + public function getAuthorizedLt() + { + return $this->_authorizedLt; + } + + /** + * Проверяет была ли установлена дата проведения до которой выбираются вовзраты + * @return bool True если дата была установлена, false если нет + */ + public function hasAuthorizedLt() + { + return !empty($this->_authorizedLt); + } + + /** + * Устанавливает дату проведения до которой выбираются возвраты + * @param \DateTime|string|int|null $value Время проведения, до (не включая) или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedLt($value) + { + if ($value === null || $value === '') { + $this->_authorizedLt = null; + } elseif (TypeCast::canCastToDateTime($value)) { + $dateTime = TypeCast::castToDateTime($value); + if ($dateTime === null) { + throw new InvalidPropertyValueException( + 'Invalid authorized_lt value in RefundsRequest', 0, 'RefundsRequest.authorizedLt' + ); + } + $this->_authorizedLt = $dateTime; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid authorized_lt value type in RefundsRequest', 0, 'RefundsRequest.authorizedLt' + ); + } + } + + /** + * Возвращает статус выбираемых возвратов или null если он до этого не был установлен + * @return string|null Статус выбираемых возвратов + */ + public function getStatus() + { + return $this->_status; + } + + /** + * Проверяет был ли установлен статус выбираемых возвратов + * @return bool True если статус был установлен, false если нет + */ + public function hasStatus() + { + return !empty($this->_status); + } + + /** + * Устанавливает статус выбираемых возвратов + * @param string $value Статус выбираемых платежей или null чтобы удалить значение + * + * @throws InvalidPropertyValueException Выбрасывается если переданное значение не является валидным статусом + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setStatus($value) + { + if ($value === null || $value === '') { + $this->_status = null; + } elseif (TypeCast::canCastToEnumString($value)) { + if (!RefundStatus::valueExists((string)$value)) { + throw new InvalidPropertyValueException( + 'Invalid status value in RefundsRequest', 0, 'RefundsRequest.status', $value + ); + } else { + $this->_status = (string)$value; + } + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid status value in RefundsRequest', 0, 'RefundsRequest.status', $value + ); + } + } + + /** + * Возвращает токен для получения следующей страницы выборки + * @return string|null Токен для получения следующей страницы выборки + */ + public function getNextPage() + { + return $this->_nextPage; + } + + /** + * Проверяет был ли установлен токен следующей страницы + * @return bool True если токен был установлен, false если нет + */ + public function hasNextPage() + { + return !empty($this->_nextPage); + } + + /** + * Устанавливает токен следующей страницы выборки + * @param string $value Токен следующей страницы выборки или null чтобы удалить значение + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setNextPage($value) + { + if ($value === null || $value === '') { + $this->_nextPage = null; + } elseif (TypeCast::canCastToString($value)) { + $this->_nextPage = (string) $value; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid status value in PaymentsRequest', 0, 'PaymentsRequest.status', $value + ); + } + } + + /** + * Проверяет валидность текущего объекта запроса + * @return bool True если объект валиден, false если нет + */ + public function validate() + { + if (empty($this->_accountId)) { + $this->setValidationError('Shop id not specified'); + return false; + } + return true; + } + + /** + * Возвращает инстанс билдера объектов запросов списка возвратов магазина + * @return RefundsRequestBuilder Билдер объектов запросов списка возвратов + */ + public static function builder() + { + return new RefundsRequestBuilder(); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestBuilder.php new file mode 100644 index 0000000..8dd8c7d --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestBuilder.php @@ -0,0 +1,250 @@ +currentObject->setRefundId($value); + return $this; + } + + /** + * Устанавливает идентификатор платежа или null если требуется его удалить + * @param string|null $value Идентификатор платежа + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Выбрасывается если длина переданной строки не равна 36 символам + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setPaymentId($value) + { + $this->currentObject->setPaymentId($value); + return $this; + } + + /** + * Устанавлвиает идентификатор магазина + * @param string $value Идентификатор магазина или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setAccountId($value) + { + $this->currentObject->setAccountId($value); + return $this; + } + + /** + * Устанавливает идентификатор товара + * @param string|null $value Идентификатор товара или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setGatewayId($value) + { + $this->currentObject->setGatewayId($value); + return $this; + } + + /** + * Устанавливает статус выбираемых возвратов + * @param string $value Статус выбираемых платежей или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Выбрасывается если переданное значение не является валидным статусом + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setStatus($value) + { + $this->currentObject->setStatus($value); + return $this; + } + + /** + * Устанавливает токен следующей страницы выборки + * @param string $value Токен следующей страницы выборки или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка + */ + public function setNextPage($value) + { + $this->currentObject->setNextPage($value); + return $this; + } + + /** + * Устанавливает дату создания от которой выбираются возвраты + * @param \DateTime|string|int|null $value Время создания, от (не включая) или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedGt($value) + { + $this->currentObject->setCreatedGt($value); + return $this; + } + + /** + * Устанавливает дату создания от которой выбираются возвраты + * @param \DateTime|string|int|null $value Время создания, от (включительно) или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedGte($value) + { + $this->currentObject->setCreatedGte($value); + return $this; + } + + /** + * Устанавливает дату создания до которой выбираются возвраты + * @param \DateTime|string|int|null $value Время создания, до (не включая) или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedLt($value) + { + $this->currentObject->setCreatedLt($value); + return $this; + } + + /** + * Устанавливает дату создания до которой выбираются возвраты + * @param \DateTime|string|int|null $value Время создания, до (включительно) или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setCreatedLte($value) + { + $this->currentObject->setCreatedLte($value); + return $this; + } + + /** + * Устанавливает дату проведения от которой выбираются возвраты + * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить + * значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedGt($value) + { + $this->currentObject->setAuthorizedGt($value); + return $this; + } + + /** + * Устанавливает дату проведения от которой выбираются возвраты + * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить + * значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedGte($value) + { + $this->currentObject->setAuthorizedGte($value); + return $this; + } + + /** + * Устанавливает дату проведения до которой выбираются возвраты + * @param \DateTime|string|int|null $value Время проведения, до (не включая) или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedLt($value) + { + $this->currentObject->setAuthorizedLt($value); + return $this; + } + + /** + * Устанавливает дату проведения до которой выбираются возвраты + * @param \DateTime|string|int|null $value Время проведения, до (включительно) или null чтобы удалить значение + * @return RefundsRequestBuilder Инстанс текущего объекта билдера + * + * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана + * строка или число, которые не удалось преобразовать в валидную дату) + * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не + * строка, не число и не значение типа \DateTime) + */ + public function setAuthorizedLte($value) + { + $this->currentObject->setAuthorizedLte($value); + return $this; + } + + /** + * Собирает и возвращает объект запроса списка возвратов магазина + * @param array|null $options Массив с настройками запроса + * @return RefundsRequestInterface Инстанс объекта запроса к API для получения списка возвратов магазина + */ + public function build(array $options = null) + { + return parent::build($options); + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestInterface.php new file mode 100644 index 0000000..db6ece9 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestInterface.php @@ -0,0 +1,194 @@ + 'refund_id', + 'paymentId' => 'payment_id', + 'gatewayId' => 'gateway_id', + 'createdGte' => 'created_gte', + 'createdGt' => 'created_gt', + 'createdLte' => 'created_lte', + 'createdLt' => 'created_lt', + 'authorizedGte' => 'authorized_gte', + 'authorizedGt' => 'authorized_gt', + 'authorizedLte' => 'authorized_lte', + 'authorizedLt' => 'authorized_lt', + 'status' => 'status', + 'nextPage' => 'next_page', + ); + + /** + * Сериализует объект запроса к API для дальнейшей его отправки + * @param RefundsRequestInterface $request Сериализуемый объект + * @return array Массив с инфомрацией, отпарвляемый в дальнейшем в API + */ + public function serialize(RefundsRequestInterface $request) + { + $result = array( + 'account_id' => $request->getAccountId(), + ); + foreach (self::$propertyMap as $property => $name) { + $value = $request->{$property}; + if (!empty($value)) { + if ($value instanceof \DateTime) { + if ($value->getTimestamp() > 1) { + $result[$name] = $value->format(DATE_ATOM); + } + } else { + $result[$name] = $value; + } + } + } + return $result; + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsResponse.php new file mode 100644 index 0000000..977d092 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsResponse.php @@ -0,0 +1,65 @@ +items = array(); + foreach ($options['items'] as $item) { + $this->items[] = new RefundResponse($item); + } + if (!empty($options['next_page'])) { + $this->nextPage = $options['next_page']; + } + } + + /** + * Возвращает список возвратов + * @return RefundInterface[] Список возвратов + */ + public function getItems() + { + return $this->items; + } + + /** + * Возвращает токен следующей страницы, если он задан, или null + * @return string|null Токен следующей страницы + */ + public function getNextPage() + { + return $this->nextPage; + } + + /** + * Проверяет имееотся ли в ответе токен следующей страницы + * @return bool True если токен следующей страницы есть, false если нет + */ + public function hasNextPage() + { + return $this->nextPage !== null; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/StateUnknownResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/StateUnknownResponse.php new file mode 100644 index 0000000..658ae5b --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/StateUnknownResponse.php @@ -0,0 +1,71 @@ +_retryAfter = 5; + } + + /** + * Возвращает рекомендуемое время спустя которое следует повторить запрос + * @return int Рекомендуемое время спустя которое следует повторить запрос + */ + public function getRetryAfter() + { + return $this->_retryAfter; + } + + /** + * Устанавливает рекомендуемое время спустя которое следует повторить запрос + * @param int $value Время через которое рекомендуется повторить запрос + * + * @throws EmptyPropertyValueException Выкидывается если было передано пустое значение + * @throws InvalidPropertyValueException Выкидывается если значение невалидно + * @throws InvalidPropertyValueTypeException Выкидывается если переданное значение не является числом + */ + public function setRetryAfter($value) + { + if ($value === null || $value === '') { + throw new EmptyPropertyValueException( + 'Empty retry after value in StateUnknownResponse', 0, 'StateUnknownResponse.retryAfter' + ); + } elseif (is_numeric($value)) { + $castedValue = (int)$value; + if ($castedValue <= 0) { + throw new InvalidPropertyValueException( + 'Invalid retry after value in StateUnknownResponse', 0, 'StateUnknownResponse.retryAfter', $value + ); + } + $this->_retryAfter = (int)$castedValue; + } else { + throw new InvalidPropertyValueTypeException( + 'Invalid retry after value in StateUnknownResponse', 0, 'StateUnknownResponse.retryAfter', $value + ); + } + } +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/configuration.json b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/configuration.json new file mode 100644 index 0000000..76a5a21 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/configuration.json @@ -0,0 +1,3 @@ +{ + "url" : "https://payment.yandex.net/api/v3" +} \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/AbstractLogger.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/AbstractLogger.php new file mode 100644 index 0000000..90e721a --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/AbstractLogger.php @@ -0,0 +1,128 @@ +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); + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/InvalidArgumentException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/InvalidArgumentException.php new file mode 100644 index 0000000..67f852d --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/InvalidArgumentException.php @@ -0,0 +1,7 @@ +logger = $logger; + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/LoggerInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/LoggerInterface.php new file mode 100644 index 0000000..5ea7243 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/LoggerInterface.php @@ -0,0 +1,123 @@ +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 + */ + abstract public function log($level, $message, array $context = array()); +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/NullLogger.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/NullLogger.php new file mode 100644 index 0000000..d8cd682 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/NullLogger.php @@ -0,0 +1,28 @@ +logger) { }` + * blocks. + */ +class NullLogger extends AbstractLogger +{ + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * + * @return void + */ + public function log($level, $message, array $context = array()) + { + // noop + } +} diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/README.md b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/README.md new file mode 100644 index 0000000..574bc1c --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/README.md @@ -0,0 +1,45 @@ +PSR Log +======= + +This repository holds all interfaces/classes/traits related to +[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md). + +Note that this is not a logger of its own. It is merely an interface that +describes a logger. See the specification for more details. + +Usage +----- + +If you need a logger, you can use the interface like this: + +```php +logger = $logger; + } + + public function doSomething() + { + if ($this->logger) { + $this->logger->info('Doing work'); + } + + // do something useful + } +} +``` + +You can then pick one of the implementations of the interface to get a logger. + +If you want to implement the interface, you can require this package and +implement `Psr\Log\LoggerInterface` in your code. Please read the +[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) +for details. diff --git a/src/components/com_jshopping/payments/pm_yandex_money/payment_form_kassa.php b/src/components/com_jshopping/payments/pm_yandex_money/payment_form_kassa.php new file mode 100644 index 0000000..105c516 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/payment_form_kassa.php @@ -0,0 +1,106 @@ + + + + 'PC', + \YaMoney\Model\PaymentMethodType::BANK_CARD => 'AC', + \YaMoney\Model\PaymentMethodType::CASH => 'GP', + \YaMoney\Model\PaymentMethodType::MOBILE_BALANCE => 'MC', + \YaMoney\Model\PaymentMethodType::WEBMONEY => 'WM', + \YaMoney\Model\PaymentMethodType::SBERBANK => 'SB', + \YaMoney\Model\PaymentMethodType::ALFABANK => 'AB', + \YaMoney\Model\PaymentMethodType::QIWI => 'QW', + ); + $num += 0; + foreach ($listMethods as $long => $short) : + if (isset($pmConfigs['method_' . $long]) && $pmConfigs['method_' . $long] == '1') : + $num += 1; ?> + + + + + + + + + + + + + + + + + +
+ id="yandex_money_" /> + + + +
+ + + + \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/paymentform.php b/src/components/com_jshopping/payments/pm_yandex_money/paymentform.php new file mode 100644 index 0000000..52b8db3 --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/paymentform.php @@ -0,0 +1,94 @@ +l_name)) { + $parts[] = $user->l_name; + } + if (!empty($user->f_name)) { + $parts[] = $user->f_name; + } + if (!empty($user->m_name)) { + $parts[] = $user->m_name; + } + $pmconfigs['ya_payments_fio'] = implode(' ', $parts); + } +} + +if (isset($pmconfigs['kassamode']) && $pmconfigs['paymode']=='1' && $pmconfigs['kassamode']=='1') return; ?> + + + 'PC','cards2'=>'AC'):array('ym'=>'PC','cards'=>'AC','cash'=>'GP','phone'=>'MC','wm'=>'WM','sb'=>'SB','ab'=>'AB','pb'=>'PB','ma'=>'MA', 'qw'=>'QW', 'qp'=>'QP', 'mp'=>'MP'); + $num+=0; + foreach ($list_methods as $m_long => $m_short) { + if (isset($pmconfigs['method_' . $m_long]) && $pmconfigs['method_' . $m_long] == '1' || ($pmconfigs['moneymode'] == '1' && ($m_short == "PC" || $m_short == "AC"))) { + $num += 1; ?> + + + + + + + + + + + + + + + +
id="ym"> + + +
+ + + +
+ +
+ \ No newline at end of file diff --git a/src/components/com_jshopping/payments/pm_yandex_money/pm_yandex_money.php b/src/components/com_jshopping/payments/pm_yandex_money/pm_yandex_money.php new file mode 100644 index 0000000..2298aed --- /dev/null +++ b/src/components/com_jshopping/payments/pm_yandex_money/pm_yandex_money.php @@ -0,0 +1,631 @@ +joomlaVersion = (version_compare(JVERSION, '3.0', '<') == 1) ? 2 : 3; + } + + function showPaymentForm($params, $pmConfigs) + { + $this->loadLanguageFile(); + $this->mode = $this->getMode($pmConfigs); + if ($this->mode === self::MODE_KASSA) { + include(dirname(__FILE__) . "/payment_form_kassa.php"); + } else { + include(dirname(__FILE__) . "/paymentform.php"); + } + } + + public function getDisplayNameParams() + { + $names = array(); + $this->mode = $this->getMode($this->getParams()); + if ($this->mode == self::MODE_PAYMENTS) { + $names = array( + 'ya_payments_fio' => _JSHOP_YM_PAYMENTS_FIO_LABEL, + ); + } + return $names; + } + + /** + * Проверяет параметры указанные пользователем на странице выбора способа оплаты + * @param array $params Массив параметров, указанных в params[pm_yandex_money] на странице выбора способа оплаты + * @param array $pmConfigs Настройки модуля оплаты + * @return bool True если все параметры вылидны, false если нет + */ + public function checkPaymentInfo($params, $pmConfigs) + { + $this->mode = $this->getMode($pmConfigs); + if ($this->mode == self::MODE_PAYMENTS) { + // если платёжка, то проверяем ФИО указанные пользователем + if (empty($params) || empty($params['ya_payments_fio'])) { + return false; + } + $name = trim($params['ya_payments_fio']); + if (empty($name)) { + return false; + } + } elseif ($this->mode === self::MODE_KASSA) { + // если оплата через кассу, то должен быть указан способ оплаты + if (!isset($params['payment_type'])) { + return false; + } else { + $paymentType = $params['payment_type']; + if (empty($paymentType) && $pmConfigs['paymode'] == '1') { + return true; + } else { + if (\YaMoney\Model\PaymentMethodType::valueExists($paymentType)) { + if ($paymentType === \YaMoney\Model\PaymentMethodType::QIWI) { + if (empty($params['qiwiPhone'])) { + return false; + } + $phone = preg_replace('/[^\d]+/', '', $params['qiwiPhone']); + if (empty($phone) || strlen($phone) < 4 || strlen($phone) > 16) { + $this->setErrorMessage('Указанное значение не является телефонным номером'); + return false; + } + $params['qiwiPhone'] = $phone; + } elseif ($paymentType === \YaMoney\Model\PaymentMethodType::ALFABANK) { + if (empty($params['alfaLogin'])) { + $this->setErrorMessage('Укажите логин в Альфа-клике'); + return false; + } + $login = trim($params['alfaLogin']); + if (empty($login)) { + return false; + } + } + return true; + } + return false; + } + } + } + return true; + } + + /** + * function call in admin + */ + public function showAdminFormParams($params) + { + $array_params = array( + 'kassa_send_check', 'testmode', 'paymode', 'moneymode', 'kassamode', 'paymentsmode', 'method_ym', + 'method_cards', 'method_ym2', 'method_cards2', 'method_cash', 'method_phone', 'method_wm', + 'method_ab', 'method_sb', 'method_ma', 'method_pb', 'method_qw', 'method_qp', 'password', + 'shoppassword', 'shopid', 'scid', 'account', 'transaction_end_status', 'ym_pay_id', 'ym_pay_desc', + 'ya_payments_fio', 'page_mpos', 'ya_kassa_send_check', 'method_mp', + ); + $taxes = $taxes = JSFactory::getAllTaxes(); + + foreach ($taxes as $k => $tax) { + $array_params[] = 'ya_kassa_tax_' . $k; + } + + foreach ($array_params as $key) { + if (!isset($params[$key])) { + $params[$key] = ''; + } + } + if (!isset($params['use_ssl'])) { + $params['use_ssl'] = 0; + } + $this->loadLanguageFile(); + $orders = JModelLegacy::getInstance('orders', 'JshoppingModel'); //admin model + if ($this->joomlaVersion === 2) { + $filename = '2x'; + } else { + $filename = ''; + $dispatcher = JDispatcher::getInstance(); + $dispatcher->register('onBeforeEditPayments', array($this, 'onBeforeEditPayments')); + } + include(dirname(__FILE__)."/adminparamsform".$filename.".php"); + } + + public function onBeforeEditPayments($view) + { + $view->tmp_html_start = ''; + $view->tmp_html_end = ''; + } + + private function loadLanguageFile() + { + $lang = JFactory::getLanguage(); + $langTag = $lang->getTag(); + if (file_exists(JPATH_ROOT.'/components/com_jshopping/payments/pm_yandex_money/lang/'.$langTag.'.php')) { + require_once(JPATH_ROOT.'/components/com_jshopping/payments/pm_yandex_money/lang/'.$langTag.'.php'); + } else { + require_once(JPATH_ROOT.'/components/com_jshopping/payments/pm_yandex_money/lang/ru-RU.php'); + } + } + + public function checkSign($callbackParams) + { + if ($this->mode == self::MODE_MONEY) { + $string = $callbackParams['notification_type'].'&'.$callbackParams['operation_id'].'&' + .$callbackParams['amount'].'&'.$callbackParams['currency'].'&'.$callbackParams['datetime'].'&' + .$callbackParams['sender'].'&'.$callbackParams['codepro'].'&'.$this->ym_password.'&' + .$callbackParams['label']; + $check = (sha1($string) == $callbackParams['sha1_hash']); + if (!$check) { + header('HTTP/1.0 401 Unauthorized'); + return false; + } + } + return true; + } + + /** + * Метод проверки валидности платежа, вызывается при создании платежа после возврата пользователя на страницу + * подтверждения заказа, так же вызывается при приходе нотификации от платёжной системы + * @param array $pmConfigs Массив настроек платёжной системы + * @param object $order Инстанс заказа + * @param string $act Значение параметра "act" в ссылке + * @return array Массив с информацией о транзакции + */ + function checkTransaction($pmConfigs, $order, $act) + { + $this->mode = $this->getMode($pmConfigs); + + if ($this->mode === self::MODE_MONEY) { + $this->ym_pay_mode = ($pmConfigs['paymode'] == '1'); + $this->ym_shopid = $pmConfigs['shopid']; + $this->ym_scid = $pmConfigs['scid']; + + $order->order_total = floatval($order->order_total); + + $callbackParams = JRequest::get('post'); + $this->loadLanguageFile(); + $check = $this->checkSign($callbackParams); + } elseif ($this->mode === self::MODE_KASSA) { + + if ($act === 'notify') { + + $source = file_get_contents('php://input'); + if (empty($source)) { + header('HTTP/1.1 400 Body is empty'); + die(); + } + $json = json_decode($source, true); + if (empty($json)) { + header('HTTP/1.1 400 Invalid body'); + die(); + } + $notification = new \YaMoney\Model\Notification\NotificationWaitingForCapture($json); + $payment = $this->getKassaPaymentMethod($pmConfigs)->capturePayment($notification->getObject()); + if ($payment === null) { + header('HTTP/1.1 404 Payment not exists'); + die(); + } elseif ($payment->getStatus() !== \YaMoney\Model\PaymentStatus::SUCCEEDED) { + header('HTTP/1.1 401 Payment not exists'); + die(); + } + $this->getOrderModel()->savePayment($order->order_id, $payment); + echo '{"success":true,"payment_status":"'.$payment->getStatus().'"}'; + die(); + + } else { + $this->log('debug', 'Check transaction for order#' . $order->order_id); + $transactionId = $this->getOrderModel()->getPaymentIdByOrderId($order->order_id); + if (empty($transactionId)) { + $this->log('debug', 'Payment id for order#' . $order->order_id . ' not exists'); + return array(3, 'Transaction not exists', '', 'Transaction not exists'); + } + $payment = $this->getKassaPaymentMethod($pmConfigs)->fetchPayment($transactionId); + if ($payment === null) { + $this->log('debug', 'Payment for order#' . $order->order_id . ' not exists'); + return array(3, 'Transaction not exists', '', 'Transaction not exists'); + } + if (!$payment->getPaid()) { + $this->log('debug', 'Payment '.$payment->getId().' for order#' . $order->order_id . ' not paid'); + $redirectUrl = JRoute::_(JURI::root().'index.php?option=com_jshopping&controller=checkout&task=step3'); + $app = JFactory::getApplication(); + $app->redirect($redirectUrl); + } + if ($payment->getStatus() === \YaMoney\Model\PaymentStatus::CANCELED) { + $this->log('debug', 'Payment '.$payment->getId().' for order#' . $order->order_id . ' is canceled'); + return array(4, 'Transaction is cancelled', $transactionId, 'Платёж не был проведён'); + } elseif ($payment->getStatus() === \YaMoney\Model\PaymentStatus::PENDING) { + $this->log('debug', 'Payment '.$payment->getId().' for order#' . $order->order_id . ' is pended'); + return array(2, 'Ожидается проведение оплаты', $transactionId, 'Ожидается проведение оплаты'); + } elseif ($payment->getStatus() === \YaMoney\Model\PaymentStatus::WAITING_FOR_CAPTURE) { + $this->log('debug', 'Payment '.$payment->getId().' for order#' . $order->order_id . ' wfc'); + $result = $this->getKassaPaymentMethod($pmConfigs)->capturePayment($payment); + if ($result !== null) { + $this->getOrderModel()->savePayment($order->order_id, $payment); + $this->log('debug', 'Payment '.$payment->getId().' for order#' . $order->order_id . ' captured'); + $payment = $result; + } + } + if ($payment->getStatus() === \YaMoney\Model\PaymentStatus::SUCCEEDED) { + $this->log('debug', 'Payment '.$payment->getId().' for order#' . $order->order_id . ' succeeded'); + return array(1, 'Платёж ' . $transactionId . ' проведён', $transactionId, 'Оплата была проведена'); + } else { + $this->log('debug', 'Payment '.$payment->getId().' for order#' . $order->order_id . ' pended'); + return array(2, 'Ожидается проведение оплаты', $transactionId, 'Ожидается проведение оплаты'); + } + } + + } else { + $check = true; + } + // + if ($check) { + if ($this->mode == self::MODE_KASSA) { + return array(1, ''); + } else { + return array(1, ''); + } + } elseif($this->mode == self::MODE_KASSA) { + return array(1, ''); + } else { + return array(0, 'hash error'); + } + } + + public function getFormUrl() + { + if ($this->mode == self::MODE_MONEY) { + return $this->individualGetFormUrl(); + } else { + return 'https://money.yandex.ru/fastpay/confirm'; + } + } + + public function individualGetFormUrl() + { + if ($this->ym_test_mode) { + return 'https://demomoney.yandex.ru/quickpay/confirm.xml'; + } else { + return 'https://money.yandex.ru/quickpay/confirm.xml'; + } + } + + function showEndForm($pmConfigs, $order) + { + $this->ym_test_mode = isset($pmConfigs['testmode']) ? $pmConfigs['testmode'] : false; + $this->mode = $this->getMode($pmConfigs); + if ($this->mode === self::MODE_KASSA) { + $this->processKassaPayment($pmConfigs, $order); + // если произошла ошибка, редиректим на шаг выбора метода оплаты + $redirectUrl = JRoute::_(JURI::root().'index.php?option=com_jshopping&controller=checkout&task=step5'); + $app = JFactory::getApplication(); + $app->redirect($redirectUrl); + } + $this->ym_pay_mode = ($pmConfigs['paymode'] == '1'); + + $uri = JURI::getInstance(); + $liveUrlHost = $uri->toString(array("scheme",'host', 'port')); + + $ym_params = unserialize($order->payment_params_data); + + $item_name = $liveUrlHost." ".sprintf(_JSHOP_PAYMENT_NUMBER, $order->order_number); + $this->loadLanguageFile(); + + $return = $liveUrlHost.SEFLink("index.php?option=com_jshopping&controller=checkout&task=step7&act=return&js_paymentclass=pm_yandex_money&order_id=" . $order['id']); + + $order->order_total = $this->fixOrderTotal($order); + if ($ym_params['ym-payment-type'] == 'MP'){ + $app = JFactory::getApplication(); + $app->redirect(JRoute::_(JURI::root().'index.php?option=com_content&view=article&id='.$pmConfigs['page_mpos'])); + } +?> + + + + + + + mode == self::MODE_MONEY) { ?> +
+ + + + + + + + + + + + + + + + + +
+ mode == self::MODE_PAYMENTS) { + $this->finishOrder($order, $pmConfigs['ym_pay_status']); + $narrative = $this->parseTemplate($pmConfigs['ym_pay_desc'], $order); + ?> +
+ + + + + + + +
+ + + + + +toString(array('scheme', 'host', 'port')) + . SEFLink("index.php?option=com_jshopping&controller=checkout&task=step7&act=return&js_paymentclass=pm_yandex_money&no_lang=1&order_id=" . $order->order_id); + $redirectUrl = htmlspecialchars_decode($redirectUrl); + + /** @var jshopCart $cart */ + $cart = JSFactory::getModel('cart', 'jshop'); + if (method_exists($cart, 'init')) { + $cart->init('cart', 1); + } else { + $cart->load('cart'); + } + + $payment = $this->getKassaPaymentMethod($pmConfigs)->createPayment($order, $cart, $redirectUrl); + + $redirect = $redirectUrl; + if ($payment !== null) { + $confirmation = $payment->getConfirmation(); + if ($confirmation instanceof \YaMoney\Model\Confirmation\ConfirmationRedirect) { + $redirect = $confirmation->getConfirmationUrl(); + } + $this->getOrderModel()->savePayment($order->order_id, $payment); + } else { + $redirect = JRoute::_(JURI::root().'index.php?option=com_jshopping&controller=checkout&task=step3'); + $this->setErrorMessage('Не удалось создать платёж, попробуйте выбрать другой способ оплаты.'); + } + + $app = JFactory::getApplication(); + $app->redirect($redirect); + } + + /** + * Инициализирует параметры для обработки процессором заказа из URL запроса при возврате на сайт + * @param array $pmConfigs Настройки модуля оплаты + * @return array Массив параметров, который будет использоваться в процессоре заказа + */ + public function getUrlParams($pmConfigs) + { + $this->mode = $this->getMode($pmConfigs); + $params = array(); + if ($this->mode == self::MODE_KASSA) { + $this->log('debug', 'Get URL parameters for payment'); + if (isset($_GET['order_id'])) { + $this->log('debug', 'Order id exists in return url: ' . $_GET['order_id']); + $params['order_id'] = (int)$_GET['order_id']; + $paymentId = $this->getOrderModel()->getPaymentIdByOrderId($params['order_id']); + if (empty($paymentId)) { + $this->log('debug', 'Redirect user to payment method page: payment id not exists'); + $redirectUrl = JRoute::_(JURI::root().'index.php?option=com_jshopping&controller=checkout&task=step3'); + $app = JFactory::getApplication(); + $app->redirect($redirectUrl); + } + $payment = $this->getKassaPaymentMethod($pmConfigs)->fetchPayment($paymentId); + if ($payment === null) { + $this->log('debug', 'Redirect user to payment method page: payment not exists'); + $redirectUrl = JRoute::_(JURI::root().'index.php?option=com_jshopping&controller=checkout&task=step3'); + $app = JFactory::getApplication(); + $app->redirect($redirectUrl); + } + if (!$payment->getPaid()) { + $this->log('debug', 'Redirect user to payment method page: payment not paid'); + $redirectUrl = JRoute::_(JURI::root().'index.php?option=com_jshopping&controller=checkout&task=step3'); + $app = JFactory::getApplication(); + $app->redirect($redirectUrl); + } + $params['hash'] = ""; + $params['checkHash'] = 0; + $params['checkReturnParams'] = 1; + $this->log('debug', 'Return url params is: ' . json_encode($params)); + } else { + $this->log('debug', 'Order id not exists in return url: ' . json_encode($_GET)); + } + } else { + $params['order_id'] = (int)$_POST['label']; + $params['hash'] = ""; + $params['checkHash'] = 0; + } + return $params; + } + + private function fixOrderTotal($order) + { + $total = $order->order_total; + if ($order->currency_code_iso == 'HUF') { + $total = round($total); + } else { + $total = number_format($total, 2, '.', ''); + } + return $total; + } + + private function getMode($paymentConfig) + { + if ($this->mode == -1) { + $this->mode = self::MODE_OFF; + if ($paymentConfig['kassamode'] == '1') { + $this->mode = self::MODE_KASSA; + $this->ym_password = $paymentConfig['shoppassword']; + } elseif ($paymentConfig['moneymode'] == '1') { + $this->mode = self::MODE_MONEY; + $this->ym_password = $paymentConfig['password']; + } elseif ($paymentConfig['paymentsmode'] == '1') { + $this->mode = self::MODE_PAYMENTS; + } + } + return $this->mode; + } + + /** + * @param string $tpl + * @param jshopOrder $order + * @return string + */ + private function parseTemplate($tpl, $order) + { + $replace = array(); + foreach ($order as $property => $value) { + $replace['%' . $property . '%'] = $value; + } + return strtr($tpl, $replace); + } + + /** + * @param jshopOrder $order + * @param int $endStatus + * @return int + */ + private function finishOrder($order, $endStatus) + { + $act = 'finish'; + $payment_method = 'pm_yandex_money'; + $no_lang = '1'; + + if ($this->joomlaVersion === 2) { + // joomla 2.x order finish + $jshopConfig = JSFactory::getConfig(); + + /** @var jshopCheckout $checkout */ + $checkout = JSFactory::getModel('checkout', 'jshop'); + + $order->order_created = 1; + $order->order_status = $endStatus; + $order->store(); + if ($jshopConfig->send_order_email) { + $checkout->sendOrderEmail($order->order_id); + } + if ($jshopConfig->order_stock_removed_only_paid_status) { + $product_stock_removed = (in_array($endStatus, $jshopConfig->payment_status_enable_download_sale_file)); + } else { + $product_stock_removed = 1; + } + if ($product_stock_removed) { + $order->changeProductQTYinStock("-"); + } + $checkout->changeStatusOrder($order->order_id, $endStatus, 0); + + $checkout->deleteSession(); + } else { + // joomla 3.x order finish + /** @var jshopCheckoutBuy $checkout */ + $checkout = JSFactory::getModel('checkoutBuy', 'jshop'); + + $checkout->saveToLogPaymentData(); + $checkout->setSendEndForm(0); + + $checkout->setAct($act); + $checkout->setPaymentMethodClass($payment_method); + $checkout->setNoLang($no_lang); + $checkout->loadUrlParams(); + $checkout->setOrderId($order->order_id); + + $codebuy = $checkout->buy(); + if ($codebuy == 0) { + JError::raiseWarning('', $checkout->getError()); + return 0; + } + + /** @var jshopCheckoutFinish $checkout */ + $checkout = JSFactory::getModel('checkoutFinish', 'jshop'); + $order_id = $checkout->getEndOrderId(); + $text = $checkout->getFinishStaticText(); + if ($order_id) { + $checkout->paymentComplete($order_id, $text); + } + $checkout->clearAllDataCheckout(); + } + } + + public function log($level, $message, $context = array()) + { + if (!defined('DS')) { + define('DS', DIRECTORY_SEPARATOR); + } + $replace = array(); + foreach ($context as $key => $value) { + if (is_scalar($value)) { + $replace['{' . $key . '}'] = $value; + } else { + $replace['{' . $key . '}'] = json_encode($value); + } + } + if (!empty($replace)) { + $message = strtr($message, $replace); + } + $fileName = realpath(dirname(__FILE__) . DS . '..' . DS . '..') . DS . 'log' . DS . 'pm_yandex_money.log'; + $fd = @fopen($fileName, 'a'); + if ($fd) { + flock($fd, LOCK_EX); + fwrite($fd, date(DATE_ATOM) . ' [' . $level . '] ' . $message . "\r\n"); + flock($fd, LOCK_UN); + fclose($fd); + } + } + + /** + * @return \YandexMoney\Model\OrderModel + */ + private function getOrderModel() + { + if ($this->orderModel === null) { + $this->orderModel = new \YandexMoney\Model\OrderModel(); + } + return $this->orderModel; + } + + private function getKassaPaymentMethod($pmConfigs) + { + if ($this->kassa === null) { + $this->kassa = new \YandexMoney\Model\KassaPaymentMethod($this, $pmConfigs); + } + return $this->kassa; + } +} diff --git a/src/update.sql b/src/update.sql new file mode 100644 index 0000000..06a303c --- /dev/null +++ b/src/update.sql @@ -0,0 +1,21 @@ + +INSERT INTO `#__jshopping_payment_method` (`payment_code`, `payment_class`, `payment_publish`, `payment_ordering`, + `payment_type`, `price`, `price_type`, `tax_id`, `show_descr_in_email`, + `name_en-GB`, `name_de-DE`) +VALUES ('YandexMoney20', 'pm_yandex_money', 1, 0, 2, 0.00, 0, 1, 0, 'Yandex.Money 2.0', 'Yandex.Money 2.0'); + +CREATE TABLE IF NOT EXISTS `#__ya_money_payments` ( + `order_id` INTEGER NOT NULL, + `payment_id` CHAR(36) NOT NULL, + `status` ENUM('pending', 'waiting_for_capture', 'succeeded', 'canceled') NOT NULL, + `amount` DECIMAL(11, 2) NOT NULL, + `currency` CHAR(3) NOT NULL, + `payment_method_id` CHAR(36) NOT NULL, + `paid` ENUM('Y', 'N') NOT NULL, + `created_at` DATETIME NOT NULL, + `captured_at` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + CONSTRAINT `' . DB_PREFIX . 'ya_money_payment_pk` PRIMARY KEY (`order_id`), + CONSTRAINT `' . DB_PREFIX . 'ya_money_payment_unq_payment_id` UNIQUE (`payment_id`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8 COLLATE=utf8_general_ci; + +UPDATE `#__jshopping_payment_method` SET `name_ru-RU` = 'Яндекс.Деньги 2.0' WHERE `payment_class` = 'pm_yandex_money'; \ No newline at end of file diff --git a/yandex-money-cms-v2-joomshopping.zip b/yandex-money-cms-v2-joomshopping.zip new file mode 100644 index 0000000..aba6699 Binary files /dev/null and b/yandex-money-cms-v2-joomshopping.zip differ