微信公众号扫二维码事件相关
-
用户扫描微信公众号生成的带参数的二维码,可能推送两种不同的事件到微信公众号填写的地址上
- 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者
- 如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者
-
生成带参数的二维码接口
- url: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
- dataType:'json',
-
data:
{ "expire_seconds": 1800, // 有效时间 .以秒为单位。 最大不超过1800。 "action_name": "QR_SCENE", // 二维码类型,QR_SCENE为临时,QR_LIMIT_SCENE为永久 "action_info": {"scene": {"scene_id": 123}} //scene_id: 场景值ID,临时二维码时为32位非0整型, //永久二维码时最大值为100000(目前参数只支持1--100000) }
-
return :
{ "ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==", "expire_seconds":60, "url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI" }
- 根据返回值ticket获取二维码
- url: https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
- 注意:TICKET 记得 UrlEncode
- 实际应用:
- 账号绑定
- 二次登录
1 账号绑定
-
场景描述:用户扫描生成的二维码,自动把公众号对应的微信号的openid绑定到用户.
-
实现思路
- 因为生成带参数的二维码参数的限制为:临时二维码为32位非0整型,永久二维码是最大值100000
- 每一次生成为二维码之前在规定的参数范围内生成一个随机数
- 随机数作为生成二维码的参数(掉微信的api生成二维码..前面有提到)
- 把上一步生成的随机数作为key(当然key可以有前缀,后缀什么的.自己喜欢就好.就是这么任性
- 把一些有用的值比如:user_id,scan_type .(绑定账号)做为value 存到cache中.具体用什么自己喜欢就好.
- 当用户用微信扫描二维码,微信服务器会把参数推送到填好的开发者自己的url上.
- 在url 判断event 事件类型,然后获取到这个参数值(饶了一圈实际上就是上面生成的随机数)
- 上一步里面可以直接获取到用户对应这个公众号对应的openid
- 根据参数,总cache中获取到一个value,value里有user_id,scan_type (实际上放什么都行,你懂的.)
- 然后根据user_id,把openid 绑定到用户.
- 补充: 二维码可以设置失效时间,最好是失效时间跟cache的失效时间一致,(只是建议而已).
2 二次登录验证
- 场景描述 : 用户绑定过微信,在输入用户名,密码正确提交后,到一个中间页,中间页里面就一张二维码,用户微信扫描二维码,在跳转页面
- 实现思路
- 用户绑定过微信,假设用户表里有wx_openid字段
- 第一步用户输入用户名,密码登录成功
- 登录逻辑检验登录,校验成功,不要设置登录态
- 生成随机数作为key,{user_id:'1234',scan_type:'scan_login',login_result:false}做为value 存到cache中,
- 生成二维码,
- 用户扫描二维码,推送到自己的url上.根据key取value
- 根据value中的scan_type判断是scan_login 发现是二次登录操作
- 校验下user_id 对应用户的openid于上一步能获取到的openid是否一致
- 不一致说明是用了其他人的微信扫了二维码.显示不能登录
- 检验通过,设置 value中的login_result = true
- 重新设置cache中随机数作为key 的value
- 中间页(二维码页面),有一个长连接,或者短连接轮询,
- 这个请求只干一件事儿.请求会带上随机数,根据随机数去判断cache中value中login_result是否为true
- 为true 设置user_id的登录态 跳转页面
- 为false 继续轮询
- 补充: cache中key对应的value 可以放很多内容,比如错误提示,错误次数.等等.自己喜欢就好.