微信小程序鉴权登录详解 —— 基于 wx.login 与后端 openid 换取流程

微信小程序登录鉴权是开发中非常关键的一环。小程序端调用微信接口获取登录凭证 code,后端利用该 code 换取用户身份标识 openid,结合业务逻辑完成用户鉴权。本文详细介绍这一流程,并给出后端用 code 换取 openid 的示例代码。


1. wx.login():获取登录凭证 code

微信小程序调用 wx.login(),由微信服务器生成一个临时登录凭证 code。该 code 有效期短,且只能用一次,用于证明此次登录请求的合法性。

示例:

js 复制代码
wx.login({
  success(res) {
    if (res.code) {
      // 将 res.code 发送给后端,完成身份验证
    }
  }
});

2. 发送 code 到后端进行身份校验

小程序端将 code 通过 HTTP 请求发送到后端,后端通过微信官方接口验证并获取用户身份。

js 复制代码
wx.request({
  url: 'https://your-api.com/api/login.wx',
  method: 'POST',
  data: { code: res.code },
  success(loginRes) {
    wx.setStorageSync('token', loginRes.data.token);
  }
});

3. 后端用 code 换取 openid

后端收到 code 后,通过调用微信官方接口换取用户的唯一身份标识 openid 和会话密钥 session_keyopenid 是识别用户的关键。

以下是一个 Node.js 环境中用 fetch 调用微信接口的示例:

js 复制代码
import fetch from 'node-fetch';

async function getOpenIdAndSessionKey(code) {
  const appid = process.env.WX_APPID;       // 小程序 AppID
  const secret = process.env.WX_SECRET;     // 小程序 AppSecret

  const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=authorization_code`;

  const response = await fetch(url);
  const data = await response.json();

  if (data.errcode) {
    throw new Error(`微信接口错误: ${data.errmsg}`);
  }

  return {
    openid: data.openid,
    session_key: data.session_key,
  };
}

说明:

  • appidsecret 需妥善保管,不要泄露给客户端;
  • 该接口返回的 openid 是微信小程序用户的唯一标识;
  • session_key 可用于解密用户敏感数据。

4. 后端查找或创建用户

拿到 openid 后,后端在数据库中查询该用户是否存在:

  • 若存在,直接返回对应用户数据;
  • 若不存在,创建新用户记录。

这保证了用户身份的唯一对应。


5. 签发 Token 并返回小程序

后端基于用户信息生成 Token(如 JWT),该 Token 用于后续接口鉴权,保证接口安全。

js 复制代码
const token = signJwt({ uid: user.id, openid: user.openid });
return { token };

小程序保存该 Token,后续请求携带 Token 访问受保护接口。


6. 小程序保存 Token 并带 Token 请求

小程序端使用 wx.setStorageSync 保存 Token:

js 复制代码
wx.setStorageSync('token', token);

调用接口时带上 Token:

js 复制代码
const token = wx.getStorageSync('token');
wx.request({
  url: 'https://your-api.com/api/protected',
  method: 'GET',
  header: {
    Authorization: `Bearer ${token}`
  },
  success(res) {
    // 处理响应数据
  }
});

7. 小结

步骤 说明
1. 小程序调用 wx.login 获取临时登录凭证 code
2. 小程序发送 code 给后端 触发后端身份验证流程
3. 后端调用微信接口换取 openid 通过 code 获取微信用户唯一标识 openid
4. 后端查找/创建用户 确认用户身份并建立账号
5. 后端签发 Token 并返回 生成 JWT 供后续请求使用
6. 小程序保存 Token 并携带请求 保障接口访问的鉴权和安全

8. 结语

微信小程序登录流程通过 wx.login 获取 code,后端换取 openid,结合自身业务逻辑完成用户登录,是开发安全小程序的标准流程。理解并掌握该流程,有助于构建完善的用户鉴权体系。

相关推荐
油丶酸萝卜别吃11 小时前
jquery-ajax.js 说明文档
前端·javascript·jquery
windliang11 小时前
Claude Code 源码分析(九):子 Agent 如何分叉、继续与回到父会话
前端·javascript·面试
柒和远方11 小时前
V063: TS 面试必考:interface 与 type 的四大差异,与 LLM Harness 的自动化择优
前端·javascript
半个落月12 小时前
React useRef 详解:DOM 引用、持久化值与 Worker 实例
前端·react.js
阿黎梨梨12 小时前
TypeScript 类型编程:从新手到 Harness 工程实践
前端
黄金决明子12 小时前
Vue3 + Vite 打包后打开空白?
前端
张龙68712 小时前
终端效率翻倍实战:fzf + zoxide + ripgrep + bat 组合拳,告别重复敲命令
前端
宿67412 小时前
vue3-env环境
前端·vue.js
蔬菜_12 小时前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list
汉堡大王952712 小时前
Vue 3 + TS + Element Plus 实战:如何从零搭建企业级违章记录管理 SaaS 前端
前端·javascript·vue.js