欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解微信小程序开发用户授权登陆

程序员文章站 2022-06-21 09:53:01
本篇将帮助读者实现基于 微信开发者工具 & c#环境 下的用户在小程序上的授权登陆。 准备: 微信开发者工具下载地址: 微信小程序开发文档: 开发: 在开发之...

本篇将帮助读者实现基于 微信开发者工具 & c#环境 下的用户在小程序上的授权登陆。

准备:

微信开发者工具下载地址:

微信小程序开发文档:

开发:

在开发之初,我们需要先明确微信方已经制定好的授权登陆流程,参看 官方api - 登陆接口。

你会看到微信方为开发者制定好的登陆授权流程:

详解微信小程序开发用户授权登陆

如图,即为一个顺向的用户登陆授权的流程。

为什么说它是一个顺向的流程呢?因为在真正的小程序开发中,我们并不确定用户何时需要起调如上的登陆流程(如:用户在某些特定场景下的凭证丢失,但ta并没有退出小程序而是在小程序内部做跳转等相关操作,即有可能导致一些预期之外的异常),所以,我们需要在这个顺向的流程之外,加一层检测机制,来解决这些异常场景,而官方api中,wx.checksession 刚好可以一定程度上解决这个问题。

那么,我们的认证流程其实应该是:

小程序 wx.checksession 校验登陆态为失效

success :接口调用成功的回调函数,session_key未过期,流程结束;    

fail :接口调用失败的回调函数,session_key已过期

小程序端 wx.login 获取code 并 wx.request 提交code给己方服务器

己方服务器 提交appid + appsecret + code 到微信方服务器 获取 session_key & openid

己方服务器 根据 session_key & openid  生成 3rd_session(微信方提出的基于安全性的考虑,建议开发者不要将openid等关键性信息进行数据传输) 并返回 3rd_session 到小程序端

小程序端 wx.setstorage 存储 3rd_session ( 在后续用户操作需要凭证时 附带该参数 )

小程序端 wx.getuserinfo 获取用户信息 + wx.getstorage 获取 3rd_session 数据后,一并 wx.request 提交给己方服务器

己方服务器 sql用户数据信息更新,流程结束;

思路整理完毕,接下来实现流程

小程序端:

在小程序中,新建一个通用的js做基础支持

 详解微信小程序开发用户授权登陆

并在一些需要引用的页面进行引用

var common = require("../common/common.js")

接着,在common.js 中实现逻辑

//用户登陆
function userlogin() {
 wx.checksession({
  success: function () {
   //存在登陆态
  },
  fail: function () {
   //不存在登陆态
   onlogin()
  }
 })
}
 
function onlogin() {
 wx.login({
  success: function (res) {
   if (res.code) {
    //发起网络请求
    wx.request({
     url: 'our server apiurl',
     data: {
      code: res.code
     },
     success: function (res) {
      const self = this
      if (逻辑成功) {
       //获取到用户凭证 存儲 3rd_session 
       var json = json.parse(res.data.data)
       wx.setstorage({
        key: "third_session", 
        data: json.third_session
       })
       getuserinfo()
      }
      else {
 
      }
     },
     fail: function (res) {
 
     }
    })
   }
  },
  fail: function (res) {
 
  }
 })
 
}
 
function getuserinfo() {
 wx.getuserinfo({
  success: function (res) {
   var userinfo = res.userinfo
   userinfosetinsql(userinfo)
  },
  fail: function () {
   useraccess()
  }
 })
}
 
function userinfosetinsql(userinfo) {
 wx.getstorage({
  key: 'third_session',
  success: function (res) {
   wx.request({
    url: 'our server apiurl',
    data: {
     third_session: res.data,
     nickname: userinfo.nickname,
     avatarurl: userinfo.avatarurl,
     gender: userinfo.gender,
     province: userinfo.province,
     city: userinfo.city,
     country: userinfo.country
    },
    success: function (res) {
     if (逻辑成功) {
      //sql更新用户数据成功
     }
     else {
      //sql更新用户数据失败
     }
    }
   })
  }
 })
}

至此,小程序端的流程基本实现完毕,接着实现己方服务api

login 接口逻辑范例

if (dicrequestdata.containskey("code"))
    {
      string apiurl = string.format("https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code", proutil.smartappid, proutil.smartsecret, dicrequestdata["code"]);
    
      httpwebrequest myrequest = (httpwebrequest)webrequest.create(apiurl);
      myrequest.method = "get";
      httpwebresponse myresponse = (httpwebresponse)myrequest.getresponse();
      streamreader reader = new streamreader(myresponse.getresponsestream(), encoding.utf8);
      string content = reader.readtoend();
      myresponse.close();
      reader.close();
      reader.dispose();
 
      //解析
      usermodel remsg = jsonutil.jsondeserialize<usermodel>(content); //解析
      if ((!string.isnullorwhitespace(remsg.openid)) && (!string.isnullorwhitespace(remsg.session_key)))
      {
        // 成功 自定义生成3rd_session与openid&session_key绑定并返回3rd_session
 
      }
      else
      {
        // 错误 未获取到用户openid 或 session
      }
    }
    else
    {
      // 错误 未获取到用户凭证code
    }

userinfoupdate 接口在此不加赘述,用户根据自身情况对数据进行操作即可,微信方调用成功时返回的相关参数信息如下

详解微信小程序开发用户授权登陆

至此,完成了小程序基本的授权登陆及用户信息的获取。

认真看完以上所有后

有啥不懂的 欢迎留言提问~

注:以上内容有所删减,仅保留通用内容。在具体项目中必定存在部分逻辑需要调整,引鉴的同学请注意

以上所述是小编给大家介绍的微信小程序开发用户授权登陆详解整合,希望对大家有所帮助