微信网页授权域名限制解决方案:统一/代理授权服务入口设计
背景问题
微信公众平台的网页授权功能要求开发者最多只能配置 两个授权回调域名,但在实际开发中,我们可能面临:
- 多业务系统:多个业务系统(如商城、活动页、客服系统)需要独立的域名。
- 多环境需求:测试环境、预发布环境、生产环境需要不同的域名。
- 上线限制:频繁修改授权域名会影响线上业务稳定性。
如何用一个域名支持多业务系统和多环境?本文将介绍 统一授权入口 的设计方案,并给出完整实现流程和代码示例。
解决方案:统一授权入口
通过一个 中间授权服务 统一处理所有微信授权请求,再将用户重定向到实际业务系统。
流程图说明
- 用户访问业务系统:业务系统生成授权链接,跳转到统一授权入口。
- 统一授权服务请求微信授权:携带业务系统的回调地址。
- 微信返回授权Code:用户授权后,微信将Code回调到统一授权服务。
- 统一服务换取用户信息:使用Code获取OpenID和用户信息。
- 重定向到业务系统:携带用户信息跳转回业务系统的实际页面。
实现步骤
1. 配置统一授权域名
在微信公众平台后台配置 一个统一的授权域名,例如:
https://auth.yourcompany.com
2. 开发统一授权服务(后端)
核心逻辑:接收微信回调的 code
,换取用户信息,并重定向到业务系统。
使用 Spring Boot + WxJava 实现:
代码示例
@RestController
public class AuthController {
@Autowired
private WxMpService wxMpService;
// 生成授权链接(供业务系统调用)
@GetMapping("/generate-auth-url")
public String generateAuthUrl(@RequestParam String targetUrl) {
String redirectUri = "https://auth.yourcompany.com/auth/callback";
String state = UUID.randomUUID().toString() + "|" + targetUrl; // 将业务回调地址嵌入state
String authUrl = wxMpService.getOAuth2Service().buildAuthorizationUrl(
redirectUri,
"snsapi_userinfo",
state
);
return authUrl;
}
// 处理微信回调
@GetMapping("/auth/callback")
public void authCallback(
@RequestParam("code") String code,
@RequestParam("state") String state,
HttpServletResponse response) throws IOException {
// 解析state中的业务回调地址
String[] stateParts = state.split("\\|");
String targetUrl = stateParts[1];
try {
// 换取用户信息
WxMpOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(code);
WxMpUser user = wxMpService.getOAuth2Service().getUserInfo(accessToken, null);
// 构造重定向URL,携带用户信息
String redirectUrl = targetUrl +
"?openid=" + user.getOpenId() +
"&nickname=" + URLEncoder.encode(user.getNickname(), "UTF-8");
response.sendRedirect(redirectUrl);
} catch (WxErrorException e) {
response.sendRedirect(targetUrl + "?error=auth_failed");
}
}
}
3. 业务系统对接(前端)
业务系统在需要授权时,请求统一服务生成授权链接,并跳转。
前端代码示例
// 业务系统页面逻辑
function requestWechatAuth() {
const targetUrl = encodeURIComponent('https://your-business.com/user-center');
const authUrl = `https://auth.yourcompany.com/generate-auth-url?targetUrl=${targetUrl}`;
// 跳转到微信授权页
window.location.href = authUrl;
}
关键设计点
1. 动态传递目标地址
- 通过
state
参数传递业务系统的回调地址,格式为随机数|目标URL
,防止CSRF攻击。 - 微信回调时会原样返回
state
,从中解析出目标地址。
2. 用户信息传递
- 统一服务获取用户信息后,通过 URL参数 或 服务端Session 传递给业务系统。
- 敏感信息(如OpenID)建议加密传输。
3. 多环境支持
- 测试环境:使用子域名
https://auth-test.yourcompany.com
。 - 生产环境:使用
https://auth.yourcompany.com
。 - 通过环境变量动态配置域名,无需修改代码。
注意事项
- HTTPS强制要求:微信要求回调地址必须为HTTPS。
- 防CSRF攻击:
state
参数需包含随机数和业务地址,并在服务端校验。 - Token安全:
access_token
和refresh_token
必须存储在服务端,禁止暴露给前端。 - 错误处理:授权失败时需友好提示,并支持重试。
总结
通过统一授权入口方案,只需 一个微信授权域名 即可支持:
- ✅ 多业务系统:商城、活动页、客服系统等。
- ✅ 多环境:测试、预发布、生产环境。
- ✅ 灵活扩展:新增业务系统无需修改微信配置。
优势:集中管理授权逻辑,降低维护成本,提高系统安全性。
适用场景:中大型项目、多团队协作开发、复杂业务矩阵。
附录