微信小程序登录流程

简介: 微信小程序登录流程

1. 前言

  1. 登录很简单,基本都做过,但是进行总结的可能不多
  2. 今天闲来无事就总结一波

2.  登录方式

  1. 微信小程序的登录流程分为两种情况
  2. 一种是使用微信开放平台登录
  3. 一种是使用自定义登录方式

3. 使用微信开放平台登录

  1. 用户在小程序中点击登录按钮,触发登录事件。
  2. 小程序调用wx.login()方法获取临时登录凭证code。
  3. 小程序调用 wx.getUserInfo()方法获取用户的基本信息(头像、昵称等)。
  4. 小程序将code和用户信息发送给开发者的后台服务器
  5. 开发者的后台服务器使用 AppIDAppSecret 调用微信接口获取 session_key 和 openid
  6. 开发者的后台服务器使用session_key对用户信息进行解密,获取用户的真实信息。
  7. 开发者的后台服务器将用户的信息存储到数据库中,并生成一个自定义登录态token并返回给小程序。
  8. 小程序保存该自定义登录态token,并在以后的请求中带上该token

4. 相关代码

  1. 客户端授权登录

// 点击按钮触发登录事件
wx.login({
  success: res => {
    // 获取临时登录凭证
    const code = res.code;
    // 获取用户信息
    wx.getUserInfo({
      success: res => {
        const userInfo = res.userInfo;
        // 将 code 和 userInfo 发送给后台服务器
        wx.request({
          url: 'https://xx.xx.com/api/login',
          data: {
            code: code,
            userInfo: userInfo
          },
          success: res => {
            // 将服务器返回的自定义登录态 token 存储到本地
            wx.setStorageSync('token', res.data.token);
          }
        });
      }
    });
  }
});
  1. 后台服务器处理登录逻辑

const request = require('request');
const crypto = require('crypto');
const APP_ID = '你的 app id';
const APP_SECRET = '你的 app secret';
// 处理小程序端登录请求
function login(req, res) {
  const code = req.body.code;
  const userInfo = req.body.userInfo;
  // 获取 session_key 和 openid
  request(`https://api.weixin.qq.com/sns/jscode2session?appid=${APP_ID}&secret=${APP_SECRET}&js_code=${code}&grant_type=authorization_code`, function(error, response, body) {
    const result = JSON.parse(body);
    const session_key = result.session_key;
    const openid = result.openid;
    // 使用 session_key 对用户信息进行解密
    const encryptedData = userInfo.encryptedData;
    const iv = userInfo.iv;
    const decipher = crypto.createDecipheriv('aes-128-cbc', new Buffer(session_key, 'base64'), new Buffer(iv, 'base64'));
    let decoded = decipher.update(encryptedData, 'base64', 'utf8');
    decoded += decipher.final('utf8');
    const userInfoObj = JSON.parse(decoded);
    // 将用户信息存储到数据库中,生成自定义登录态 token 并返回
    const token = generateToken(userInfoObj);
    res.json({ token: token });
  });
}
// 生成自定义登录态 token
function generateToken(userInfo) {
  const secret = 'your secret key';
  const expireTime = new Date().getTime() + 24 * 3600 * 1000;
  const data = JSON.stringify({
    userInfo: userInfo,
    expireTime: expireTime
  });
  const hash = crypto.createHmac('sha256', secret).update(data).digest('hex');
  const token = `${data}.${hash}`;
  return token;
}

只是大概流程 没有考虑用户退出登录、token 过期等其他情况的处理。


5. 自定义登录方式

  1. 用户在小程序中输入账号密码,点击“登录”按钮,触发登录事件。
  2. 小程序将用户输入的账号密码发送给开发者的后台服务器。
  3. 开发者的后台服务器根据账号密码验证用户的身份,并生成一个自定义登录态token并返回给小程序。
  4. 小程序保存该自定义登录态 token,并在以后的请求中带上该token
  5. 需要注意的是,在使用自定义登录方式时,为了保障用户数据的安全,需要使用 HTTPS 协议,并对用户密码进行加密传输和存储

6. 相关代码

  1. 客户端登录逻辑

