Files
kefu/im/backend/migrations/014_payment_gateway.sql
T
2026-08-27 14:04:28 +08:00

62 lines
3.9 KiB
SQL

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);