核心原理:OAuth 2.0 授权
网站让用户通过微信登录,并不是直接获取用户的微信密码,而是采用一种更安全、更标准的 OAuth 2.0 授权 模式。

整个过程可以理解为一次“委托认证”:
- 你的网站 (客户端) 请求用户登录。
- 你的网站 引导用户跳转到 微信 (授权服务器) 的登录页面。
- 用户 在微信官方页面输入账号密码,确认授权,允许你的网站获取其基本信息(如昵称、头像、OpenID)。
- 微信 将一个临时的授权码 返回给你的网站。
- 你的网站 拿着这个授权码,向微信服务器请求换取一个访问令牌。
- 微信 验证授权码后,返回访问令牌。
- 你的网站 使用访问令牌,向微信服务器请求获取用户的唯一标识 和基本信息。
- 你的网站 拿到这些信息后,在自己的用户系统中创建或匹配一个账户,完成登录。
关键信息:
- OpenID: 用户在你的应用(网站)中的唯一标识,同一个微信用户,在不同网站(公众号、App、小程序)的 OpenID 是不同的。
- UnionID: 如果你的多个应用(如公众号、App、小程序)都绑定在同一个微信开放平台账号下,那么同一个用户在这些应用中的 UnionID 是相同的,它用于打通不同平台下的用户身份。
准备工作:申请微信开发者资质
在开始编码之前,你必须完成以下准备工作,这是所有步骤的基础。
注册微信开放平台账号
- 访问 微信开放平台官网。
- 点击右上角的“立即注册”,选择“账号类型”为 “网站应用”。
- 按照提示完成邮箱验证、身份认证(个人或企业/组织),个人开发者只能申请测试账号,有功能限制;企业认证功能更全,但流程更复杂。
创建网站应用
- 登录你的开放平台后台,进入“管理中心” -> “网站应用” -> “创建应用”。
- 填写应用信息:
- 应用名称: 你的网站名称。
- 应用签名: 网站的域名,
www.yourdomain.com。注意: 这里必须是完整的域名,不能带http://或https://。 - 应用类型: 选择“网站应用”。
- 应用服务类目: 选择一个最符合你网站内容的类目。
- 授权回调域: 这是最关键的一步! 填写用户授权成功后,微信会跳转回来的网址。
https://www.yourdomain.com/auth/wechat/callback。这个域名必须和你网站实际访问的域名完全一致,且必须是https协议。
- 提交审核,审核通过后,你就可以在应用详情页看到你的 AppID (应用ID) 和 AppSecret (应用密钥)。请务必妥善保管 AppSecret,切勿泄露!
具体实现步骤(以 Node.js + Express 为例)
这里提供一个最常见的服务端实现方案,如果你使用的是其他语言(如 Java, PHP, Python),逻辑是完全一样的,只是库和语法不同。

