• 小程序的登入问题,普通权限认证和特殊权限的问题


    openid的解释:

    ​ openid是单个微信应用表示用户的唯一标识,同一用户在不同应用上的openid不同,在同一应用上唯一

    unionid的解释:

    ​ unionnid:一个用户在多个小程序有唯一的标识

    小程序的登入:

    1.小程序执行wx.login()获取code
    2.将1中的code发送到后端,后端调用auth.code2Session这个接口,得到openid和session_key
    3.自定义登入状态,我们生成一个key与openid和session_key相绑定,把key返回到小程序中
    4.小程序端保存,下次请求需要登入的接口时,将这个key给带上
    

    业务逻辑图:

    代码:

    app.js
     globalData: {
        userInfo: null,
        baseurl:"http://127.0.0.1:8000/"
      }
            在onLaunch中
      let that = this
        // 登录
        wx.login({
          success: res => {
            // 发送 res.code 到后台换取 openId, sessionKey, unionId
            console.log(res.code)
            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)
              }
            })
          }
        })
        
        
    
    user.py
    
    from rest_framework.response import Response
    from rest_framework.views import APIView
    from app01.wx import wx_login
    import hashlib
    import time
    from django.core.cache import cache
    from app01.models import Wxuser
    
    
    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)
                # print(user_data)
                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"})
                    
         
        
     wx.setting.py
     
    AppId="wx038cbc7c14282f34"
    
    AppSecret="b49f2b18f82f30578df2e66f9cbaa019"
    
    code2Session="https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code"
    
    
    wx_login.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数据转换成字典
        json_response = response.json()
        if json_response.get("session_key"):
            return json_response
        else:
            return False
    
    
        
    
        
    models.py
    class Wxuser(models.Model):
        id = models.AutoField(primary_key=True)
        openid = models.CharField(max_length=255)
        name = models.CharField(max_length=50)
        avatar = models.CharField(max_length=200)
        language = models.CharField(max_length=50)
        province = models.CharField(max_length=50)
        city = models.CharField(max_length=50)
        country = models.CharField(max_length=50)
        # gender = models.CharField(max_length=50)
        creat_time = models.DateTimeField(auto_now_add=True)
        update_time = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.openid
    
    

    结果展示:

    wx开发端保存了token:

    后台也保存到数据库:

    小程序的授权:

    授权的原因:部分功能需要用户同意后才能使用
    1.wx.getSetting来判断该用户有没有对接口授权,我们判断哪个接口,就必须对wx.getSetting传对应的scope值,一个scope值对应着一个或多个接口:
    列表如下:
    scope 列表
    scope	对应接口	描述
    scope.userInfo	wx.getUserInfo	用户信息
    scope.userLocation	wx.getLocation, wx.chooseLocation	地理位置
    scope.userLocationBackground	wx.startLocationUpdateBackground	后台定位
    scope.address	wx.chooseAddress	通讯地址
    scope.invoiceTitle	wx.chooseInvoiceTitle	发票抬头
    scope.invoice	wx.chooseInvoice	获取发票
    scope.werun	wx.getWeRunData	微信运动步数
    scope.record	wx.startRecord	录音功能
    scope.writePhotosAlbum	wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum	保存到相册
    scope.camera	camera 组件	摄像头
    
    
    2.如何从wx.getSetting中发现scope值是false,表示没有授权,可以通过wx.authorize发起授权,对哪个接口授权,就给wx.authorize传对应的scope值,如果用户同意授权,就可以直接使用对应的接口
    
    3.但是scope.userInfo没有办法使用wx.authorize自动弹起弹框,必须要用户手动点击按钮,唤起授权弹框
    代码格式:
    	<button open-type="getUserInfo" bindgetuseribfo-"user1" >用户信息</button>
        可以在响应函数的参数中获取用户信息,e.detail,这个和直接调用wx.getUserInofr获取的值一样
    

    js代码:

    lu:function(){
        wx.getSetting({
          
          success(res){
            // 当没有授权时,弹出弹框提示授权
            if(!res.authSetting['scope.record']){
              wx.authorize({
                scope: 'scope.record',
                success(){
                  wx.startRecord()
                },
                fail(){
                  console.log("缺少权限")
                }
              })
            }
            // 当已经授权以后,再次使用,则不会出弹框,除非清除缓存。
            else{
              wx.startRecord()
            }
          }
        })
      },
    

    无论用户选择接受还是拒绝,都会记录在后台,除非大退,记录才会删除

    独有的用户信息授权

    wxml代码:

    <button open-type="getUserInfo" bindgetuseribfo-"user1" >用户信息</button>
    

    js代码:

    user:function(e){
        console.log("e",e.detail)
        wx.getSetting({
          success(res){
            if (res.authSetting['scope.userInfo']){
              wx.getUserInfo({
                success:(res) =>{
                  console.log("res",res)
                }
              })
            }
          }
        })
    
      },
    

    可以在响应函数的参数中获取用户信息,e.detail,这个和直接调用wx.getUserInofr获取的值一样

  • 相关阅读:
    秘密挤奶机(最大流,二分)
    伊基的故事 I
    多源汇最大流(最大流)
    无向树是二分图
    上下界可行流
    圆桌问题(最大流,二分图,网络流24题)
    双栈排序
    观光奶牛
    拜访奶牛
    愤怒的牛&数列分段II
  • 原文地址:https://www.cnblogs.com/godlover/p/12481983.html
Copyright © 2020-2023  润新知