当前位置:   article > 正文

【微信小程序】wx.login实现用户登录

wx.login

【实现功能】

之前用手机号授权的方式实现登录,现在重新整理成笔记

【实现原理/步骤】

 一、wx.login

(1)前端通过wx.login()获取登录凭证code,每次调用的code均不同,有效时间5分钟,每个code可验证一回

(2)前端通过wx.request(我这里是用封装好的request.login)将code发送给后端

(3)后端将appid,appSecret(密钥)和code发送给微信接口服务去校验登录凭证,成功后会返回session_key(会话信息记录)和openid(用户唯一标识)

ps:前面的 appid,appSecret(密钥)可以在微信公众号平台获取

(4)用户登录成功后,后端将openid和session_key保存,生成一个自定义登录态的token(令牌)响应回去给前端。

(5)通过token可以查询openid和session_key,前端将返回的token进行缓存,小程序下次请求只要携带着token就可以证明已经登录。

(6)在app.js中检测用户是否已经登录

pages/login/login.js

  1. onLoad() {
  2.     wx.login({
  3.       // 调用接口获取登录凭证(code)
  4.       success(Result) => {
  5.         // 向后台发起request.login请求,用code换取用户登录态信息openid,存储为token;
  6.         request.login({
  7.           codeResult.code
  8.         }).then((token) => {
  9.           // 存储用户登录态信息token
  10.           wx.setStorageSync('token', token)
  11.         }) .catch(error => {
  12.           console.log("换取登录态token失败:",error)
  13.         });
  14.       },
  15.       fail:(res)=> { console.log("获取登录凭证code失败!",res) }
  16.     }) 
  17.   },

app.js

  1. App({
  2.   //配置全局变量(多页面使用)
  3.   globalData: {
  4.     // 登录信息
  5.     token''
  6.   },
  7. // 登录检测:token
  8. checkLogin() {
  9.   //全局变量或缓存中存在token,直接赋值,否则重新登录
  10.   var token = this.globalData.token
  11.   if (!token) {
  12.     token = wx.getStorageSync('token')
  13.     if (token) {
  14.       this.globalData.token = token;
  15.     } else {
  16.       wx.showToast({
  17.         title'请登录',
  18.         icon'none'
  19.       })
  20.       setTimeout(() => {
  21.         wx.reLaunch({
  22.           url'/pages/login/login',
  23.         })
  24.       }, 2000);
  25.     }
  26.   }
  27. },
  28.   onLaunch() {
  29.       // 登录检测:token
  30.       this.checkLogin(),
  31.   },
  32. })

 

微信小程序实现用户登录(详)_微信小程序登录_灵魂学者的博客-CSDN博客

二、一键获取用户微信手机号并登录


(1) getUserInfo 

微信官方修改了 getUserInfo 接口,所以现在无法实现一进入微信小程序就弹出授权窗口,只能通过 button 去触发。

(2)button触发

步骤1:需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,通过 bindgetphonenumber 事件获取回调信息;

步骤2:将 bindgetphonenumber 事件回调中的动态令牌code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号。每个code有效期为5分钟,且只能消费一次。

ps:getPhoneNumber 返回的 code 与 wx.login 返回的 code 作用是不一样的,不能混用。

 pages/login/login.js

  1. // 二、一键登录获取手机号和token
  2. getPhoneNumber(e) {
  3. let that = this
  4. if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
  5. // 用户拒绝手机号授权
  6. wx.showToast({
  7. title: '以游客身份进入',
  8. icon: 'error'
  9. })
  10. setTimeout(() => {
  11. wx.switchTab({
  12. url: '/pages/home/home',
  13. })
  14. }, 2500)
  15. } else {
  16. //同意授权,保存手机号解密所需的code
  17. wx.showToast({
  18. title: '您已经同意授权登录',
  19. })
  20. this.setData({
  21. PhoneNumberSecret: e.detail.code,
  22. })
  23. if(e.detail.code && this.data.OpenId){
  24. // 手机号解密的promise请求
  25. request.getPhoneNumber({
  26. Code: that.data.PhoneNumberSecret,
  27. OpenId: that.data.OpenId
  28. }).then((res) => {
  29. wx.setStorageSync('phoneNumber', res.data)
  30. }).catch(error => {
  31. console.log("request.getPhoneNumber请求失败:",error)
  32. })
  33. }
  34. }
  35. },

注意

从基础库2.21.2开始,对步骤2中换取手机号信息的方式进行了安全升级,上述为新方式使用指南。(旧方式目前可以继续使用,但建议开发者使用新方式,以增强小程序安全性)另外,新方式不再需要提前调用wx.login进行登录

参考链接:https://blog.csdn.net/cheng2290/article/details/102550829/

官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html


原文链接:https://blog.csdn.net/qq_33514421/article/details/81706299 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/160009
推荐阅读
相关标签
  

闽ICP备14008679号