昨天同事反馈说,客户用苹果手机扫他们的推广二维码,跳转到公众号(公司服务号)后没有关注按钮,安卓手机显示正常。

我第一反应是手机不适配,但立马被自己给否了,觉得不太可能。公众号属于微信内部页面,它想怎么显示就怎么显示,也不涉及权限和利益,苹果没有理由去做这种事。之后怀疑是微信版本问题,可能是新版本或者旧版本不支持显示旧版的公众号页面。但之后也被自己给否了。同事明确表示,安卓机访问没有问题,只有苹果机型出现这样的情况,且很多例。

比较烦躁,之前自己测试明明是可以的,怎么没过两天就出问题了。我清晰的记得,当时还写一篇博客: 如何提取微信公众号二维码,得到可访问的链接。并且在提取到旧版公众号首页访问链接(新版链接无法直接访问)后,我还放到线上测试过,关注按钮是有的。

百思不得其解。遂百度 “公众号首页关注按钮不显示”,得到的结果比较模糊,之后浏览到一篇更具体地提及苹果手机出现这个问题的微信开放社区问答:为什么苹果手机,从其他H5页面跳转公众号主页,关注按钮没有了? 情况跟提问题的哥们说的基本一致:就是在三方 H5 页面通过链接访问到旧版公众号首页,关注按钮消失了。更具体点,应该是关注按钮闪现了一下,然后消失的。

翻阅他与微信社区工作人员的对话,最后工作人员给出了解释:“这个页面不会开放给第三方使用”。微信会检测链接来源站 referer,非官方的都属于非法 url,IOS 端关注按钮被它隐藏了。这一猜想的佐证:直接打开旧版公众号首页链接,referer 为空,是有关注按钮的。

这解释了为什么一开始上线测试时,关注按钮存在,而后在正常推广使用场景中,关注按钮消失。微信检测到链接来源 referer 非官方,而后将来源站标记为非法 url,将这种访问标记为非法访问,在之后的访问场景里,自动隐藏了关注按钮。

那么微信为什么只针对苹果手机做这种标记处理呢?猜测是苹果对 APP 的隐私权限方面做了更加严格的要求,不允许做这种带有引导式的跳转访问。必须是用户长按公众号二维码识别或者扫描公众号二维码才能明确用户有关注公众号的这一想法。就跟夜间模式一样,只要不伤及微信自身的利益,微信是不会抗争的,乖乖听平台的话做整改。当然这只是猜测。

那么我就只能这么坐以待毙了吗?昨天尝试了几种可能有效的方法,但最终都失败了。我的思路是,既然 referer 为空时关注按钮可以正常显示,那么只要找到修改请求 referer 地址为空的方法,就可以解决这一问题。

网上查找设置 referer 为空的办法

一种是在服务端,通过 curl 、websocket 等多种方式,都可以直接设置 referer 值,然后得到返回结果。但这与现实情况不符,现实需求是前端跳转到微信公众号首页,而不是去请求数据。

一种是说用 meta 标签刷新当前页面,第二次访问时 referer 为空。但我本地测试自己的页面失败了,referer 依然存在,微信上测试当然也失败了。

还有一种是说打开一个新的页面或者窗口,这样 referer 为空。使用 target 为 _blank a 标签和 window.open() 方法分别去打开一个新的页面,本地不能确定新打开的页面 referer 值(没有办法实时 F12 捕捉请求),但刷新后 referer 仍然存在。微信上测试发现,根本打不开新页面或窗口,这一操作被微信给禁了,这方法自然也完犊子了。

山穷水尽,技术层面没办法了,大概只能去接微信公众号带参二维码的接口了。那样的话,市场部同事的二维码全部都要替换掉,并且我还要在线调试这一功能,这很耗时间。

早上市场部经理过来问我问题解决进展,我只要将现实情况合盘托出,并演示给他看,关注按钮真的是后续被微信给隐藏起来的。在没有关注按钮的旧版公众号首页上指指点点,突然地跳转到了新版公众号的页面。对比测试了解到,点击最上方公众号头像和名称是可以跳转到新版页面的,点击下面的公司名称跳转到账号主体页面。这样用户多了一步操作,需要点击头像才能进入并关注公众号。但这也是一个不是办法的办法。

这一意外发现,何其幸哉!暂时就这样了。