小程序开发-服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

7.2 KiB

支付方式优化迁移指南

📋 概述

本文档说明如何将现有的复杂支付方式(19种)简化为8种核心支付方式,提高系统的可维护性和用户体验。

🎯 优化目标

  • 简化支付方式:从19种减少到8种核心支付方式
  • 提高可维护性:减少代码复杂度和维护成本
  • 保持兼容性:确保现有数据和业务逻辑正常运行
  • 改善用户体验:简化支付选择,提高支付成功率

📊 支付方式映射表

保留的核心支付方式(8种)

代码 名称 渠道 说明
0 余额支付 balance 用户账户余额扣减
1 微信支付 wechat 包含JSAPI和Native两种模式
2 支付宝支付 alipay 支付宝在线支付
3 银联支付 union_pay 银联在线支付
4 现金支付 cash 线下现金收款
5 POS机支付 pos 线下刷卡支付
6 免费 free 免费商品或活动
7 积分支付 points 用户积分兑换

⚠️ 废弃的支付方式映射

原代码 原名称 建议迁移到 迁移说明
2 会员卡支付 0 (余额支付) 会员卡余额转为用户余额
3 支付宝支付(旧) 2 (支付宝支付) 编号调整:3→2
6 VIP月卡 0 (余额支付) VIP卡余额转为用户余额
7 VIP年卡 0 (余额支付) VIP卡余额转为用户余额
8 VIP次卡 0 (余额支付) VIP卡余额转为用户余额
9 IC月卡 0 (余额支付) IC卡余额转为用户余额
10 IC年卡 0 (余额支付) IC卡余额转为用户余额
11 IC次卡 0 (余额支付) IC卡余额转为用户余额
12 免费(旧) 6 (免费) 编号调整:12→6
13 VIP充值卡 0 (余额支付) 充值卡余额转为用户余额
14 IC充值卡 0 (余额支付) 充值卡余额转为用户余额
15 积分支付(旧) 7 (积分支付) 编号调整:15→7
16 VIP季卡 0 (余额支付) VIP卡余额转为用户余额
17 IC季卡 0 (余额支付) IC卡余额转为用户余额
18 代付 1 (微信支付) 通过代付字段记录代付信息
19 银联支付(旧) 3 (银联支付) 编号调整:19→3
102 微信Native 1 (微信支付) 合并到微信支付,自动选择支付模式

🔧 技术实现

1. 枚举类更新

已更新 PaymentType.java

  • 保留8种核心支付方式
  • 废弃的支付方式标记为 @Deprecated
  • 添加兼容性方法:isCorePaymentType(), isDeprecated()

2. 业务逻辑兼容

已更新 ShopOrderServiceImpl.java

  • 微信支付(1)自动根据openid选择JSAPI或Native模式
  • 保持对旧的微信Native(102)的兼容支持
  • 添加废弃支付方式的警告日志

3. 实体类注释更新

已更新相关实体类的Schema描述:

  • ShopOrder.java
  • ShopOrderParam.java

📝 数据迁移SQL

3.1 查看现有支付方式分布

-- 查看当前系统中各支付方式的使用情况
SELECT 
    pay_type,
    COUNT(*) as order_count,
    SUM(total_price) as total_amount
FROM shop_order 
WHERE pay_status = 1 
GROUP BY pay_type 
ORDER BY order_count DESC;

3.2 迁移废弃的支付方式

-- 第一步:调整编号映射(旧编号到新编号)
UPDATE shop_order SET pay_type = 2, comments = CONCAT(IFNULL(comments, ''), ' [支付宝编号调整: 3→2]') WHERE pay_type = 3;
UPDATE shop_order SET pay_type = 6, comments = CONCAT(IFNULL(comments, ''), ' [免费编号调整: 12→6]') WHERE pay_type = 12;
UPDATE shop_order SET pay_type = 7, comments = CONCAT(IFNULL(comments, ''), ' [积分支付编号调整: 15→7]') WHERE pay_type = 15;
UPDATE shop_order SET pay_type = 3, comments = CONCAT(IFNULL(comments, ''), ' [银联支付编号调整: 19→3]') WHERE pay_type = 19;

