403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/php_interface/wbs24.lib/lib/WeddingSubscription/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/php_interface/wbs24.lib/lib/WeddingSubscription/Page.php
<?
namespace Wbs24\Lib\WeddingSubscription;

use Bitrix\Main\Config\Option;
use Bitrix\Main\Loader;
use Bitrix\Main\Page\Asset;

class Page
{
    protected $debug = 'Y';
    protected $availableAmounts = '';
    protected $minAmount = 0;

    public function __construct()
    {
        if (!Loader::includeModule('iblock')) {
            $this->errorPage("IBLOCK_MODULE_DONT_CONNECTED");
            return;
        }

        $this->showPage();
    }

    public function showPage()
    {
        if (
            !class_exists('YooKassa\Client')
        ) {
            $this->errorPage("YOOKASSA_DONT_CONNECTED");
            return;
        }

        $siteId = SITE_ID;
        $iblockId = Option::get('wbs24.lib', 'WEDDING_SUBSCRIPTION_NEWLYWEDS_IBLOCK_ID', "", $siteId);
        $paymentsIblockId = Option::get('wbs24.lib', 'WEDDING_SUBSCRIPTION_PAYMENTS_IBLOCK_ID', "", $siteId);
        $this->debug = Option::get('wbs24.lib', 'WEDDING_SUBSCRIPTION_DEBUG', "Y", $siteId);
        $this->availableAmounts = Option::get('wbs24.lib', 'WEDDING_SUBSCRIPTION_AVAILABLE_AMOUNTS', "", $siteId);
        $this->minAmount = Option::get('wbs24.lib', 'WEDDING_SUBSCRIPTION_MIN_AMOUNT', "0", $siteId);
        $managerInfo = [
            'MANAGER_EMAIL' => Option::get('wbs24.lib', 'WEDDING_SUBSCRIPTION_MANAGER_EMAIL', "0", $siteId),
        ];
        $newlywedsId = intval($_GET['id'] ?? 0);
        $paymentId = intval($_GET['payment_id'] ?? 0);
        $paymentCode = htmlspecialchars($_GET['payment_code'] ?? '');
        $state = htmlspecialchars($_GET['state'] ?? 'form');

        if (
            !$iblockId
            || !$newlywedsId
        ) {
            $this->errorPage("REQUIRED_PARAMETERS_DONT_GRANTED");
            return;
        }

        $newlywedsInfo = $this->getNewlywedsInfo($newlywedsId, $iblockId);

        if (empty($newlywedsInfo['NEWLYWEDS_NAMES'])) {
            $this->errorPage("NEWLYWEDS_DONT_REGISTERED");
            return;
        }

        echo '<h2>Молодожены: '.$newlywedsInfo['NEWLYWEDS_NAMES'].'</h2>';
        if ($state == 'form') {
            $this->showForm($newlywedsInfo['NEWLYWEDS_NAMES'], $newlywedsId);
        } elseif ($state == 'success') {
            $paymentInfo = $this->getPaymentInfo($paymentId, $paymentsIblockId, $paymentCode);
            if ($paymentInfo) {
                // страница подтверждения
                $this->showConfirm($paymentInfo);

                // сохранение статуса платежа
                $this->updatePaymentStatus($paymentId, $paymentsIblockId, 'success');

                // уведомление всех участников
                $this->sendNotifications([
                        'NEWLYWEDS_ID' => $newlywedsId,
                        'NEWLYWEDS_NAMES' => $newlywedsInfo['NEWLYWEDS_NAMES'],
                        'NEWLYWEDS_EMAIL' => $newlywedsInfo['NEWLYWEDS_EMAIL'],
                        'NEWLYWEDS_TOTAL_AMOUNT' => $this->getNewlywedsTotalAmount($newlywedsId, $paymentsIblockId, $siteId),
                        'PAYER_NAME' => $paymentInfo['PAYER_NAME'],
                        'PAYER_EMAIL' => $paymentInfo['PAYER_EMAIL'],
                        'PAYMENT_ID' => $paymentInfo['PAYMENT_ID'],
                        'PAYMENT_AMOUNT' => $paymentInfo['AMOUNT'],
                        'MANAGER_EMAIL' => $managerInfo['MANAGER_EMAIL'],
                    ], [
                        'NEWLYWEDS_EMAIL' => $newlywedsInfo['NEWLYWEDS_EMAIL'],
                        'PAYER_EMAIL' => $paymentInfo['PAYER_EMAIL'],
                        'MANAGER_EMAIL' => $managerInfo['MANAGER_EMAIL'],
                    ],
                    $siteId
                );
            } else {
                $this->errorPage("PAYMENT_CONFIRM_LINK_EXPIRED");
                return;
            }
        }
    }

    protected function showForm($newlywedsNames, $newlywedsId)
    {
        Asset::getInstance()->addCss("/local/wedding_subscription/css/styles.css");
        Asset::getInstance()->addJs("/local/wedding_subscription/js/script.js");

        echo <<<FROMDATA
            <script src="https://yookassa.ru/checkout-widget/v1/checkout-widget.js"></script>

            <div class="amount-selector-widget">
                <input id="debug" type="hidden" value="$this->debug">
                <input id="availableAmounts" type="hidden" value="$this->availableAmounts">
                <input id="minAmount" type="hidden" value="$this->minAmount">
                <input id="newlywedsNames" type="hidden" value="$newlywedsNames">
                <input id="newlywedsId" type="hidden" value="$newlywedsId">

                <b class="widget-row">Данные дарителя</b>
                <div class="giver-container">
                    <div class="widget-row"><label>Имя </label><input id="giverName"></div>
                    <div class="widget-row"><label>E-mail </label><input id="giverEmail"></div>
                </div>

                <b class="widget-row">Выберите сумму</b>
                <div class="widget-row button-container" id="amountButtons">
                    <!-- Кнопки будут созданы через JavaScript -->
                </div>

                <b class="widget-row">Или введите свою сумму</b>
                <div class="widget-row custom-amount">
                    <input type="number" id="customAmount" placeholder="Введите сумму">
                    <button class="select-btn" id="selectCustomAmount">Выбрать сумму</button>
                </div>

                <div class="widget-row filter">
					<input type="checkbox" id="politicsAgreement" value="Y">
					<label for="politicsAgreement">
						Я согласен на <a href="/include/licenses_detail.php" target="_blank">обработку персональных данных</a> и <a href="/info/public_offer/" target="_blank">условия оферты</a>
                    </label>
				</div>

                <div id="error" class="widget-row error"></div>
            </div>

            <div id="payment-form"></div>
FROMDATA;
    }

    protected function showConfirm($confirmInfo)
    {
        $paymentId = intval($confirmInfo['PAYMENT_ID']);

        echo <<<CONFIRMDATA
            <h3>Платеж №$paymentId успешно завершен</h3>
            <p>Спасибо! Вы получите уведомление на указанную почту</p>
CONFIRMDATA;
    }

