SET NAMES utf8mb4; SET @provider_order_exists=(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='orders' AND COLUMN_NAME='provider_order_no'); SET @provider_order_sql=IF(@provider_order_exists=0,'ALTER TABLE orders ADD COLUMN provider_order_no VARCHAR(100) NOT NULL DEFAULT '''' AFTER channel','SELECT 1'); PREPARE provider_order_stmt FROM @provider_order_sql; EXECUTE provider_order_stmt; DEALLOCATE PREPARE provider_order_stmt; SET @checkout_url_exists=(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='orders' AND COLUMN_NAME='checkout_url'); SET @checkout_url_sql=IF(@checkout_url_exists=0,'ALTER TABLE orders ADD COLUMN checkout_url VARCHAR(1000) NOT NULL DEFAULT '''' AFTER provider_order_no','SELECT 1'); PREPARE checkout_url_stmt FROM @checkout_url_sql; EXECUTE checkout_url_stmt; DEALLOCATE PREPARE checkout_url_stmt; SET @payment_payload_exists=(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='orders' AND COLUMN_NAME='payment_payload'); SET @payment_payload_sql=IF(@payment_payload_exists=0,'ALTER TABLE orders ADD COLUMN payment_payload MEDIUMTEXT NULL AFTER checkout_url','SELECT 1'); PREPARE payment_payload_stmt FROM @payment_payload_sql; EXECUTE payment_payload_stmt; DEALLOCATE PREPARE payment_payload_stmt; SET @paid_amount_exists=(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='orders' AND COLUMN_NAME='paid_amount_cent'); SET @paid_amount_sql=IF(@paid_amount_exists=0,'ALTER TABLE orders ADD COLUMN paid_amount_cent INT UNSIGNED NULL AFTER amount_cent','SELECT 1'); PREPARE paid_amount_stmt FROM @paid_amount_sql; EXECUTE paid_amount_stmt; DEALLOCATE PREPARE paid_amount_stmt; SET @payment_notified_exists=(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='orders' AND COLUMN_NAME='payment_notified_at'); SET @payment_notified_sql=IF(@payment_notified_exists=0,'ALTER TABLE orders ADD COLUMN payment_notified_at DATETIME(3) NULL AFTER paid_at','SELECT 1'); PREPARE payment_notified_stmt FROM @payment_notified_sql; EXECUTE payment_notified_stmt; DEALLOCATE PREPARE payment_notified_stmt; SET @provider_order_index_exists=(SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='orders' AND INDEX_NAME='idx_order_provider_no'); SET @provider_order_index_sql=IF(@provider_order_index_exists=0,'ALTER TABLE orders ADD KEY idx_order_provider_no (provider_order_no)','SELECT 1'); PREPARE provider_order_index_stmt FROM @provider_order_index_sql; EXECUTE provider_order_index_stmt; DEALLOCATE PREPARE provider_order_index_stmt; CREATE TABLE IF NOT EXISTS payment_events ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, event_id VARCHAR(100) NOT NULL, order_no VARCHAR(40) NOT NULL, channel VARCHAR(30) NOT NULL, provider_order_no VARCHAR(100) NOT NULL DEFAULT '', event_status VARCHAR(30) NOT NULL, amount_cent INT UNSIGNED NOT NULL DEFAULT 0, raw_payload MEDIUMTEXT NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_payment_event (event_id), KEY idx_payment_event_order (order_no,created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO system_configs (config_key,config_value,value_type,description) VALUES ('payment.gateway.create_url','','string','统一支付网关创建支付地址'), ('payment.gateway.token','','secret','统一支付网关 Bearer Token'), ('payment.gateway.notify_secret','','secret','支付通知 HMAC-SHA256 密钥'), ('payment.gateway.notify_url','','string','本系统支付通知公网 HTTPS 地址'), ('payment.gateway.return_url','','string','支付完成后的客户端返回地址'), ('payment.gateway.timeout_seconds','10','number','支付网关请求超时秒数') ON DUPLICATE KEY UPDATE description=VALUES(description),value_type=VALUES(value_type);