我第一次在本地对接微信扫码登录时,卡了很久。页面上的二维码能弹出来,用手机扫码、确认授权,电脑浏览器却一直报“连接不安全”;后来换到局域网 IP,又报“redirect_uri 参数错误”。当时一直以为是微信接口的问题,折腾一圈才发现,根子在于本地开发环境还停在 HTTP,而微信授权登录的回调链路对 HTTPS、域名、端口有一套非常“轴”的要求。这篇内容就把这个问题的完整解法拆开讲——为什么微信登录非要 HTTPS、本地开发环境怎么把服务切成 HTTPS、以及最后那段 code 回跳到底该怎么处理。适合正在接微信公众号网页授权、开放平台扫码登录,又被本地环境拦住去路的同学参考。
1. 微信登录对 HTTPS 和域名的要求,比你想的更严格
1.1 两种最常见的微信登录方式,回调约束完全不同
这里先得区分一下“微信登录”这个词。我们日常对接时,它至少意味着两套完全不同的东西:
| 场景 | 接口归属 | 触发终端 | 用户交互 |
|---|---|---|---|
| PC 网站扫码登录 | 微信开放平台“网站应用” | 电脑浏览器 | 显示二维码,手机扫码确认 |
| 公众号内 H5 网页授权 | 微信公众平台“网页授权” | 手机微信内置浏览器 | 自动跳转微信授权页,用户点同意 |
这两套在开发上有共性,也都走 OAuth2.0,但回调约束不一样。PC 扫码登录的二维码在电脑上,授权完成后的跳转目标是你在开放平台后台填好的“授权回调域”。公众号网页授权则是用户在微信里点开你的 H5 页面,页面引导到微信授权地址,同意后微信再跳回你的页面。
真正让本地开发同学头疼的点在于:不管是哪一套,微信服务器在用户授权后都会发起一次 HTTP 302 跳转,把浏览器或者内嵌 WebView 带到你配置的回调地址上。而这个回调地址,微信要求“必须是一个能公开访问的域名”。这不是建议,是校验规则。
1.2 本地 http://localhost 为什么过不了微信授权回调
很多人第一次写微信登录时,会想当然地把回调地址填成:
code复制http://localhost:8080/wechat/callback
然后在微信后台配置授权回调域时发现根本填不进去。原因主要有三:
第一,微信开放平台和公众平台在校验授权回调域时,不允许填写 IP 地址,也不允许带端口。localhost 本质上是一个需要特殊解析的主机名,更不可能通过。
第二,微信要求这个域名必须是公网可解析的。哪怕你硬把 localhost 填进去,微信服务器去请求回调地址时,它解析到的 localhost 是微信服务器自己,而不是你的电脑。
第三,绝大多数微信平台接口都要求 HTTPS。公开文档里写得很清楚,调用微信 API 的服务器请求必须走 HTTPS。而回调地址这一环,如果配置的是 HTTP,在微信内置浏览器里大概率会出现拦截或异常,尤其是 iOS 的 WKWebView 对 HTTP 明文页面的限制越来越严格。
这三点叠加,让“本地开发环境跑微信登录”变成一个看起来简单、实际很绕的问题。
1.3 HTTPS 只是第一步,域名和公网可达才是隐藏关卡
即使你解决了 HTTPS,前面还有域名和公网可达两个关卡。
我在好几家公司看到同一个错误:本
