微信内置浏览器升级后,一批用户提交表单全部提示「令牌无效」,同一时间用系统浏览器打开却正常,出问题的请求里 UA 多了新版本号。日志里能对上时间点,这种反而好排。
表单令牌生成时把浏览器标识拼进了签名,微信热更新换了标识,签名对不上。令牌还绑了 IP,切换网络也会失效。这一点先确认清楚,后面就不用反复试。
hash_hmac('sha256', $sid . '|' . $exp, $secret);
// 不把 UA、IP 拼进签名
这次卡住的地方就在「token 绑定 UA」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。
处理上按这个顺序:签名只绑会话和过期时间,浏览器标识和 IP 最多做风险参考,别参与校验;令牌失效时自动换发一次,别直接拒绝用户;用两个不同版本的微信客户端各提交一次验证。
结果对不对很好判断,微信升级后的客户端也能正常提交,令牌不再因为标识变化失效。
