在 src/js/wecom-config.js 中填入你的企业信息:
export const WECOM_CONFIG = {
// 从企业微信管理后台获取
corpId: 'ww1234567890abcdef',
agentId: '1000001',
redirectUri: 'https://your-domain.com/',
apiBaseUrl: '/api'
};
参考 WECOM_OAUTH_GUIDE.md 中的后端实现示例。
在企业微信中打开应用时自动进行授权:
// src/main.js 会自动处理以下流程:
// 1. 检查是否有授权码
// 2. 如果有授权码,交换用户信息
// 3. 如果没有授权码,重定向到授权页面
// 4. 获取用户信息后显示
如果需要在页面中显示授权按钮:
import WeChatOAuth from './js/wechat-oauth.js';
import { WECOM_CONFIG } from './js/wecom-config.js';
const oauth = new WeChatOAuth(WECOM_CONFIG);
const authUrl = oauth.getAuthUrl();
// 创建授权链接
const authLink = document.createElement('a');
authLink.href = authUrl;
authLink.textContent = '点击授权登录';
document.body.appendChild(authLink);
授权成功后,可以通过以下方式获取用户信息:
// 方式 1: 从全局变量访问
const user = window.currentUser;
console.log('用户ID:', user.userid);
console.log('用户名:', user.name);
console.log('手机号:', user.mobile);
// 方式 2: 从 OAuth 实例获取
import WeChatOAuth from './js/wechat-oauth.js';
const oauth = new WeChatOAuth(config);
const userInfo = oauth.getUserInfo();
// 方式 3: 从 sessionStorage 获取
const userInfo = JSON.parse(sessionStorage.getItem('wecom_user_info'));
获取的用户信息包含以下字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| userid | 企业微信用户ID | user123@company |
| name | 用户姓名 | 张三 |
| mobile | 用户手机号 | 13800138000 |
| 用户邮箱 | zhang@company.com | |
| department | 用户部门 | 技术部 |
| position | 用户职位 | 工程师 |
系统会自动生成和验证 state 参数:
// 前端会自动:
// 1. 生成随机 state
// 2. 保存到 sessionStorage
// 3. 在回调时验证 state
// 防止恶意网站冒充授权
错误信息: redirect_uri mismatch
解决方案:
1. 检查 WECOM_CONFIG.redirectUri 是否与企业微信后台配置一致
2. 确保协议、域名、路径都完全匹配(包括末尾 /)
3. 清除浏览器缓存重试
错误信息: 获取用户信息失败
解决方案:
1. 检查后端 /api/wecom/getUserInfo 端点是否正常
2. 验证后端是否获取到了正确的 access_token
3. 查看浏览器控制台的完整错误信息
4. 检查网络标签中的请求/响应
错误信息: 授权码已过期
解决方案:
1. 授权码有效期为 10 分钟
2. 需要在授权后立即交换用户信息
3. 如果超时,需要重新授权
错误信息: invalid secret
解决方案:
1. 确认 Secret 是从应用详情中复制的
2. 不要包含空格或特殊字符
3. 如果已泄露,应在企业微信后台重置
// src/js/app.js 中修改 handleAuthCallback 函数
async function handleAuthCallback(code) {
try {
const userInfo = await oauth.exchangeCodeForUserInfo(code);
// 自定义成功处理逻辑
} catch (error) {
if (error.message.includes('40014')) {
// 处理无效的用户ID
} else if (error.message.includes('40001')) {
// 处理过期的 access_token
}
}
}
// 获取用户信息后同步到业务系统
async function syncUserToBackend(userInfo) {
const response = await apiClient.post('/user/sync', {
userid: userInfo.userid,
name: userInfo.name,
mobile: userInfo.mobile
});
return response;
}
// 检查用户是否有权限访问某功能
async function checkPermission(feature) {
const user = window.currentUser;
const response = await apiClient.get(`/permission/check/${feature}/${user.userid}`);
return response.data.authorized;
}
用户信息已自动缓存到 sessionStorage,刷新页面时会自动恢复。
对于不是立即需要的功能,可以使用延迟加载:
// 只在需要时才加载历史记录
if (oauth.isAuthorized()) {
loadHistory();
}
// 合并多个 API 请求
async function fetchUserData(userId) {
return Promise.all([
apiClient.get(`/user/${userId}`),
apiClient.get(`/user/${userId}/permission`),
apiClient.get(`/user/${userId}/settings`)
]);
}
npm run build
生成的文件在 dist/ 目录中。
配置 Web 服务器处理 SPA 路由:
Nginx:nginx location / { try_files $uri $uri/ /index.html; }
Apache:apache <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule>
企业微信要求使用 HTTPS。使用 Let's Encrypt 配置 SSL:
certbot certonly --standalone -d your-domain.com
如有问题,请:
1. 查看浏览器控制台错误日志
2. 参考企业微信官方文档
3. 检查网络请求(F12 → Network)
4. 查阅本指南的故障排查部分