微信小程序鉴权登录详解 —— 基于 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,结合自身业务逻辑完成用户登录,是开发安全小程序的标准流程。理解并掌握该流程,有助于构建完善的用户鉴权体系。

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学1 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端