微信小程序开发 – 用户授权登陆「建议收藏」

微信小程序开发 – 用户授权登陆「建议收藏」本篇将帮助读者实现基于微信开发者工具&C#环境下的用户在小程序上的授权登陆。准备:微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html微信小程序开发文档:https://developers.weixin.qq.com/miniprogram/d…

大家好,又见面了,我是你们的朋友全栈君。

本篇将帮助读者实现基于 微信开发者工具 & 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 接口在此不加赘述,用户根据自身情况对数据进行操作即可,微信方调用成功时返回的相关参数信息如下

微信小程序开发 - 用户授权登陆「建议收藏」

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

最后的最后,是从别人那里学来的赚零钱小套路~ 赏点小钱鼓励一下我吧 ! ! ! (๑•̀ㅂ•́)و✧

微信小程序开发 - 用户授权登陆「建议收藏」

认真看完以上所有后

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131681.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构:图的存储结构之邻接矩阵「建议收藏」

    数据结构:图的存储结构之邻接矩阵「建议收藏」图的邻接矩阵(AdjacencyMatrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:我们来看一个实例,图7-4-2的左图就是一个无向图。我们再来看一个有向图样例,如图7-4-3所示的左图。在图的术语中,我们提到了网的概念,也就

    2025年7月29日
    0
  • Linux下安装Tomcat服务器和部署Web应用

    Linux下安装Tomcat服务器和部署Web应用使用工具winSCP,XShell操作步骤一、下载和上传1.下载tomcat我这里下载的是tomcat8.5,网址是https://tomcat.apache.org/download-80.cgi,截图说明2.上传tomcat到服务器中去打开winSCP,使用winSCP来将下载的.tar.gz文件拖拽到Linux系统中指定的目录下去二、安装Tomcat服…

    2022年5月5日
    32
  • 网络python培训班「建议收藏」

    网络python培训班「建议收藏」为进一步推动高等院校人工智能教学工作的开展,加强国内各高等院校同行间的交流,培养国内的师资力量,将人工智能最新实训内容带入课堂,特举办“人工智能系列课程理论与实践”高级培训班。该培训定于2021年7月20日开始,共包含七大专题,每个专题5天左右,共计30天,通过线上直播的方式进行集训。七大专题分别为Python机器学习,图像识别与深度学习,深度学习与NLP,知识图谱、图神经网络和强化学习,深度学习PyTorch理论与实战。本次培训由权威专家主讲,提供实验环境及实验数据,并提供配套资料,通过剖析工程案例展

    2022年7月19日
    19
  • zabbix===》使用模板监控nginx、php-fpm、redis「建议收藏」

    zabbix===》使用模板监控nginx、php-fpm、redis「建议收藏」一、使用模板监控nginx1.下载nginx(要监控的主机也就是客户端)#1.有CentOS-Base.repo和epel.repo这两个源就可以直接yum下载nginx[root@db01~]#cd/etc/yum.repos.d/[root@db01yum.repos.d]#ll总用量16-rw-r–r–.1rootroot252311月1803:23CentOS-Base.repo-rw-r–r–.1rootroot66411月1803

    2022年6月5日
    33
  • git命令删除分支_git删除一个分支

    git命令删除分支_git删除一个分支git命令删除分支应用场景:有时我们已经在gitlab或者gitee上面已经删除分支,但是本地编辑器gitbranch的时候依然有该分支,我们想删除;亦或者想在本地直接删除远程的分支假设,你想删除本地testone分支gitbranch查看本地分支,比如:testonetesttwo两个分支gitcheckouttesttwo切换到testtwo分支,因为你想删除testone执行gitbranch-dtestone即可另外:

    2022年8月31日
    3
  • Div+CSS – 简单布局

    Div+CSS – 简单布局Div+CSS – 简单布局

    2022年4月22日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号