/
robokassa
/
cms-wordpress
Обзор
Документация
Войти
/
robokassa
/
cms-wordpress
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
master
checkout-block.php
227 строк
5 KB
Aleksey Dmitriev
fix: корректировка iframe-оплаты и UI QR-кода СБП
24 апр 2026, 11:22
24 апр 2026, 11:22
80677c4
Код
Авторство
О чём код?
<?php use Automattic\WooCommerce\Blocks\Payments\Integrations\AbstractPaymentMethodType; final class WC_Robokassa_Blocks extends AbstractPaymentMethodType { /** * @var string */ protected $name; /** * @var string */ private $gateway_id; /** * @var \WC_Payment_Gateway|null */ private $gateway_instance; /** * @param string $gateway_id */ public function __construct($gateway_id) { $this->gateway_id = $gateway_id; $this->name = $gateway_id; } /** * Инициализация настроек метода оплаты. * * @return void */ public function initialize() { $this->settings = get_option('woocommerce_' . $this->gateway_id . '_settings', []); } /** * Регистрирует скрипт интеграции блока оплаты. * * @return string[] */ public function get_payment_method_script_handles() { $handles = ['robokassa-blocks-integration']; $has_payment_graph = $this->has_payment_graph(); if ($has_payment_graph && !wp_script_is('robokassa-badge-widget', 'registered')) { wp_register_script( 'robokassa-badge-widget', 'https://auth.robokassa.ru/Merchant/bundle/robokassa-iframe-badge.js', [], null, true ); } if (!wp_script_is('robokassa-blocks-integration', 'registered')) { wp_register_script( 'robokassa-blocks-integration', plugin_dir_url(__FILE__) . 'blocks.js', [ 'wc-blocks-registry', 'wc-settings', 'wp-element', 'wp-html-entities', 'wp-i18n', ], null, true ); } if ($has_payment_graph) { array_unshift($handles, 'robokassa-badge-widget'); } return $handles; } /** * Возвращает данные для блока метода оплаты. * * @return array */ public function get_payment_method_data() { $gateway = $this->get_gateway_instance(); $title = get_option('RobokassaOrderPageTitle_' . $this->gateway_id, null); $description = get_option('RobokassaOrderPageDescription_' . $this->gateway_id, null); if (($title === null || $title === '') && $gateway) { $title = $gateway->title; } if (($description === null || $description === '') && $gateway) { $description = $gateway->description; } elseif (function_exists('robokassa_append_payment_graph_to_description')) { $description = robokassa_append_payment_graph_to_description($description, $this->gateway_id); } return [ 'title' => $title, 'description' => wp_kses_post((string)$description), 'supports' => $this->get_gateway_supports(), ]; } /** * Проверяет активность метода оплаты в блочном чекауте. * * @return bool */ public function is_active() { $gateway = $this->get_gateway_instance(); if (!$gateway) { return false; } if (property_exists($gateway, 'enabled') && 'yes' !== $gateway->enabled) { return false; } if ('yes' !== ($this->settings['enabled'] ?? 'yes')) { return false; } if (method_exists($gateway, 'is_available')) { return (bool)$gateway->is_available(); } return true; } /** * Возвращает поддерживаемые возможности метода оплаты. * * @return array */ private function get_gateway_supports() { $gateway = $this->get_gateway_instance(); if (!$gateway || !is_array($gateway->supports)) { return []; } return array_values($gateway->supports); } /** * Проверяет, нужен ли методу внешний скрипт графика оплат. * * @return bool */ private function has_payment_graph() { if (function_exists('is_checkout_pay_page') && is_checkout_pay_page()) { return false; } if (function_exists('is_order_received_page') && is_order_received_page()) { return false; } if (get_option('robokassa_graph_enabled', 'true') !== 'true') { return false; } if (!function_exists('robokassa_get_payment_graph_method')) { return false; } return robokassa_get_payment_graph_method($this->gateway_id) !== ''; } /** * Возвращает экземпляр класса платёжного шлюза. * * @return \WC_Payment_Gateway|null */ private function get_gateway_instance() { if ($this->gateway_instance instanceof \WC_Payment_Gateway) { return $this->gateway_instance; } if (function_exists('WC')) { $gateways = WC()->payment_gateways(); if ($gateways && method_exists($gateways, 'payment_gateways')) { foreach ((array)$gateways->payment_gateways() as $gateway) { if ($gateway instanceof \WC_Payment_Gateway && $gateway->id === $this->gateway_id) { $this->gateway_instance = $gateway; return $this->gateway_instance; } } } } if (!function_exists('robokassa_payment_add_WC_WP_robokassa_class')) { require_once __DIR__ . '/labelsClasses.php'; } foreach ((array)robokassa_payment_add_WC_WP_robokassa_class() as $class_name) { if (!class_exists($class_name)) { continue; } $instance = new $class_name(); if (!empty($instance->id) && $instance->id === $this->gateway_id) { $this->gateway_instance = $instance; break; } } return $this->gateway_instance instanceof \WC_Payment_Gateway ? $this->gateway_instance : null; } }