init_hooks(); } /** * 初始化钩子 */ private function init_hooks() { // 激活插件时创建数据库表 register_activation_hook(__FILE__, array($this, 'activate')); // 停用插件时清理 register_deactivation_hook(__FILE__, array($this, 'deactivate')); // 在 WooCommerce 加载后初始化 add_action('plugins_loaded', array($this, 'init'), 11); // 添加管理菜单 add_action('admin_menu', array($this, 'add_admin_menu')); // 注册 AJAX 处理 add_action('wp_ajax_m2pool_check_payment', array($this, 'ajax_check_payment')); add_action('wp_ajax_nopriv_m2pool_check_payment', array($this, 'ajax_check_payment')); // 注册 Webhook 端点 add_action('rest_api_init', array($this, 'register_webhook_routes')); // 加载文本域 add_action('init', array($this, 'load_textdomain')); } /** * 初始化插件 */ public function init() { // 检查 WooCommerce 是否激活 if (!class_exists('WooCommerce')) { add_action('admin_notices', array($this, 'woocommerce_missing_notice')); return; } // 加载支付网关类 require_once M2POOL_ETH_PLUGIN_DIR . 'includes/class-m2pool-eth-gateway.php'; require_once M2POOL_ETH_PLUGIN_DIR . 'includes/class-m2pool-eth-api.php'; require_once M2POOL_ETH_PLUGIN_DIR . 'includes/class-m2pool-eth-listener.php'; // 注册支付网关(必须在类加载后) add_filter('woocommerce_payment_gateways', array($this, 'add_gateway')); } /** * WooCommerce 缺失通知 */ public function woocommerce_missing_notice() { ?>

get_charset_collate(); $table_name = $wpdb->prefix . 'm2pool_eth_payments'; $sql = "CREATE TABLE IF NOT EXISTS $table_name ( id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, order_id bigint(20) UNSIGNED NOT NULL, queue_id varchar(255) NOT NULL, from_address varchar(255) NOT NULL, to_address varchar(255) NOT NULL, amount decimal(20,8) NOT NULL, fee decimal(20,8) DEFAULT 0, chain varchar(50) DEFAULT 'ETH', symbol varchar(50) DEFAULT 'ETH', tx_hash varchar(255) DEFAULT NULL, block_height bigint(20) UNSIGNED DEFAULT NULL, status int(11) DEFAULT 0 COMMENT '0=待支付,1=成功,2=待确认,3=失败', created_at datetime DEFAULT CURRENT_TIMESTAMP, updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY queue_id (queue_id), KEY order_id (order_id), KEY tx_hash (tx_hash), KEY status (status) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); // 设置默认选项 if (!get_option('m2pool_eth_api_url')) { update_option('m2pool_eth_api_url', 'http://localhost:8080'); } if (!get_option('m2pool_eth_api_key')) { update_option('m2pool_eth_api_key', ''); } if (!get_option('m2pool_eth_listen_interval')) { update_option('m2pool_eth_listen_interval', 30); // 30秒轮询一次 } } /** * 停用插件 */ public function deactivate() { // 清理定时任务 wp_clear_scheduled_hook('m2pool_eth_check_payments'); } /** * 添加管理菜单 */ public function add_admin_menu() { add_options_page( __('M2Pool ETH 支付设置', 'm2pool-eth-payment'), __('M2Pool ETH 支付', 'm2pool-eth-payment'), 'manage_options', 'm2pool-eth-settings', array($this, 'settings_page') ); } /** * 设置页面 */ public function settings_page() { if (isset($_POST['m2pool_eth_save_settings'])) { check_admin_referer('m2pool_eth_settings'); update_option('m2pool_eth_api_url', sanitize_text_field($_POST['api_url'])); update_option('m2pool_eth_api_key', sanitize_text_field($_POST['api_key'])); update_option('m2pool_eth_listen_interval', intval($_POST['listen_interval'])); update_option('m2pool_eth_from_address', sanitize_text_field($_POST['from_address'])); update_option('m2pool_eth_to_address', sanitize_text_field($_POST['to_address'])); echo '

' . esc_html__('设置已保存', 'm2pool-eth-payment') . '

'; } $api_url = get_option('m2pool_eth_api_url', 'http://localhost:8080'); $api_key = get_option('m2pool_eth_api_key', ''); $listen_interval = get_option('m2pool_eth_listen_interval', 30); $from_address = get_option('m2pool_eth_from_address', ''); $to_address = get_option('m2pool_eth_to_address', ''); include M2POOL_ETH_PLUGIN_DIR . 'templates/settings.php'; } /** * AJAX 检查支付状态 */ public function ajax_check_payment() { check_ajax_referer('m2pool_eth_check', 'nonce'); $order_id = intval($_POST['order_id']); $order = wc_get_order($order_id); if (!$order) { wp_send_json_error(array('message' => __('订单不存在', 'm2pool-eth-payment'))); } $listener = new M2Pool_ETH_Listener(); $result = $listener->check_payment_status($order_id); if ($result['success']) { wp_send_json_success($result); } else { wp_send_json_error($result); } } /** * 注册 Webhook 路由 */ public function register_webhook_routes() { register_rest_route('m2pool-eth/v1', '/webhook', array( 'methods' => 'POST', 'callback' => array($this, 'handle_webhook'), 'permission_callback' => '__return_true', )); } /** * 处理 Webhook */ public function handle_webhook($request) { $data = $request->get_json_params(); if (!isset($data['queue_id'])) { return new WP_Error('invalid_data', __('无效的数据', 'm2pool-eth-payment'), array('status' => 400)); } $listener = new M2Pool_ETH_Listener(); $result = $listener->process_webhook($data); if ($result) { return new WP_REST_Response(array('success' => true), 200); } else { return new WP_Error('processing_failed', __('处理失败', 'm2pool-eth-payment'), array('status' => 500)); } } /** * 加载文本域 */ public function load_textdomain() { load_plugin_textdomain('m2pool-eth-payment', false, dirname(plugin_basename(__FILE__)) . '/languages'); } } // 初始化插件 M2Pool_ETH_Payment::get_instance();