-- 第二步:将会员卡类支付迁移为余额支付
UPDATE shop_order
SET pay_type = 0,
    comments = CONCAT(IFNULL(comments, ''), ' [原支付方式: ',
        CASE pay_type
            WHEN 2 THEN '会员卡支付'
            WHEN 6 THEN 'VIP月卡'
            WHEN 7 THEN 'VIP年卡'
            WHEN 8 THEN 'VIP次卡'
            WHEN 9 THEN 'IC月卡'
            WHEN 10 THEN 'IC年卡'
            WHEN 11 THEN 'IC次卡'
            WHEN 13 THEN 'VIP充值卡'
            WHEN 14 THEN 'IC充值卡'
            WHEN 16 THEN 'VIP季卡'
            WHEN 17 THEN 'IC季卡'
        END, ']')
WHERE pay_type IN (2, 6, 7, 8, 9, 10, 11, 13, 14, 16, 17);

-- 第三步:将微信Native支付迁移为微信支付
UPDATE shop_order
SET pay_type = 1,
    comments = CONCAT(IFNULL(comments, ''), ' [原支付方式: 微信Native支付]')
WHERE pay_type = 102;

-- 第四步:处理代付支付方式
UPDATE shop_order
SET pay_type = IFNULL(friend_pay_type, 1),
    comments = CONCAT(IFNULL(comments, ''), ' [原为代付支付]')
WHERE pay_type = 18;

部署步骤

1. 预部署检查

# 1. 备份数据库
mysqldump -u username -p database_name > backup_before_payment_migration.sql

# 2. 检查当前支付方式分布
mysql -u username -p -e "
SELECT pay_type, COUNT(*) as count 
FROM shop_order 
GROUP BY pay_type 
ORDER BY count DESC;"

2. 代码部署

  1. 部署更新后的代码
  2. 重启应用服务
  3. 验证支付功能正常

3. 数据迁移

  1. 执行上述迁移SQL
  2. 验证数据迁移结果
  3. 清理废弃的支付配置

4. 后续清理

等待1-2个版本后,可以完全移除废弃的枚举值:

// 最终版本的PaymentType枚举(移除所有@Deprecated项)
public enum PaymentType {
    BALANCE(0, "余额支付", "balance"),
    WECHAT(1, "微信支付", "wechat"),
    ALIPAY(3, "支付宝支付", "alipay"),
    CASH(4, "现金支付", "cash"),
    POS(5, "POS机支付", "pos"),
    FREE(12, "免费", "free"),
    POINTS(15, "积分支付", "points"),
    UNION_PAY(19, "银联支付", "union_pay");
}

🧪 测试建议

1. 功能测试

  • 测试8种核心支付方式的正常流程
  • 测试废弃支付方式的兼容性
  • 测试支付回调处理
  • 测试退款功能

2. 数据验证

  • 验证迁移后的订单数据完整性
  • 验证支付统计报表的准确性
  • 验证用户余额的正确性

📈 预期收益

  1. 代码简化:减少50%以上的支付相关代码复杂度
  2. 维护成本降低:减少支付方式维护工作量
  3. 用户体验提升:简化支付选择,提高转化率
  4. 系统稳定性:减少支付相关的bug和异常

⚠️ 注意事项

  1. 数据备份:迁移前务必备份数据库
  2. 分步实施:建议分阶段实施,先标记废弃,后续版本再移除
  3. 监控告警:部署后密切监控支付成功率和异常情况
  4. 用户通知:如有必要,提前通知用户支付方式的变更

🔗 相关文件

  • src/main/java/com/gxwebsoft/payment/enums/PaymentType.java - 支付类型枚举
  • src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java - 订单实体
  • src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java - 订单服务实现
  • src/main/java/com/gxwebsoft/payment/strategy/ - 支付策略实现目录