文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

微信小程序实现一键登录

2024-04-02 19:55

关注

本文实例为大家分享了微信小程序实现手机号登录的具体代码,供大家参考,具体内容如下

项目需求

点击按钮获取用户电话号码绑定到后台,登录。

实现思路

1、使用微信开放功能为获取用户手机号的button按钮绑定点击事件为获取用户授权。
2、如果获取用户手机号授权成功调用微信登录接口获取code。
3、用获取到的code去调用后台接口获取到用户的openid。
4、code+openid去调用后台写的小程序自动登录接口获取到access_token,至此登录功能完成。
5、查询用户是否绑定过手机号,未绑定就去调用绑定手机号的接口。绑定过就直接提示登录成功,根据自己项目需求跳转页面,我是直接返回到上一页。

关键代码

<!-- wxml -->
<button open-type="getPhoneNumber" class="button" bindgetphonenumber="author">
  <image class="button-img" src="../../assets/images/wx_icon@2x.png"></image>
  <text>微信一键授权登录</text>
</button>
// wxss
@import '../../common.less';
.button {
  width: 80%;
  height: 88rpx;
  display: flex;
  background: @baseColor1;
  color: #fff;
  font-size: 30rpx;
  border: none;
  border-radius: 44rpx;
  justify-content: center;
  align-items: center;
  font-weight: 400;
  margin: 254rpx auto 74rpx;
  .button-img {
    width: 56rpx;
    height: 40rpx;
    margin-right: 6rpx;
  }
}
// login.js

author(e) {
  if (e.detail.errMsg === 'getPhoneNumber:ok') {
    this.login(e);
  }
},

login(e) {
  let that = this;
  // 微信获取登录code
  wx.login({
    success(res1) {
      if (res1.code) {
        wx.setStorageSync('code', res1.code);
        // 后台获取用户openid
        app.api.user.getOpenID({
          code: res1.code
        }).then(res2 => {
          if (res2.code === 2000) {
            wx.setStorageSync('openid', res2.data.openid);
            wx.setStorageSync('session_key', res2.data.session_key);
            // 后台小程序自动登录
            app.api.user.autologin({
              openid: res2.data.openid,
              code: res1.code
            }).then(res3 => {
              if (res3.code === 2000) {
                // 至此登录完成
                wx.setStorageSync('access_token', res3.data.access_token)
                // 查询用户是否绑定过手机号
                app.api.user.info().then(res4 => {
                  if (res4.code === 2000) {
                    if (res4.data.bind === 2) {
                      app.toast('登录成功', 'none');
                      that.goBack();
                    } else {
                      // 未绑定手机号,去绑定
                      that.getPhoneNumber(e);
                    }
                  } else {
                    app.toast(res4.msg, 'none');
                  }
                })
              } else {
                app.toast(res3.msg, 'none');
              }
            })

          } else {
            app.toast(res2.msg, 'none');
          }
        })
      } else {
        app.toast('登录失败!' + res1.errMsg);
      }
    }
  })
},

getPhoneNumber(e) {
  // 判断session是否失效
  app.check.session((res) => {
    let token = wx.getStorageSync('access_token');
    let session_key = wx.getStorageSync('session_key');
    app.api.user.bindphone({
      token,
      session_key,
      encryptedData: e.detail.encryptedData,
      iv: e.detail.iv
    }).then(res => {
      if (res.code === 2000) {
        app.toast('绑定成功', 'none');
        this.goBack();
      } else {
        app.toast(res.msg, 'none');
      }
    }).catch(err => {
      app.toast('绑定手机号失败', 'none');
    })
  }, this.getPhoneNumber, e)
}

// utils/check.js
let api = require('../api/index');
let toast = require('./toast');
let check = {};


check.session = (success, error, e) => {
  wx.checkSession({
    //session_key 未过期,并且在本生命周期一直有效
    success,
    fail() {
      // session_key 已经失效,需要重新执行登录流程
      wx.login({
        success(res1) {
          if (res1.code) {
            wx.setStorageSync('code', res1.code);
            // 后台获取用户openid
            api.user.getOpenID({
              code: res1.code
            }).then(res2 => {
              if (res2.code === 2000) {
                wx.setStorageSync('openid', res2.data.openid);
                wx.setStorageSync('session_key', res2.data.session_key)
                // 后台小程序自动登录
                api.user.autologin({
                  openid: res2.data.openid,
                  code: res1.code
                }).then(res3 => {
                  if (res3.code === 2000) {
                    wx.setStorageSync('access_token', res3.data.access_token)
                    error(e);
                  }
                })
              }
            })
          } else {
            toast('登录失败!' + res.errMsg);
          }
        }
      })
    }
  })
}

module.exports = check;

参考文档

1. 小程序登录 | 微信开放文档
2. wx.login(Object object) | 微信开放文档
3. button | 微信开放文档
4. 获取手机号 | 微信开放文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