// 自定义登录函数,使用用户名和密码登录
const login = (username, password) => {
  return new Promise((resolve, reject) => {
    wx.request({
      url: 'https://xx.yzs.com/api/login',
      method: 'POST',
      data: {
        username: username,
        password: password
      },
      success: res => {
        // 将服务器返回的自定义登录态 token 存储到本地
        wx.setStorageSync('token', res.data.token);
        resolve(res.data);
      },
      fail: err => {
        reject(err);
      }
    });
  });
};
// 在登录页面中调用 login 函数进行登录
const handleLogin = () => {
  const username = '密码';
  const password = '用户名';
  login(username, password).then(res => {
    // 登录成功,跳转到首页
    wx.redirectTo({
      url: '/pages/home/index',
    });
  }).catch(err => {
    // 登录失败,提示错误信息
    wx.showToast({
      title: '登录失败,请重试!',
      icon: 'none'
    });
  });
};
  1. 后台相关逻辑

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const crypto = require('crypto');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// 处理自定义登录请求
app.post('/api/login', (req, res) => {
  const username = req.body.username;
  const password = req.body.password;
  // 根据用户名和密码查询用户信息
  const user = getUserByUsernameAndPassword(username, password);
  if (!user) {
    res.status(401).json({ message: '用户名或密码错误!' });
    return;
  }
  // 将用户信息存储到数据库中,生成自定义登录态 token 并返回
  const token = generateToken(user);
  res.json({ token: token });
});
// 生成自定义登录态 token
const generateToken = user => {
  const secret = '自己的secret key';
  const expireTime = new Date().getTime() + 24 * 3600 * 1000;
  const data = JSON.stringify({
    userId: user.id,
    expireTime: expireTime
  });
  const hash = crypto.createHmac('sha256', secret).update(data).digest('hex');
  const token = `${data}.${hash}`;
  return token;
};
// 根据用户名和密码查询用户信息
const getUserByUsernameAndPassword = (username, password) => {
  // TODO: 实现根据用户名和密码查询用户信息的逻辑
  return {
    id: 123,
    username: 'testuser',
    nickname: 'Test User'
  };
};
app.listen(3000, () => {
  console.log('Server started on port 3000.');
});

7. 请求配置 token

  1. 核心代码

// 假设 token 存在于本地缓存中,缓存的键名为 'token'
const token = wx.getStorageSync('token')
wx.request({
  url: 'https://xx.com/api/some-resource',
  header: {
    'Authorization': `Bearer ${token}`
  },
  success(res) {
    console.log(res.data)
  },
  fail(err) {
    console.error(err)
  }
})
  1. 通过 wx.getStorageSync() 方法获取本地缓存中存储的 token,
  2. 然后将其添加到header对象中的 Authorization 属性中,值为 Bearer ${token},
  3. 其中 Bearer 为固定字符串,${token}是变量,表示真正的 token 值。
  4. 最终发送的请求头会包含Authorization: Bearer ${token},其中 ${token} 会被替换为真实的 token 值。

参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
安全 算法 小程序
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
1011 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
|
小程序
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
1078 1
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
|
小程序
【01】微信支付商户申请下户到配置完整流程-微信商户申请-资料准备以及提交-微信商户密钥申请-申请+配置完整流程-优雅草卓伊凡
【01】微信支付商户申请下户到配置完整流程-微信商户申请-资料准备以及提交-微信商户密钥申请-申请+配置完整流程-优雅草卓伊凡
741 2
【01】微信支付商户申请下户到配置完整流程-微信商户申请-资料准备以及提交-微信商户密钥申请-申请+配置完整流程-优雅草卓伊凡
|
小程序 JavaScript 前端开发
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
21773 14
|
小程序 数据安全/隐私保护 开发者
【02】微信支付商户申请下户到配置完整流程-微信开放平台申请APP应用-微信商户支付绑定appid-公众号和小程序分别申请appid-申请+配置完整流程-优雅草卓伊凡
【02】微信支付商户申请下户到配置完整流程-微信开放平台申请APP应用-微信商户支付绑定appid-公众号和小程序分别申请appid-申请+配置完整流程-优雅草卓伊凡
1299 3
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
3928 12
|
小程序 前端开发 算法
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
9月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
小程序 前端开发 Android开发
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
2398 29
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