-- 资源直购虚拟支付改造 -- 执行前请先备份数据库。适用于当前项目的 MySQL 数据库。 ALTER TABLE app_resource ADD COLUMN price_fen INT NOT NULL DEFAULT 0 COMMENT '虚拟支付价格,单位分' AFTER ad_number; -- 兼容已有“is_ad=3 且 ad_number 表示人民币元”的资源。 UPDATE app_resource SET price_fen = ad_number * 100 WHERE is_ad = 3 AND price_fen = 0 AND ad_number > 0; CREATE TABLE app_virtual_product ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', product_id VARCHAR(64) NOT NULL COMMENT '微信虚拟道具productId', price_fen INT NOT NULL COMMENT '价格档位,单位分', product_name VARCHAR(100) NOT NULL COMMENT '档位名称', status TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0停用', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_virtual_product_id (product_id), UNIQUE KEY uk_virtual_product_price (price_fen) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信虚拟道具价格档位'; CREATE TABLE app_virtual_order ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', order_no VARCHAR(32) NOT NULL COMMENT '业务订单号', user_id BIGINT NOT NULL COMMENT '用户ID', resource_id BIGINT NOT NULL COMMENT '资源ID', product_id VARCHAR(64) NOT NULL COMMENT '微信虚拟道具ID', price_fen INT NOT NULL COMMENT '支付金额,单位分', open_id VARCHAR(64) NOT NULL COMMENT '微信OpenID', status TINYINT NOT NULL DEFAULT 0 COMMENT '0待支付 1已支付发货 2已退款 3已关闭', wx_order_no VARCHAR(64) NULL COMMENT '微信内部订单号', transaction_id VARCHAR(64) NULL COMMENT '微信支付交易单号', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, pay_time DATETIME NULL, provide_time DATETIME NULL, refund_time DATETIME NULL, last_query_time DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_virtual_order_no (order_no), KEY idx_virtual_order_user (user_id, create_time), KEY idx_virtual_order_resource (resource_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='资源虚拟支付订单'; CREATE TABLE app_resource_entitlement ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', user_id BIGINT NOT NULL COMMENT '用户ID', resource_id BIGINT NOT NULL COMMENT '资源ID', order_no VARCHAR(32) NOT NULL COMMENT '来源虚拟支付订单号', status TINYINT NOT NULL DEFAULT 1 COMMENT '1有效 0已撤销', granted_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, revoked_time DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_resource_entitlement_order (order_no), UNIQUE KEY uk_resource_entitlement_user_resource (user_id, resource_id), KEY idx_resource_entitlement_resource (resource_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='付费资源访问权益'; -- 执行迁移后: -- 1. 在微信公众平台创建各价格档位的道具并发布; -- 2. 在若依后台编辑付费资源,填写“价格(分)”和对应的 productId; -- 3. 同一价格填写同一个 productId,后台会自动维护 app_virtual_product 映射。 -- 当前小程序已发布的微信虚拟道具价格映射。 -- product_id 必须与微信后台保持完全一致(包括 resourse 的现有拼写)。 INSERT INTO app_virtual_product (product_id, price_fen, product_name, status, create_time) VALUES ('resourse_1', 100, '1元资源', 1, NOW()), ('resourse_10', 1000, '10元资源', 1, NOW()), ('resourse_50', 5000, '50元资源', 1, NOW()), ('resourse_99', 9900, '99元资源', 1, NOW()), ('resourse_300', 30000, '300元资源', 1, NOW()) ON DUPLICATE KEY UPDATE product_name = VALUES(product_name), status = 1, update_time = NOW();