• 小程序的登录


    小程序的登录

    官方文档

    说明:

    1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
    2. 将 1 中的 code 发送到后端,调用 auth.code2Session 接口,换取 用户唯一标识 OpenID会话密钥 session_key
    3. 自定义登录状态,生成一个 key 与 openid 和 session_key 相绑定的字符串,把 key 返回到小程序中
    4. 小程序端保存,然后下次请求需要登录接口的时候,把 key 带上

    注意:

    1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
    2. 临时登录凭证 code 只能使用一次

    自定义登录状态

    //app.js
    App({
      onLaunch: function () {
        let that = this
        // 登录
        // wx.login() 获取 code
        wx.login({
          success: res => {
            // 发送 res.code 到后台换取 openId, sessionKey, unionId
            // console.log(res)
            wx.request({
              url: that.globalData.baseurl+"login/",
              data:{"code":res.code},
              method:"POST",
              success(e){
                // console.log(e)
                wx.setStorageSync('token', e.data.data.token)
              }
            })
          }
        })
      },
      globalData: {
        userInfo: null,
        baseurl: "http://127.0.0.1:8000/"
      }
    })
    

    后端,新建文件夹 wx ,在 wx 文件夹下创建 settings.py 文件和 wx_loging.py

    settings.py

    AppId = 'wxb662c1fdacbcb9426'
    AppSecret = '98e19d90eb1169a50e714122edd09b316'
    
    code2Session = 'https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code'
    
    

    wx_loging.py

    from app01.wx import settings
    
    import requests
    
    def get_login_info(code):
        code_url = settings.code2Session.format(settings.AppId, settings.AppSecret, code)
        # 登陆接口校验
        response = requests.get(code_url)
        json_response = response.json()
        if json_response.get('session_key'):
            return json_response
        else:
            return False
    

    views.py

    class Login(APIView):
        def post(self, request):
            param = request.data
            if not param.get('code'):
                return Response({'status': 1, 'msg': '缺少参数'})
            else:
                code = param.get('code')
                user_data = wx_login.get_login_info(code)
                # {'session_key': '0ghT3CyfdxXrT4FF6vaowQ==', 'openid': 'o_36qT4bcvwdtarkY4pzl0PfE35E'}
                if user_data:
                    val = user_data['session_key'] + '&' + user_data['openid']
                    md5 = hashlib.md5()
                    md5.update(str(time.clock()).encode('utf-8'))
                    md5.update(user_data['session_key'].encode('utf-8'))
                    key = md5.hexdigest()
                    cache.set(key, val)
                    has_user = Wxuser.objects.filter(openid=user_data['openid']).first()
                    if not has_user:
                        Wxuser.objects.create(openid=user_data['openid'])
                    return Response({
                        'status': 0,
                        'msg': 'ok',
                        'data': {'token': key}
                    })
                else:
                    return Response({"status": 2, "msg": '无效的 code'})
    

    自定义登录状态,生成一个 key 与 openid 和 session_key 相绑定的字符串,把 key 返回到小程序中

    小程序端保存,然后下次请求需要登录接口的时候,把 key 带上

  • 相关阅读:
    Java 练习(获取两个字符串中最大相同子串)
    STM32F103 实现 简易闹钟小程序
    STM32F103 实现 LCD显示年月日时分秒星期 并可逐值修改的日期 小程序
    Docker报错之“Failed to get D-Bus connection: Operation not permitted”
    数据结构解析
    每天一条DB2命令-004
    每天一条DB2命令-003
    每天一条DB2命令-002
    ElasticSearch系列
    模块三 GO语言实战与应用-BYTES包与字节串操作(下)
  • 原文地址:https://www.cnblogs.com/kai-/p/12470741.html
Copyright © 2020-2023  润新知