内容提要
文章介绍通过微信扫码关注公众号实现网站登录的流程:认证服务号生成含UUID的带参数二维码,用户扫码或关注后微信推送事件,后台解析事件并将openid写入缓存,前端轮询缓存获取openid完成登录;需认证服务号并配置服务器。
延伸解读
服务号权限是硬性前提
文章明确指出,实现扫码关注登录必须使用已认证的服务号,订阅号没有生成带参数二维码和接收事件推送的权限。这意味着个人或未认证的公众号无法直接套用该方案,开发者需提前确认账号类型与认证状态,否则后续接口调用和服务器配置都无法进行。
UUID与缓存构成状态桥梁
方案的核心是用uniqid生成唯一UUID作为场景值,放入二维码的scene_str中,同时在本地缓存以该UUID为键、过期时间5分钟。用户扫码后微信推送的事件里会带回这个UUID,后台据此找到对应缓存并写入openid。前端轮询的正是这个缓存键,从而把一次扫码动作与一次登录请求关联起来。
事件处理需区分扫码与关注
后台接收事件时,需同时处理SCAN(已关注用户扫码)和subscribe(新关注用户扫码)两种事件类型。对于subscribe事件,EventKey会带有qrscene_前缀,代码中通过str_replace去除后再作为缓存键。若只处理其中一种,部分用户扫码后将无法完成登录,这是实现时容易遗漏的细节。
轮询机制与响应格式的注意点
前端通过轮询缓存判断openid是否已写入,从而完成登录,但文章未讨论轮询频率、超时后的前端处理以及缓存未命中时的用户体验。此外,事件处理程序最后返回的XML消息必须保持原始格式,不能做额外格式化,否则微信服务器可能无法正确解析,影响消息回复。
Q&A
微信扫码关注公众号登录网站需要什么类型的公众号?
必须使用已认证的服务号,订阅号没有生成带参数二维码和接收事件推送的权限。
如何生成带参数的二维码?
调用微信的二维码生成接口,使用action_name为QR_STR_SCENE,在scene_str中放入生成的UUID,并设置过期时间(如5分钟),同时将UUID存入缓存。
用户扫码或关注后,后台如何处理微信推送的事件?
后台接收POST的XML数据,解析出MsgType为event且Event为SCAN或subscribe时,从EventKey中提取UUID(去除qrscene_前缀),检查缓存中是否存在该UUID,若存在则将openid写入缓存。
前端如何知道用户已经扫码成功?
前端通过轮询查询缓存中是否已写入openid,如果存在则说明扫码成功,随后用该openid完成用户登录。
公众号后台服务器如何配置?
需要在公众号后台配置服务器URL、Token和EncodingAESKey,具体步骤参考微信官方文档的接入指南。
扫码登录的整体流程是怎样的?
流程为:1. 生成带UUID参数的二维码;2. 用户扫码或关注后微信推送事件;3. 后台解析事件并将openid写入缓存;4. 前端轮询缓存获取openid完成登录。