Python版实现微信公众号扫码登陆


Posted in Javascript onMay 28, 2020

基于python 实现公众扫码登陆

前提 申请公众号服务,配置相关信息,并在相关平台进行配置,就这么多东西

Python版实现微信公众号扫码登陆

实现逻辑,使用临时临时二维码,带参数的二维码扫码登陆

流程,用户已经扫码关注,在登陆页面直接扫码登陆,

用户未关注,则需要点击关注后,直接登录,

我们使用带参数的场景值来区别是哪个用户进行扫码登陆

场景值用户可以自定义,但是必须是唯一的,我用的时间戳

我现在要做的功能,有账户绑定需求,并且是前后端分离的情况下,

流程1

当用户已经关注过,并且绑定账号,直接扫码登陆,
当用户已经关注过,未绑定,需要扫码后,跳转到绑定手机号页面,绑定后,进行登录,
当用户取消关注,相当于解绑,进行扫码后,重新到绑定页面,进行扫码登陆,当然也要,对绑定已经绑定过的手机号惊醒判断。

代码如下

接口1 带参数的场景值生成的二维码

def get_wxcode(request):
  """
  公众号扫码登陆
  获取带参数二维码

  参数:

    返回值:
       {
   "formError": {},
   "delta_time": 951,
   "errorCode": 0,
   "params": {
   "scene_id": "512"
   },
   "message": "",
   "data": {
   "url": "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQEi8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyUFNnZ2RNRlU5Y1QxWkJqZDF1Y1QAAgTlmMReAwSAOgkA",
   "sceneid": "2500", # 唯一扫码场景值,用来判断哪个用户进行扫码登陆
   "type": "get"
   }
  }
  """
  try:
    scene_id = str(int((time.time())))
    access_token = get_access_token()
    if access_token:
      user_info_url = u'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' + access_token
      params = {
        'expire_seconds': 604800,
        'action_name': 'QR_STR_SCENE',
        'action_info': {"scene": {"scene_str": scene_id}},
      }
      params = json.dumps(params)
      userinfo = requests.post(user_info_url, data=params).json()
      ticket = userinfo['ticket']
      # except:
      #   raise FieldError("ticket", "ticket获取异常")
      data = {
        "type": 'get',
        'url': 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' + ticket,
        'sceneid':scene_id
      }
      return data
    else:
      raise FieldError("微信", "微信公共号正在维护中,给你带来的不便,敬请原谅")
  except:
    raise FieldError("微信", "微信公共号正在维护中,给你带来的不便,敬请原谅")

接口返回有url 和sceneid URL直接就是一个二维码,前端可以直接拿来展示,sceneid 是返回前端,让前端进行保存,来进行判断用户是否扫码,因为 微信服务,目前不支持sessionid 的缓存,所以需要我们自行缓存,我使用的将场景值存入redis

2 前端展示出来二维后,用户开始扫码,点击关注后,微信服务就用户信息,回调给我们在微信公众填的服务器地址,如图片

Python版实现微信公众号扫码登陆

现在我们开始写回调地址的代码:

微信关注,类型是事件 来发送,具体类型看文档

1 先通过于微信通信验证,是get 请求

Python版实现微信公众号扫码登陆

获取用户信息是post 请求

event 属于关注事件

Python版实现微信公众号扫码登陆

Python版实现微信公众号扫码登陆

我们可以access_token 获取用户信息,将用户信息保存,并将 场景值 eventkey 存入Redis 我设置的过期时间为1个小时
致此微信回调结束,3接口2 ,开始判断用户是否进行扫码关注,我们需要前端给后端传一个场景值,我们通过从redis 的场景值来获取存入数据的用户信息,如果已经存入,则用户扫码成功,直接登录,用户的openid 是唯一的

如果用户信息,获取,则用户并没有进行扫码,这个获取状态的接口,需要一轮询的方式进行查看 可以5s 进行一次

def get_public_wx_status(request):
  '''
  参数
   scene_id 场景值   必传   判断是哪个用户 扫码
  轮询查看 公众号 是否扫码关注,扫码关注是否绑定手机号

  :param request:
  :return:
    {
   "formError": {},
   "delta_time": 713,
   "errorCode": 0,
   "params": {},
   "message": "",
   "data": {
   "focus_state": 1,  # 微信关注的状态 1 已扫码关注  0 未关注
   "state": 0  # 关注后,是否绑定手机号 0 未绑定 1 已绑定,直接登录
   }
  }
  '''


  post_info = request.POST
  scene_id = post_info.get("scene_id", '')
  if not scene_id:
    raise FieldError('scene_id','scene_id不能为空')
  openid = redis_conn.get(scene_id)
  if openid == None:
    return {'focus_state': 0}
  else:
    uid = redis_conn.get(str(openid))
    if uid == None:
      return {'focus_state':0}
    else:
      user = UserWxInfo.objects.get(openid=openid)
      if user.focus_state == 1:
        state = 1
        _ = User.objects.get(uid=user.uid)
        request.apisession["uid"] = user.uid
        request.apisession["pwd_updatetime"] = _.pwd_updatetime
        ip = ''
        if request.META.has_key('HTTP_X_FORWARD_FOR'):
          ip = request.META['HTTP_X_FORWARD_FOR']
        else:
          ip = request.META['REMOTE_ADDR']
        UserLoginLog(uid=user.uid, ip=ip).save()

      else:
        state = 0
      return {
        'focus_state':1,
        'state':state
      }

到此这篇关于Python版实现微信公众号扫码登陆的文章就介绍到这了,更多相关Python公众号扫码登陆内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript英文日期(有时间)选择器
May 02 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
Feb 03 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
Feb 27 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
JS中数组重排序方法
Nov 11 Javascript
BootStrap 可编辑表Table格
Nov 24 Javascript
JS实现批量上传文件并显示进度功能
Jun 27 Javascript
vue上传图片组件编写代码
Jul 26 Javascript
详解require.js配置路径的用法和css的引入
Sep 06 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
Sep 12 Javascript
JS document对象简单用法完整示例
Jan 14 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
May 28 #Javascript
原生js实现五子棋游戏
May 28 #Javascript
Vue微信公众号网页分享的示例代码
May 28 #Javascript
纯JS实现五子棋游戏
May 28 #Javascript
js实现简单五子棋游戏
May 28 #Javascript
js实现双人五子棋小游戏
May 28 #Javascript
vue实现五子棋游戏
May 28 #Javascript
You might like
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
如何设置mysql允许外网访问
2013/06/04 PHP
php compact 通过变量创建数组
2016/11/15 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
python 接口_从协议到抽象基类详解
2017/08/24 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
python装饰器使用实例详解
2019/12/14 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
Python 解析简单的XML数据
2020/07/24 Python
用python读取xlsx文件
2020/12/17 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
网吧收银员岗位职责
2013/12/14 职场文书
助残日活动总结
2014/08/27 职场文书
对学校的意见和建议
2015/06/04 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL