前端时间在接入微信支付的时候,发现出现了这个问题。
借此记录一下排查思路和解决方法。
检查配置
确定微信后台已经配置了正确的支付授权目录,如下是我们设置的值。
支付授权目录:https://xxxx.com/pages/studio/
具体设置规则可看官方文档。
排查问题
唤醒支付目标页:pages/studio/list
登录页:pages/login/login
当时发现:为什么截图上显示的路径不是我们目标路径,反而是被登录拦截后登录页路径呢?
更奇怪的是,在目标页刷新了一下就能正常唤醒支付了。
带着这个疑惑,我们尝试用不同设备再次重复以上的步骤,出现的结果得出了一个结论,请看下面。
结论
IOS,如果首次访问的页面不是支付授权目录规则下的话就有问题。
而安卓是没有此问题的。
然后,根据尝试的结果,自我总结了以下结论。
安卓 和 IOS 判断这个支付授权目录的规则不一样,分为两种。
安卓:CurrentPath - 当前域名
IOS:LandingPath - 落地域名
怎么理解这两个呢?
CurrentPath 就是当前的页面;可以理解成 location.href,无论你跳转多次,都是获取你当前的路径。
LandingPath 就是你一开始加载进来的页面;在微信上的表现就是有顶部loading条的那个页面,无论你之后跳转多次,都是获取了你首次加载进来的页面。
这样就能解释,为什么IOS唤醒支付的时候会有几率报 当前页面的URL未注册 了。
因为首次加载的页面不是所配置的支付授权目录,无论你后续是否跳转到正确的目录,IOS微信也只会与你 Landing 的页面做比对。
解决办法
使用 location.href 强行跳转一次
还想起,之前测试的时候,都发现每次刷新后就能正常支付了。
所以,我们可以使用 locaiton.href 这种形式,用户点支付的时候跳转一下,让LandingPath变成你授权支付的页面。
从当初的页面流程由,用户访问 -> pages/login/login -> pages/studio/list -> 点击支付 -> 唤醒微信支付弹窗
改为目前的页面流程,用户访问 -> pages/login/login -> pages/studio/list -> 点击支付 -> pages/studio/checkout -> 唤醒微信支付弹窗
我们的做法是增加了一步“收银台”的步骤,把这个页面(pages/studio/checkout)添加到微信支付授权目录,用户点击支付的时候,location.href 跳转到这个页面,刷新微信的LandingPath,确保当前LandingPath是你配置的授权支付页面,这就能解决问题了。