支付中转页面升级实践
背景
本次需求是支付链路升级:在兼容原有支付能力的基础上,新增不同版本的支付方案(如原生微信支付、小程序拉起支付)。
升级动因主要有两点:
- 旧链路能力单一,面对不同支付场景时扩展性不足;
- 新商家小程序上线后,支付入口和参数形态更加多样,需要统一中转层承接。
另外,第三方支付链路涉及签名与加解密,复杂逻辑统一下沉后端实现,前端以接口返回结果为准,减少前端安全风险与维护成本。
整体思路
构建一个统一的 H5 支付中转页面,负责:
- 统一接收并兼容不同来源的支付参数;
- 兼容扫码场景下的
query解析差异; - 按支付版本动态分流到不同支付方式;
- 在异常场景下提供兜底回退(默认原生微信支付)。
流程示意图:

关键实现细节
1) H5 页面拉起小程序
在微信 H5 中拉起小程序可使用开放标签 wx-open-launch-weapp:
<wx-open-launch-weapp
id="launch-btn"
appid="wx12345678"
path="pages/home/index?user=123&action=abc"
>
<script type="text/wxtag-template">
<style>
.btn {
padding: 12px;
}
</style>
<button class="btn">打开小程序</button>
</script>
</wx-open-launch-weapp>
<script>
const btn = document.getElementById("launch-btn");
btn.addEventListener("launch", () => console.log("success"));
btn.addEventListener("error", (e) => console.log("fail", e.detail));
</script>
接入前提:开放标签可用前,必须先完成 wx.config 校验:
wx.config({
debug: true,
appId: "",
timestamp: 0,
nonceStr: "",
signature: "",
jsApiList: [],
openTagList: [], // 例如 ["wx-open-launch-weapp"]
});
wx.ready(function () {
// config 校验成功后,开放标签能力才可用
});
wx.error(function (res) {
// 签名过期或参数错误时可在此上报并重拉签名
});
注意事项:
- 只有
config成功后,开放标签才会正常渲染与点击; text/wxtag-template内样式需写在模板内部,不可完全依赖页面外部样式。
2) 支付参数兼容与解析
由于不同入口参数形态不统一(普通 query 与拼接 param 并存),中转页需要先做解析归一:
getUrlQuery() {
const { param = "" } = this.$route.query || {};
const hasParam = Object.keys(this.$route.query).includes("param");
return hasParam ? handlerQueryParams(param) : this.$route.query;
}
// 示例:
// http://xxx.com/payPage?param=businessType:9;payId:1668909350495006721;totalAmt:100000
export function handlerQueryParams(url) {
const splitArr = url.split(";").filter((item) => item !== "");
const query = {};
splitArr.forEach((item) => {
const index = item.indexOf(":");
if (index !== -1) {
const key = item.substring(0, index);
const val = item.substring(index + 1);
query[key] = val;
}
});
return query;
}
3) 多版本支付分流
根据后端返回版本号(如 V1/V2/V3)决定支付方式:
// 需要跳转小程序支付
isPayWeapp() {
return ["V2", "V3"].includes(this.version);
},
// 需要原生微信支付
// 接口异常或未知版本时建议兜底到原生支付
isPayWx() {
return ["V1"].includes(this.version);
}
原生微信支付示例:
wxJsBridge(
{
appId: wxJsBridgeJson.appId,
timeStamp: wxJsBridgeJson.timeStamp,
nonceStr: wxJsBridgeJson.nonceStr,
package: wxJsBridgeJson.package,
signType: wxJsBridgeJson.signType,
paySign: wxJsBridgeJson.sign,
},
() => {}
);
结论
通过“统一中转页 + 参数归一 + 版本分流 + 后端加解密下沉”,可以在不破坏旧能力的前提下平滑引入新支付方案,并显著降低多入口支付链路的维护复杂度。
相关文章
键盘弹起导致底部被顶起问题(H5 适配)
在移动端 H5 页面中,当用户聚焦 input、textarea 等可编辑元素、软键盘弹出时,常见表现包括:
中英文输入法下搜索触发冲突复盘
在“边输入边查询”场景中,很多实现会直接在 input 事件中请求接口。 但在中文输入法(IME)场景下,如果不处理输入合成过程,容易出现“未完成输入就提前触发查询”的问题。
企业微信 uni-app H5:OAuth 回退白屏与列表缓存
第三方 BI 报表项目,企业微信内嵌 H5,uni-app 编译,history 模式。主页面 BiLink 同时承担静默授权和列表展示,上线后碰到两个问题:授权完清掉 URL 参数,iOS 侧滑返回还是白屏;列表加了缓存以后,刷新行…
移动端返回事件触发两次问题复盘
App + H5 混合开发中,点击返回后直接跳出 H5 页面回到原生首页。复盘现象、复现路径、双触发的根因、两种修复方案及取舍建议,并给出回归检查清单。
GridView 宫格加载渲染优化
系统首页 GridView 宫格模块接口耗时不高,但首次进入总耗时接近 22s。复盘耗时分层定位过程、代码层面的瓶颈(约 2000 行、100 个 tab 重复节点)、优化手段与最终指标对比。
企业微信与小程序工单问题
企微师傅端与商家小程序端长期共用一套代码,页面与组件嵌套边界不清晰、引入规范缺失、公共代码与端侧代码耦合度高,导致维护成本持续上升。本文给出拆分为两套独立项目的架构建议,并说明边界划分、迁移注意事项与性能优化方向。
Series
team documents
17 / 22