您现在的位置是:群英 > 开发技术 > 移动开发
小程序的登录授权功能怎样实现,代码怎样写?
Admin发表于 2022-01-07 18:30:371031 次浏览

    小程序的登录授权功能怎样实现?我们在使用小程序时,有些需要我们做登录并且授权的操作,然后我们就能以微信为个人账号信息登录上去了,那么这样的功能是怎样来实现呢?下面我们一起来了解一下,文中的示例代码介绍得很详细,有需要的朋友可以参考。

    登录:

    如果我们要实现小程序的登录,不妨尝试在开启小程序的时候完成登录。也就是说我们可以在app.js中的onlaunch方法中添加小程序登录代码。

    如下:

//微信的登录方法wx.login({      success: res => {
              //登录成功后会返回一个微信端提供的 code ,用来自定义登录使用
        console.log("code",res.code); 
         //向自己的后台发送请求
        wx.request({ 
         url: this.globalData.URL+'login/', 
         data:{ 
           code:res.code
          }, 
         header:{ 
           "content-type": "application/json"
          }, 
         method:"POST", 
         success:function(e){ 
           console.log(e)
              //请求成功后会返回一个自己后端生成的 token 用来做其他操作的校验,把token保存在本地
            wx.setStorageSync("token", e.data.data.token)
          }
        })        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })

后端代码:

    from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom app01.wx import Wx_loginfrom django.core.cache import cachefrom app01 import modelsimport timeimport hashlibclass Login(APIView):

    def post(self,request):
        param = request.data
        if param.get("code"):
            #Wx_login是微信为我们提供的登录方法,这里的data已经有一个session_key和openid了
            data=Wx_login.login(param.get("code"))
            if data:
                # 1 session_key+时间戳等到一个key.(md5
                md5=hashlib.md5()
                md5.update(data.get("session_key").encode("utf8"))
                md5.update(str(time.time()).encode("utf8"))
                key=md5.hexdigest()                #2 session_key与openid做绑定等到val
                val=data.get("session_key")+'&'+data.get("openid")
                #3key->val存到redis,
                cache.set(key,val)                #4把openid存到数据库
                user_data=models.Wxuser.objects.filter(openid=data.get("openid")).first()
                if not user_data:
                    models.Wxuser.objects.create(openid=data.get("openid"))
                #5把key返回给小程序
                return Response({"code": 200, "msg": "suc","data":{"token":key}})
            else:
                return Response({"code": 202, "msg": "code无效"})
        else:
            return Response({"code":201,"msg":"缺少参数"})

    Wx_login

import requests# appid={}&secret={}&js_code={}from app01.wx import settingsdef login(code):
    #code2Session是wx提供的url,填入你的appid和appsecret以及前端发送来的code
        url=settings.code2Session.format(settings.AppId,settings.AppSecret,code)

    reponse=requests.get(url=url)
    #得到的data里面有session_key和openid。
    data=reponse.json()
    print(data)
    if data.get("session_key"):
        return data
    else:
        return False

    settings

    #你注册的小程序的 appid 和 appsecret,code2Session是有官方提供的。pay_mchid是商铺号,需要工商证才能办理,所以自己没法搞。    

    AppId="wx69a0dca5c6b02a43"AppSecret="9d0f80642f4861b53df04a2f7bd65a59"code2Session="https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code"pay_mchid ='1415981402'pay_apikey = 'xi34nu5jn7x2uujd8u4jiijd2u5d6j8e'

    这样登录就完成了

    授权

    html就是一个按钮加一个点击事件,就不写了,主要看点击事件做了什么

luying: function () {    //这个方法的作用是获取配置,看所有的权限
    wx.getSetting({        //获取成功后进入
      success(res) {        console.log("res", res.authSetting['scope.record'])
          //authSetting是这个权限的列表,这一句是看里面有没有录音这个权限
        if (!res.authSetting['scope.record']) {
            //没有权限的话就会走这一句,这个方法的作用是获取权限
          wx.authorize({
              //固定写法权限就是scope.xxx这样的
            scope: 'scope.record',
            success() {
              // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
              wx.startRecord()
            },              //在失败前就已经调用了上面的获取权限,如果没有给权限的话,就会走这个方法。
            fail() {              console.log("你没有授权")
            }
          })
        } else {          // wx.startRecord()
        }
      }
    })
  },

    获取用户信息的权限

    因为用户信息可能会带一些敏感信息,比如说session_key或者openid等等,在前端想要获取信息的话,就必须请求权限。

    需要注意,这种方式是错误的

<button bind:tap="info">用户信息</button>

    必须要这样写才行,才行,这样,在获取请求的同时,会把一些关键的东西传进点击事件里。

<button open-type="getUserInfo" bindgetuserinfo="info1">获取用户信</button>

    js

info1: function (res) {    console.log(res, "按钮")    // wx.getUserInfo({
    //   success: function (res) {
    //     console.log(res, "用户信息")
    //   }
    // })
    var that = this
    //这个方法是用来看你session_key有没有过期的
    wx.checkSession({      success() {        //session_key 未过期,并且在本生命周期一直有效
        wx.request({          url: app.globalData.URL + "userinfo/",
          data: {
              //这个东西就是用户信息了,里面包含敏感信息,是按钮点击的时候传进来的
            encryptedData: res.detail.encryptedData,
              //同上,也是点击的时候传进来的
            iv: res.detail.iv,
              //登录成功后返回的token带上
            token: wx.getStorageSync("token")
          },          header: {            "content-type": "application/json"
          },          method: "POST",          success: function (e) {            console.log(e)

          }
        })
      },      fail() {
        // session_key 已经失效,需要重新执行登录流程
        wx.login() //重新登录
      }
    })
  }

    以上就是小程序的登录授权功能的实现代码,上述示例代码具有一定的参考价值,有需要的朋友可以了解看看,希望对大家学习移动小程序的开发有帮助,想要了解更多可以继续浏览群英网络其他相关的文章。

文本转载自PHP中文网

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-05-06 17:55:42 
摘要:这篇文章主要为大家介绍了使用C语言线性代数的算法来实现矩阵示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
2022-07-27 17:57:25 
摘要:ajax跨域这个问题其实很常见,这篇文章主要给大家介绍了关于AJAX请求数据及实现跨域的三种方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-05-06 17:58:32 
摘要:本篇文章给大家带来了关于Python的相关知识,其中主要介绍了Python的基本编码规范,包括声明编码格式、缩进规则、注释部分和空行使用等等,希望对大家有帮助。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部