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


Posted in Javascript onApril 24, 2019

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

准备:

微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

微信小程序开发文档:https://developers.weixin.qq.com/miniprogram/dev/index.html

开发:

在开发之初,我们需要先明确微信方已经制定好的授权登陆流程,参看 官方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 接口在此不加赘述,用户根据自身情况对数据进行操作即可,微信方调用成功时返回的相关参数信息如下

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

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

认真看完以上所有后

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

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

以上所述是小编给大家介绍的微信小程序开发用户授权登陆详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript高级程序设计 事件学习笔记
Sep 10 Javascript
display和visibility的区别示例介绍
Feb 26 Javascript
JavaScript操作XML文件之XML读取方法
Jun 09 Javascript
js+css实现select的美化效果
Mar 24 Javascript
AngularJS利用Controller完成URL跳转
Aug 09 Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 Javascript
js 判断一个数字是不是2的n次方幂的实例
Nov 26 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
Aug 24 Javascript
js实现通过开始结束控制的计时器
Feb 25 Javascript
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
vue 动态创建组件的两种方法
Dec 31 Vue.js
Html5生成验证码的示例代码
May 10 Javascript
微信小程序实现的一键拨号功能示例
Apr 24 #Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
Apr 24 #Javascript
微信小程序实现的图片保存功能示例
Apr 24 #Javascript
vue中的inject学习教程
Apr 24 #Javascript
浅谈Webpack多页应用HMR卡住问题
Apr 24 #Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 #Javascript
vue模仿网易云音乐的单页面应用
Apr 24 #Javascript
You might like
天津市收音机工业发展史
2021/03/04 无线电
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
php单链表实现代码分享
2016/07/04 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
3种vue组件的书写形式
2017/11/29 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
django的登录注册系统的示例代码
2018/05/14 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
利用Python计算KS的实例详解
2020/03/03 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
一道Delphi面试题
2016/10/28 面试题
护士实习鉴定范文
2013/12/22 职场文书
机械系毕业生求职信
2014/05/28 职场文书
运动会方阵口号
2014/06/07 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
婚礼答谢礼品
2015/01/20 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
Redis如何实现分布式锁
2021/08/23 Redis