安装依赖
npm install express express-session axios
express: Web 框架express-session: 用于管理用户会话axios: 用于发送 HTTP 请求
编写后端代码
创建一个 server.js 文件:
const express = require('express');
const axios = require('axios');
const session = require('express-session');
const app = express();
const port = 3000;
// 从微信开放平台获取
const APP_ID = '你的AppID';
const APP_SECRET = '你的AppSecret';
const REDIRECT_URI = 'https://www.yourdomain.com/auth/wechat/callback'; // 必须和开放平台配置的一致
// 配置 session
app.use(session({
secret: 'a-very-strong-secret-key', // 用于加密 session ID 的密钥
resave: false,
saveUninitialized: true,
cookie: { secure: true } // 强制使用 HTTPS
}));
// 1. 构造微信登录 URL,并重定向用户
app.get('/auth/wechat', (req, res) => {
const authUrl = `https://open.weixin.qq.com/connect/qrconnect?appid=${APP_ID}&redirect_uri=${encodeURIComponent(REDIRECT_URI)}&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect`;
res.redirect(authUrl);
});
// 2. 处理微信的回调,获取 code
app.get('/auth/wechat/callback', async (req, res) => {
const { code, state } = req.query;
if (!code) {
return res.status(400).send('Authorization failed: No code provided.');
}
try {
// 3. 使用 code 换取 access_token
const tokenUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${APP_ID}&secret=${APP_SECRET}&code=${code}&grant_type=authorization_code`;
const tokenResponse = await axios.get(tokenUrl);
const { access_token, openid } = tokenResponse.data;
// 4. 使用 access_token 获取用户信息
const userInfoUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}`;
const userInfoResponse = await axios.get(userInfoUrl);
const userInfo = userInfoResponse.data; // 包含 nickname, headimgurl 等
// 5. 在你的系统中处理用户信息
// 这里是关键!你需要根据 openid 来查找或创建你的用户。
//
// let user = await User.findOne({ where: { wechat_openid: openid } });
// if (!user) {
// user = await User.create({
// username: userInfo.nickname,
// wechat_openid: openid,
// avatar_url: userInfo.headimgurl
// });
// }
// req.session.userId = user.id; // 将用户ID存入 session
console.log('用户信息:', userInfo);
res.send('微信登录成功!用户信息已在控制台打印,在实际应用中,这里应该重定向到用户主页。');
} catch (error) {
console.error('Error during WeChat login:', error.response ? error.response.data : error.message);
res.status(500).send('登录过程中发生错误。');
}
});
app.listen(port, () => {
console.log(`Server is running at https://localhost:${port}`);
});
前端实现
在你的网站登录/注册页面上,添加一个“微信登录”按钮。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">网站登录</title>
</head>
<body>
<h1>欢迎登录</h1>
<a href="/auth/wechat">
<img src="https://open.weixin.qq.com/zh_CN/htmledition/res/assets/img/wechat_login_btn.png" alt="微信登录" />
</a>
</body>
</html>
测试和上线
-
本地测试:
- 你需要一个能够将
localhost映射到公网域名的工具,ngrok。 - 运行
ngrok http 3000,它会生成一个类似https://xxxx.ngrok.io的临时域名。 - 将这个临时域名 同时配置 到微信开放平台的“授权回调域”中。
- 修改代码中的
REDIRECT_URI为这个临时域名。 - 运行你的服务器,点击微信登录按钮,测试整个流程。
- 你需要一个能够将
-
正式上线:
(图片来源网络,侵删)- 将你的网站部署到支持 HTTPS 的服务器上(如 Nginx + Let's Encrypt)。
- 在微信开放平台后台,将“授权回调域”修改为你正式的、可访问的
https域名。 - 更新代码中的
REDIRECT_URI为正式域名。 - 重新部署你的服务器,即可上线。
重要注意事项和最佳实践
- HTTPS 是必须的: 微信强制要求授权回调域使用
https协议,在开发阶段可以使用自签名证书,但生产环境必须使用权威机构颁发的有效证书。 - AppSecret 保密: 绝对不要将
APP_SECRET写在前端代码中!它必须只存在于你的后端服务器上,用于安全地与微信服务器通信。 - 处理用户信息: 从微信获取的用户信息(如昵称、头像)可能随时更新,你的系统应该提供机制让用户手动更新,或者定期同步。
- Scope 权限: 示例中使用了
snsapi_login,这是静默授权,用户无感知,但获取的信息较少(只有 OpenID),如果你需要获取用户的昵称、头像等,需要引导用户点击“授权”按钮,使用snsapi_userinfo。 - 安全: 使用
state参数来防止 CSRF 攻击,虽然示例中写死了STATE,但实际应用中应该生成一个随机字符串,存在 session 中,与微信返回的state进行比对。
通过以上步骤,你就可以成功地在你的网站上集成微信登录功能了,整个过程的核心在于理解 OAuth 2.0 授权流程,并安全地管理微信的密钥。
