老单还在走 v2,新单已经切到 v3
老单还在走 v2,新单已经切到 v3。全量迁完风险太大。
见过一个挺务实的做法:在回调入口按配置分流。
就是一个 if —— 但位置选得好。
java
public ResponseEntity<String> payCallback(
String data,
HttpServletRequest req) {
if ("V2".equals(config.getVersion())) {
// 老路径:v2 的 XML 解析
return handleV2(data);
}
// 新路径:v3 的解密 + 验签
return handleV3(data, header(req));
}一个配置项决定走哪条路,两套代码都留着。
好处:切换只改配置,出问题立刻切回去,不用回滚发布。
代价:两套代码都要维护,测试要覆盖两倍的路径。
这种写法容易被嫌弃「不干净」。但迁移期它是对的——支付是收钱的路径,你需要的是随时能退回去的能力,不是代码好看。
要注意的是这个开关必须有退场计划。见过太多「临时开关」活了三年,后来的人不敢删,因为不知道生产上到底走的哪条。
我的做法是在代码里写清楚:
java
// TODO 迁移完成后删除 v2 分支
// 计划:全部商户切 v3 之后注释里写「计划」,比写「临时」有用。 「临时」是个形容词,「全部商户切 v3 后」是个可判断的条件。
