背景
半年前公司付费业务接入了微信付费签约的相关功能,一直都很顺利,没有bug反馈。
最近这几天有个新的需求,要修改一下页面内容,提测后,测试同学给我反馈说签约成功后页面404了,淦,我逻辑上的东西都没改啊,就改了点文案,咋还能404呢?
微信签约的完整逻辑就不说了,主要是后台的事情,前端的工作很少,生成业务订单之后,后台会返回一个url,我们只需要跳转到这个url即可。至于签约付款成功后返回我们页面,这些都是微信做好的。
签约文档见下面的链接:
微信支付中签约
解决过程
遇到这样的bug是让人很烦的,我只是做了个页面跳转,微信签约之后返回这都不是我能控制的,我上哪儿知道这404是啥。但是本着我优秀的职业素养,我不能说不知道,只能是先抓包看看是怎么回事。
从图上看到确实是404,在这里404的是我们的域名根目录,这个域名根目录我们没有配置相关资源。
跳转到微信签约的页面url是 xxx.com/a/b.html 这样的链接,理论上签约成功后返回的也应该是这个b.html,而且iOS以及其他安卓设备的微信上确实也是返回b.html。
问题就出在这里,为什么微信返回的是域名,不是完整url。不过没关系,我遇到的问题99%都是别人遇到过的,去找找别人的解决方案,然后搜了一圈发现竟然没有,只有一个小伙伴在微信的开发社区发了帖子,但是有没有解决也不知道,只有寥寥的几个回复。那我只能自己去找微信人工客服了。
效率还可以,排队没有等太久,经过跟技术支持沟通后,我确认了是微信通过refer没有获取到完整url,微信端页面获取的refer就是这个域名。通过抓包的数据我发现确实是这样,跳转微信签约的时候,http请求refer里确实只有域名,我的代码里是没有做过相关配置,那么只能是浏览器搞的鬼了。
firefox浏览器也会出现这个问题,不过网上的解决方案是修改浏览器配置,不可取。那么我只能找通过代码控制refer的方式,设置meta标签
使用 Referer Meta 标签控制 referer—详解 referrer-policy
设置为always即可解决我的这个问题了。
<meta name="referrer" content="always" >
总结
问题解决,说实话这个问题还是有点坑的,运气好用了不到半天解决了。如果不是一路尝试下来的方式方法没有太多弯路,不一定要卡多久。
通过这个bug,也让我对refer有了更多了解,这玩意确实很不可靠,微信竟然用这种不可靠的方式去做的返回。也许是他们内部的历史原因吧。
这世界上本没有完美的事情,都是各种缺陷各种坑,我们就是要在这坑坑洼洼的路上前行,跌倒没关系,爬起来并记住,学习,以后就会越来越顺利。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。