安卓机一切正常,同事的iPhone死活调不起付款;换个微信版本又好了。支付调起失败是微信公众号开发里最磨人的问题类型,报错信息少、复现概率飘,排查像破案。把常见病灶列出来,对着查能省大量时间。
先分清是哪一类失败
点按钮毫无反应,多半是前端问题:JS报错被吞了、按钮事件没绑上、或者页面在iframe里被浏览器拦截。弹了支付框又秒退,通常是参数问题:时间戳是秒不是毫秒、签名字段拼接错、openid和支付下单用的不一致。还有一种表现是部分用户正常部分失败,多半和微信版本有关,让用户升级微信再试,同时在前端做版本提示。还有一种最冤的:商户号的支付目录配置漏了当前页面路径,前端怎么改都没用,去商户平台把目录补上立刻痊愈。
排查的固定套路
- 打开vConsole或真机调试,看第一行JS报错
- 比对统一下单返回与前端唤起参数,字段逐个对
- 换一台低版本微信和一台旧安卓机复现,看是否机型相关
- 检查系统时间,手机时间不准会导致签名校验失败
- 部分用户失败先查微信版本,提示升级再试
- 下单到唤起间隔控制在五分钟内,超时重新发起
抓包是最后的手段,需要用户配合设置代理,多数问题在前三步就能定位,别一上来就上重武器。手机系统时间不准这条,资深开发都会栽,客户手机时间快了五分钟,支付永远失败,客服排查了一周。还有一种隐蔽情况:统一下单接口正常,但用户的支付授权签名过期,表现为反复唤起反复失败。把下单和唤起的时间间隔控制住,下单后超过五分钟的订单要求重新发起,这类问题就会消失大半,日志里把下单和唤起的时间都记上,复盘时一目了然。机型和内核差异方面,iOS对签名校验更严格,安卓老旧内核对新的语法支持差,前端打包时的兼容目标别设太高。
上线前的回归清单
至少覆盖三档设备:新iPhone、主流安卓旗舰、三年前的千元安卓机,每台真金白银走一笔小额支付。支付成功后的跳转页也要在三档设备上过一遍,白屏或样式错乱同样伤转化。支付是转化的最后一厘米,兼容问题在这里的流失是不可逆的。比格网络交付微信公众号开发项目时,支付模块的机型回归是必过项,每次微信客户端大版本更新后,支付链路再安排一轮快速回归,别等用户反馈,多花半天测试,换的是上线后客服电话的清净,这买卖稳赚。支付的细节,值得多抠一步。