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 相关文章推荐
asp.net+jquery滚动滚动条加载数据的下拉控件
Jun 25 Javascript
DIV菜单层实现代码
Nov 19 Javascript
JavaScript回调(callback)函数概念自我理解及示例
Jul 04 Javascript
jquery实现多级下拉菜单的实例代码
Oct 02 Javascript
JavaScript判断是否为数组的3种方法及效率比较
Apr 01 Javascript
js随机生成26个大小写字母
Feb 12 Javascript
jQuery中的select操作详解
Nov 29 Javascript
js中的闭包学习心得
Feb 06 Javascript
JS文件中加载jquery.js的实例代码
May 05 jQuery
vue中设置、获取、删除cookie的方法
Sep 21 Javascript
微信小程序之swiper滑动面板用法示例
Dec 04 Javascript
vue中v-for通过动态绑定class实现触发效果
Dec 06 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php文件缓存类汇总
2014/11/21 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
用javascript实现无刷新更新数据的详细步骤 asp
2006/12/26 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python检测生僻字的实现方法
2016/10/23 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
女方婚礼新郎答谢词
2014/01/11 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
市级三好学生评语
2014/12/29 职场文书