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 : |
<? 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] ?? 'Неизвестная ошибка, пожалуйста, обратитесь к разработчику'; } }