    protected function getPaymentInfo($paymentId, $paymentsIblockId, $code = false)
    {
        if (empty($paymentId) || empty($paymentsIblockId)) {
            return null;
        }

        $element = \CIBlockElement::GetList(
            [],
            [
                'IBLOCK_ID' => $paymentsIblockId,
                'ID' => $paymentId,
                'ACTIVE' => 'Y',
            ],
            false,
            false,
            [
                'ID',
                'IBLOCK_ID',
                'NAME',
                'DATE_CREATE',
                'PROPERTY_NEWLYWEDS_ID',
                'PROPERTY_PAYER_NAME',
                'PROPERTY_PAYER_EMAIL',
                'PROPERTY_AMOUNT',
                'PROPERTY_STATUS',
                'PROPERTY_CODE',
            ]
        )->GetNextElement();

        if (!$element) {
            return null;
        }

        $fields = $element->GetFields();
        $properties = $element->GetProperties();

        // Проверка кода, если он передан
        if ($code !== false && ($properties['CODE']['VALUE'] ?? '') !== $code) {
            return null;
        }

        // Формируем массив с информацией о платеже
        $paymentInfo = [
            'PAYMENT_ID' => $fields['ID'],
            'NAME' => $fields['NAME'],
            'DATE_CREATE' => $fields['DATE_CREATE'],
            'NEWLYWEDS_ID' => $properties['NEWLYWEDS_ID']['VALUE'] ?? null,
            'PAYER_NAME' => $properties['PAYER_NAME']['VALUE'] ?? '',
            'PAYER_EMAIL' => $properties['PAYER_EMAIL']['VALUE'] ?? '',
            'AMOUNT' => $properties['AMOUNT']['VALUE'] ?? 0,
            'STATUS' => $properties['STATUS']['VALUE'] ?? '',
            'PAYMENT_CODE' => $properties['CODE']['VALUE'] ?? '',
        ];

        // Получаем имя новобрачных из связанного элемента
        if (!empty($paymentInfo['NEWLYWEDS_ID'])) {
            $res = \CIBlockElement::GetByID($paymentInfo['NEWLYWEDS_ID']);
            if ($element = $res->GetNext()) {
                $paymentInfo['NEWLYWEDS_NAME'] = $element['NAME'];
            }
        }

        return $paymentInfo;
    }

    protected function updatePaymentStatus($paymentId, $paymentsIblockId, $status)
    {
        $element = new \CIBlockElement;
        $element->SetPropertyValuesEx($paymentId, $paymentsIblockId, [
            'STATUS' => $status,
            'CODE' => '',
        ]);
    }

    protected function sendNotifications($fields, $recipients, $siteId)
    {
        \CEvent::Send('WEDDING_SUBSCRIPTION_PAYMENY_NOTIFY', $siteId, $fields, 'Y', '', array(), '', $recipients);
    }

    protected function getNewlywedsInfo($id, $iblockId)
    {
        $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PROPERTY_EMAIL");
        $arFilter = Array("ID" => $id, "IBLOCK_ID" => $iblockId, "ACTIVE" => "Y");
        $res = \CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
        $info = [];
        if ($fields = $res->Fetch()) {
            $info = [
                'NEWLYWEDS_NAMES' => $fields['NAME'],
                'NEWLYWEDS_EMAIL' => $fields['PROPERTY_EMAIL_VALUE'] ?? '',
            ];
        }

        return $info;
    }

    public function getNewlywedsTotalAmount($id, $paymentsIblockId)
    {
        $arSelect = Array("ID", "IBLOCK_ID", "PROPERTY_AMOUNT");
        $arFilter = Array("PROPERTY_NEWLYWEDS_ID" => $id, "IBLOCK_ID" => $paymentsIblockId, "ACTIVE" => "Y", "PROPERTY_STATUS" => "success");
        $res = \CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
        $total = 0;
        while ($fields = $res->Fetch()) {
            $total += $fields['PROPERTY_AMOUNT_VALUE'];
        }

        return $total;
    }

    protected function errorPage($code)
    {
        $errors = [
            'IBLOCK_MODULE_DONT_CONNECTED' => 'Системная ошибка - не подключен модуль iblock',
            'YOOKASSA_DONT_CONNECTED' => 'Юкасса не подключена, оплата подписки не возможна',
            'REQUIRED_PARAMETERS_DONT_GRANTED' => 'Информация о молодоженах не найдена',
            'NEWLYWEDS_DONT_REGISTERED' => 'Информация о молодоженах не найдена, возможно данная подписка не существует или уже закрыта',
            'PAYMENT_CONFIRM_LINK_EXPIRED' => 'Срок действия ссылки истек',
        ];

        echo $errors[$code] ?? 'Неизвестная ошибка, пожалуйста, обратитесь к разработчику';
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit