微信扫码登录失效?Scdn回调地址配置修复指南
昨天排查了个贼典型的问题:用户微信扫码登录突然大面积报错,后台日志狂刷“redirecturi参数错误”。折腾半天发现是Scdn加速域名变更后,微信开放平台回调地址没同步更新。如果你也遇到扫码登录突然抽风,大概率是回调配置的锅。
问题现象:扫码后卡在空白页或报错
用户反馈点击微信登录按钮,扫完码要么白屏,要么直接弹“授权失败”。抓包看到微信压根没把授权码回调到我们服务器。关键报错就这两类:
错误码10003:redirecturi域名未在公众号配置(实际是企业微信应用)
错误码40164:回调地址IP不在白名单(Scdn节点IP被微信拦截)
根因定位:Scdn域名与微信配置脱节
微信开放平台对回调地址有三重验证:
1. 必须HTTPS协议(http直接阻断)
2. 域名完全匹配(多一个字母都不行)
3. 顶级域名备案主体一致(子公司域名要单独配置)
问题出在:我们业务接入了Scdn加速,对外服务域名从api.xxx.com切到了scdn.xxx.xx,但微信后台回调地址还挂着老域名。更坑的是Scdn会自动切换节点IP,新IP没加进微信IP白名单,直接触发40164。
手把手修复:四步搞定回调配置
第一步:确认当前生效域名
在Scdn控制台找到“加速域名”配置,复制CNAME指向的域名(比如scdn.xxx.xx)。重点:别用源站IP,微信只认域名。
第二步:修改微信开放平台配置
登录微信开放平台 → 进入应用 → 开发设置 → 授权回调域。注意:这里填的是根域名!比如回调地址是https://scdn.xxx.xx/auth/callback,只需要填scdn.xxx.xx(不带https和路径)
第三步:追加Scdn节点IP白名单
在微信开放平台 → 基本配置 → 公众号IP白名单(企业微信同理)。把Scdn的全部回源IP段加进去。如果不知道具体IP段,找Scdn厂商要“节点IP地址列表”,通常有txt文件提供。
第四步:检查Nginx路由配置
重点检查location /auth/callback 的路由规则。遇到过有团队配置了rewrite规则把路径截断,导致微信回调时404。建议直接写死:
location = /auth/callback { proxypass http://backendservice; }
避坑指南:这些细节能救急
场景1:本地开发调试报错
微信不允许localhost做回调。解决方案:改hosts把test.xxx.com指向127.0.0.1,然后在微信测试号配置test.xxx.com。记得本地nginx配https证书(可用mkcert自签)
场景2:多环境共用应用
微信回调域最多配三个,不够用?在业务层做域名转发:让微信统一回调到gateway.xxx.com,由网关根据参数路由到具体服务。代码示例:
if (request.path == '/wxcallback') { let env = request.query.env; proxypass http://${env}-service; }
场景3:Scdn开启缓存导致回调失败
/auth/callback 路径必须关闭缓存!在Scdn控制台添加规则:路径完全匹配 /auth/callback → 缓存配置选“不缓存”。否则可能拿到过期的授权code。
验证方案:用curl模拟全流程
别依赖前端页面测试,直接终端操作:
1. 生成扫码链接: curl 'https://api.weixin.xx/connect/qrconnect?appid=YOURAPPID&redirecturi=ENCODEURL(scdn.xxx.xx/callback)&scope=snsapilogin'
2. 手机扫码后,在Scdn访问日志搜“/callback?code=”。看到200状态码且返回了我们的登录页才算通。
3. 如果没日志?上tcpdump抓包: tcpdump -i eth0 host scdn.xxx.xx and port 443 -w wx_callback.pcap
完事后记得把Scdn配置和微信后台截图存档。下次再出问题,先对比这两处有没有被改动过。有团队吃过亏:运维半夜扩容加了新IP,忘更白名单,早上登录直接崩了。
按这个流程处理完,扫码登录基本能秒恢复。核心就一句话:微信回调域、Scdn加速域名、Nginx路由,这三处必须保持字符串完全一致。差个斜杠或者换行符都够你查半天的。