# 微信网页授权获取 Code 完整教程
## 前言
在开发微信公众号相关的 H5 页面时,获取用户的 OpenID 和 UnionID 是一个常见的需求。本文将详细介绍如何通过微信网页授权获取临时授权 code,以及完整的实现过程。
## 一、微信网页授权流程
### 1.1 完整流程图
```
用户扫码/点击链接
↓
进入 H5 页面
↓
点击"微信授权登录"按钮
↓
跳转到微信授权页面
↓
用户同意授权
↓
微信回调到 redirectUri,并带上 code 参数
↓
后端/前端使用 code 换取 openID 和 unionID
```
### 1.2 关键概念
| 概念 | 说明 |
|------|------|
| **AppID** | 微信公众号的唯一标识 |
| **redirectUri** | 微信授权后的回调地址 |
| **scope** | 授权作用域,决定能获取多少用户信息 |
| **code** | 临时授权凭证,有效期10分钟,只能使用一次 |
| **openID** | 用户在该公众号下的唯一标识 |
| **unionID** | 用户在同一开放平台下的唯一标识 |
## 二、scope 授权作用域
微信公众号支持两种 scope:
| scope | 说明 | 用户感知 |
|-------|------|----------|
| `snsapi_base` | 静默授权 | 自动跳转,用户无感知 |
| `snsapi_userinfo` | 弹窗授权 | 需要用户点击"同意" |
**注意:** `snsapi_login` 是微信开放平台网页应用的 scope,不适用于公众号!
## 三、核心代码实现
### 3.1 配置文件 (config.js)
```javascript
const CONFIG = {
// 微信公众号 AppID
appId: 'wxd47e336a3b9dab83',
// 微信公众号原始ID
publicNo: 'gh_a6f62bf26ae3',
// 微信授权回调地址
redirectUri: 'https://h5.onefind.club/',
// 授权作用域
scope: 'snsapi_userinfo' // 或 snsapi_base
};
```
### 3.2 生成微信授权 URL (utils.js)
```javascript
function getWeixinAuthUrl(appId, redirectUri, scope, state) {
const encodedRedirectUri = encodeURIComponent(redirectUri);
return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${encodedRedirectUri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect`;
}
```
### 3.3 触发授权 (index.html)
```javascript
function startAuth() {
// 生成随机 state
const state = Math.random().toString(36).substr(2);
// 构建微信授权 URL
const authUrl = getWeixinAuthUrl(
CONFIG.appId,
CONFIG.redirectUri,
CONFIG.scope,
state
);
// 跳转到微信授权页面
window.location.href = authUrl;
}
```
### 3.4 接收 code 并显示 (index.html)
```javascript
window.onload = function() {
// 从 URL 参数中获取 code
const code = getUrlParam('code');
if (code) {
// 显示获取到的 code
showCodeDisplay(code);
}
};
function getUrlParam(name) {
const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
const r = window.location.search.substr(1).match(reg);
if (r != null) {
return decodeURIComponent(r[2]);
}
return null;
}
```
## 四、微信公众平台配置
### 4.1 配置位置
**测试号:** https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
**正式公众号:** https://mp.weixin.qq.com/
### 4.2 配置步骤
1. 登录微信公众平台
2. 进入「开发」→「接口权限」→「网页授权」
3. 点击「修改」授权回调域名
### 4.3 填写规则
| 配置项 | 填写内容 | 示例 |
|--------|----------|------|
| 微信公众平台 | 纯域名(不带协议和路径) | `h5.onefind.club` |
| config.js redirectUri | 完整 URL | `https://h5.onefind.club/` |
**重要:** 域名部分必须完全一致!
### 4.4 验证文件
下载验证文件 `MP_verify_xxx.txt`,上传到网站根目录,确保可通过:
```
https://yourdomain.com/MP_verify_xxx.txt
```
访问。
## 五、常见错误及解决方案
### 5.1 redirect_uri 参数错误 (错误码: 10003)
**原因:** 微信公众平台配置的域名与 redirectUri 的域名不一致
**解决方案:**
1. 检查微信公众平台配置的域名
2. 检查 config.js 中的 redirectUri
3. 确保域名部分完全一致
### 5.2 此公众号并没有这些 scope 的权限 (错误码: 10005)
**原因:** 使用了错误的 scope
**解决方案:**
- 将 scope 改为 `snsapi_base` 或 `snsapi_userinfo`
- 检查公众号是否已开通网页授权权限
### 5.3 请在微信中打开
**原因:** 微信网页授权必须在微信内置浏览器中进行
**解决方案:** 用微信扫描二维码打开页面
## 六、调试技巧
### 6.1 使用 vConsole
在微信中无法直接查看控制台,可以添加 vConsole 调试工具:
```html
<head>
<script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
</head>
<body>
<script>
if (typeof VConsole !== 'undefined') {
window.vConsole = new VConsole();
}
</script>
</body>
```
### 6.2 在页面上显示 code
```javascript
function showCodeDisplay(code) {
document.querySelector('.container').innerHTML = `
<h1>获取到 Code</h1>
<div class="code-box">${code}</div>
<button onclick="copyCode('${code}')">复制 Code</button>
`;
}
```
## 七、完整项目结构
```
meih5test/
├── index.html # 授权入口页面
├── callback.html # 微信授权回调页面
├── api-result.html # 接口响应结果页面
├── config.js # 配置文件
├── api.js # API 接口封装
├── utils.js # 工具函数
└── README.md # 使用说明
```
## 八、使用 code 调用后端接口
获取到 code 后,可以调用后端接口换取 openID 和 unionID:
```javascript
async function callGetWeiXinAppOpenId(code) {
const deviceID = localStorage.getItem('deviceID') || 'default-device-id';
const response = await fetch('https://api.onefind.club/interface-server/api/getWeiXinAppOpenId.json', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
applicationID: 'your_applicationID',
siteID: 'your_siteID',
publicNo: 'your_publicNo',
deviceID: deviceID,
js_code: code
})
});
const result = await response.json();
console.log('接口响应:', result);
}
```
## 九、注意事项
1. **code 只能使用一次**,且有效期为 10 分钟
2. **必须使用 HTTPS** 协议(微信要求)
3. **域名必须备案**(国内服务器要求)
4. **redirectUri 的域名必须与微信公众平台配置一致**
5. **微信授权必须在微信内置浏览器中进行**
## 十、参考文档
- [微信网页授权文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html)
- [微信公众平台接口权限说明](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Interface_Privilege_Description.html)
---
**作者:** why
**日期:** 2025-01-27
**版本:** 1.0
微信网页授权获取 Code 完整教程
_
生成一个随机字符串,用作 OAuth 流程中的 state 参数,用于防止 CSRF(跨站请求伪造)攻击。
2026-01-28
前端页面部署到服务器完整教程(Nginx + SSL)
2026-01-27