-- ============================================================= -- 微信公众号(服务号)绑定与推送 -- -- 业务说明: -- 1. 服务号配置(yz_platform_wechat_mp_config):AppID / AppSecret / Token / EncodingAESKey, -- 其中 AppSecret 与 EncodingAESKey 以 AES-256-GCM 加密后存储 -- (密钥取 app.conf 的 wechat_mp_secret_key,代码内部 SHA-256 派生)。 -- 2. 关注用户(yz_platform_wechat_mp_follower):用户关注/取关事件沉淀,openid 维度唯一; -- 通过「扫码关注 → 公众号回复验证码 → 平台输入验证码」流程绑定到 -- 平台用户(platform_user)或租户用户(tenant_user),认证后可定向推送。 -- 3. 验证码(yz_platform_wechat_mp_verify_code):一次绑定会话一条,scene 绑定二维码场景值, -- 默认 5 分钟有效;状态:0待扫码 1已扫码待核销 2已核销 3已过期。 -- -- 未认证服务号限制:仅支持服务器配置、关注/扫码事件、被动回复、带参数二维码; -- 模板消息/订阅通知/客服消息需认证后用。 -- -- 本脚本可重复执行:建表用 IF NOT EXISTS,旧表名(yz_wechat_*)做存在性改名兼容。 -- 运行:mysql --default-character-set=utf8mb4 -h -P -u -p < create_platform_wechat_mp.sql -- ============================================================= -- 0) 兼容早期表名(yz_wechat_mp_config / yz_wechat_follower / yz_wechat_verify_code): -- 旧表存在且新表不存在时直接改名,保留已配置数据。 SET @old := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_wechat_mp_config'); SET @new := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_platform_wechat_mp_config'); SET @ddl := IF(@old > 0 AND @new = 0, 'RENAME TABLE `yz_wechat_mp_config` TO `yz_platform_wechat_mp_config`', 'DO 0'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @old := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_wechat_follower'); SET @new := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_platform_wechat_mp_follower'); SET @ddl := IF(@old > 0 AND @new = 0, 'RENAME TABLE `yz_wechat_follower` TO `yz_platform_wechat_mp_follower`', 'DO 0'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @old := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_wechat_verify_code'); SET @new := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_platform_wechat_mp_verify_code'); SET @ddl := IF(@old > 0 AND @new = 0, 'RENAME TABLE `yz_wechat_verify_code` TO `yz_platform_wechat_mp_verify_code`', 'DO 0'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 1) 服务号配置(单行) CREATE TABLE IF NOT EXISTS `yz_platform_wechat_mp_config` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID', `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT '公众号 AppID', `app_secret` varchar(512) NOT NULL DEFAULT '' COMMENT 'AppSecret(AES 加密存储)', `token` varchar(128) NOT NULL DEFAULT '' COMMENT '服务器配置 Token(自定义,用于签名校验)', `aes_key` varchar(512) NOT NULL DEFAULT '' COMMENT 'EncodingAESKey(43位,AES 加密存储)', `encrypt_mode` varchar(16) NOT NULL DEFAULT 'plain' COMMENT '消息加解密方式:plain明文 compatible兼容 safe安全', `template_id` varchar(128) NOT NULL DEFAULT '' COMMENT '模板消息ID(认证后在公众号后台申请后填入)', `verified` tinyint(4) NOT NULL DEFAULT 0 COMMENT '公众号是否已认证:1是 0否(认证后才可主动推送)', `enabled` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否启用:1启用 0停用', `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信公众号(服务号)配置表'; -- 2) 关注用户(粉丝) CREATE TABLE IF NOT EXISTS `yz_platform_wechat_mp_follower` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID', `openid` varchar(64) NOT NULL DEFAULT '' COMMENT '微信 openid(公众号维度用户标识)', `unionid` varchar(64) NOT NULL DEFAULT '' COMMENT '微信 unionid(开放平台绑定后才有)', `nickname` varchar(128) NOT NULL DEFAULT '' COMMENT '昵称(未认证公众号可能拉取不到,留空展示 openid 缩写)', `avatar` varchar(512) NOT NULL DEFAULT '' COMMENT '头像地址', `sex` tinyint(4) NOT NULL DEFAULT 0 COMMENT '性别:0未知 1男 2女', `city` varchar(64) NOT NULL DEFAULT '' COMMENT '城市', `province` varchar(64) NOT NULL DEFAULT '' COMMENT '省份', `country` varchar(64) NOT NULL DEFAULT '' COMMENT '国家', `subscribe` tinyint(4) NOT NULL DEFAULT 1 COMMENT '关注状态:1已关注 0已取关', `subscribe_time` datetime DEFAULT NULL COMMENT '关注时间', `unsubscribe_time` datetime DEFAULT NULL COMMENT '取关时间', `bind_type` varchar(32) NOT NULL DEFAULT '' COMMENT '绑定对象:platform_user平台用户 tenant_user租户用户 空=未绑定', `bind_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '绑定对象ID(平台用户ID / 租户用户ID)', `bind_tid` bigint(20) NOT NULL DEFAULT 0 COMMENT '绑定租户ID(租户用户时记录)', `bind_time` datetime DEFAULT NULL COMMENT '绑定时间', `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注(平台可编辑)', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)', PRIMARY KEY (`id`), UNIQUE KEY `uk_openid` (`openid`), KEY `idx_bind` (`bind_type`,`bind_id`), KEY `idx_subscribe` (`subscribe`), KEY `idx_delete_time` (`delete_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信公众号关注用户(粉丝)表'; -- 3) 关注验证码(绑定会话) CREATE TABLE IF NOT EXISTS `yz_platform_wechat_mp_verify_code` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID', `scene` varchar(64) NOT NULL DEFAULT '' COMMENT '二维码场景值(随机串,唯一)', `code` varchar(8) NOT NULL DEFAULT '' COMMENT '验证码(6位数字,公众号被动回复给用户)', `openid` varchar(64) NOT NULL DEFAULT '' COMMENT '扫码用户 openid(扫码后写入)', `status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态:0待扫码 1已扫码待核销 2已核销 3已过期', `bind_type` varchar(32) NOT NULL DEFAULT '' COMMENT '发起绑定方:platform_user / tenant_user', `bind_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '发起绑定方ID', `bind_tid` bigint(20) NOT NULL DEFAULT 0 COMMENT '发起绑定租户ID', `expire_at` datetime DEFAULT NULL COMMENT '有效期截止(默认5分钟)', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_scene` (`scene`), KEY `idx_openid` (`openid`), KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信公众号关注取码/绑定验证码表';