微信公众号扫二维码事件相关

微信公众号扫二维码事件相关

  • 用户扫描微信公众号生成的带参数的二维码,可能推送两种不同的事件到微信公众号填写的地址上

    • 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者
    • 如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者
  • 生成带参数的二维码接口

    • 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 可以放很多内容,比如错误提示,错误次数.等等.自己喜欢就好.

猜你喜欢

转载自zzxiaoman.iteye.com/blog/2192221