-- ============================================================================ -- 会员购买(微信小程序虚拟支付 · 道具直购) -- 适用:个人主体小程序(服务类目含「工具」),月支付限额 10 万元 -- 执行前请确认已备份;本脚本幂等性由 `IF NOT EXISTS` / 存在性判断保证。 -- ============================================================================ -- 1. users:等级有效期 + session_key ---------------------------------------- -- level_expire_at:会员到期时间,NULL = 永久(管理员手动分配的等级保持 NULL) -- session_key :微信 session_key,用户态签名 signature 需要 SET @db := DATABASE(); SET @sql := ( SELECT IF(COUNT(*) = 0, 'ALTER TABLE `users` ADD COLUMN `level_expire_at` datetime DEFAULT NULL COMMENT ''等级/会员到期时间,NULL=永久'' AFTER `level_key`', 'SELECT ''users.level_expire_at already exists'' AS msg') FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'users' AND COLUMN_NAME = 'level_expire_at' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := ( SELECT IF(COUNT(*) = 0, 'ALTER TABLE `users` ADD COLUMN `session_key` varchar(128) DEFAULT NULL COMMENT ''微信 session_key(虚拟支付签名用)'' AFTER `openid`', 'SELECT ''users.session_key already exists'' AS msg') FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'users' AND COLUMN_NAME = 'session_key' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 2. member_plans:会员套餐 -------------------------------------------------- CREATE TABLE IF NOT EXISTS `member_plans` ( `id` bigint NOT NULL AUTO_INCREMENT, `plan_key` varchar(32) NOT NULL COMMENT '套餐标识,如 vip-month', `name` varchar(64) NOT NULL COMMENT '展示名,如 月卡', `subtitle` varchar(128) DEFAULT NULL COMMENT '副标题', `level_key` varchar(32) NOT NULL COMMENT '购买后生效的等级', `duration_days` int NOT NULL DEFAULT 30 COMMENT '有效天数', `price_cents` bigint NOT NULL DEFAULT 0 COMMENT '价格(分),须与微信后台道具价格一致', `product_id` varchar(64) NOT NULL COMMENT '微信虚拟支付道具 ID', `badge` varchar(32) DEFAULT NULL COMMENT '角标文案', `sort` int NOT NULL DEFAULT 0, `is_enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1 上架 / 0 下架', `remark` varchar(255) DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_plan_key` (`plan_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员套餐(道具直购)'; -- 3. member_orders:会员订单 ------------------------------------------------- CREATE TABLE IF NOT EXISTS `member_orders` ( `id` bigint NOT NULL AUTO_INCREMENT, `out_trade_no` varchar(64) NOT NULL COMMENT '业务单号,唯一,8-32 位且不能以下划线开头', `wx_order_id` varchar(64) DEFAULT NULL COMMENT '平台单号,发货/对账以此为准,用于幂等去重', `user_id` bigint NOT NULL, `openid` varchar(64) NOT NULL COMMENT '支付时使用的 openid,主动查单需要', `plan_key` varchar(32) NOT NULL, `product_id` varchar(64) NOT NULL, `price_cents` bigint NOT NULL DEFAULT 0, `level_key` varchar(32) NOT NULL COMMENT '等级快照', `duration_days` int NOT NULL DEFAULT 0 COMMENT '天数快照', `status` tinyint NOT NULL DEFAULT 0 COMMENT '0 待支付 / 1 已发货 / 2 已退款 / 3 已关闭', `pay_channel` varchar(16) DEFAULT NULL COMMENT 'wxpay / apple', `attach` varchar(128) DEFAULT NULL COMMENT '透传数据', `paid_at` datetime DEFAULT NULL, `delivered_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_out_trade_no` (`out_trade_no`), UNIQUE KEY `uk_wx_order_id` (`wx_order_id`), KEY `idx_user_created` (`user_id`, `created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员订单(虚拟支付道具直购)'; -- 4. 套餐数据 ---------------------------------------------------------------- -- 套餐种子由服务端 internal/logic/seed.go 在启动时幂等写入(与其他种子数据一致), -- 请在那里修改 product_id / 价格后重启服务即可。 -- 注意:product_id 必须先在 MP 后台【虚拟支付 → 道具管理】创建并发布, -- 价格(分)也要与后台道具价格严格一致,否则支付会被平台拒绝。