微信 H5 支付调起后用户完成付款返回,页面重新加载,订单号从 URL 里消失,页面显示“订单不存在”,后台其实已支付。乍看像缓存或者权限的锅,追下去往往不是。

sessionStorage.setItem('payingOrder', orderId);
const orderId = new URLSearchParams(location.search).get('orderId')
  || sessionStorage.getItem('payingOrder');

追下去是这么回事:支付中途微信把页面带到外部,返回时部分机型重新加载当前地址,查询参数在跳转过程中被丢掉。状态只存在内存里,重载即空。

「H5 支付返回」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

具体做法是,发起支付前把订单号写进 sessionStorage;返回页面时优先从 sessionStorage 恢复;URL 里保留 orderId 并在重载后重新查询状态;支付完成、取消、返回三种路径各测一次。

验收就看一点,支付返回后仍能显示该订单号并查到已支付状态,取消支付也能回到原订单。

作者 9823189