微信授权登录配置说明
微信授权登录配置说明(含错误 10039 与回调域名)
〇、扫描公司二维码进入手机版出现 10039(典型场景)
现象:在 PC 公司详情页用「扫描公司二维码进入公司手机版」,用微信扫码打开后出现微信授权错误 10039。
原因简述:
扫码后打开的是「手机版公司页」(如 /wap/shop/detail/shop_id/273)。若后台开启了「微信自动登录」,未登录用户会被立即跳转到微信授权页。此时请求里带上的 redirect_uri 必须与公众号后台配置的「网页授权域名」完全一致(协议+域名),否则微信会报 10039。
本系统实际流程:
- 公司二维码内容 = 后台站点 URL(或当前访问域名) +
/wap/shop/detail/shop_id/xxx(见themes/default/Home/shop/shop_footer.html)。 - 用户在微信内打开该链接 → 进入 Wap 模块 →
CommonAction判断:在微信内 + 未登录 + 开启微信自动登录 → 马上 302 到微信授权页。 - 授权页中的 redirect_uri = 本系统使用的「站点根地址」+
/wap/passport/wxstart(即授权成功后微信会跳回这个地址)。 - 该「站点根地址」来自:后台「站点设置」里的「站点 URL」(
site.host)。若此处未填或填错,拼出来的 redirect_uri 就会与公众号「网页授权域名」不一致 → 10039。
常见不匹配情况:
| 情况 | 结果 |
|---|---|
| 后台「站点 URL」未配置或为空 | redirect_uri 会变成相对路径或错误地址 → 10039 |
后台填 http://www.xxx.com,公众号只配置了 https://www.xxx.com | 协议不一致 → 10039 |
后台填 https://www.xxx.com,公众号只配置了 xxx.com(无 www) | 域名不一致 → 10039 |
二维码用 m.xxx.com 打开,但后台站点 URL 是 www.xxx.com 且公众号只加了 www.xxx.com | 若后台未配置 host 则已改为用「当前请求域名」,与扫码入口一致,可避免 10039 |
已做代码逻辑:
当后台「站点 URL」为空或非法时,redirect_uri 的域名改为当前请求的协议+域名(即用户扫码打开的域名),这样与「扫描公司二维码」入口一致,只要把该域名配置到公众号「网页授权域名」即可。
你需要做的:
- 登录后台 → 设置 → 站点设置 → 将 「站点 URL」 填为与对外访问一致的地址(如
https://www.你的域名.com),且与公众号「网页授权域名」一致(协议+域名)。 - 登录微信公众平台 → 公众号设置 → 功能设置 → 网页授权域名 → 填仅域名(如
www.你的域名.com),与站点 URL 的域名部分一致。 - 清缓存后,再次用微信扫描公司二维码测试。
一、错误 10039:redirect_uri 配置不匹配
原因:授权成功后跳转的地址(redirect_uri)与微信后台配置不一致。
微信校验非常严格:协议、域名、路径任一项不一致都会报错。
快速排查清单(可直接复制核对)
| 检查项 | 正确示例 | 错误示例 |
|---|---|---|
| 协议 | 与站点一致(建议 https://) | 站点是 https 却填 http |
| 域名 | www.example.com | example.com(少 www)或反过来 |
| 端口 | 443(默认不写) | 带 :8080 等非 443 端口 |
| 路径 | 与代码中完全一致 | 多/少一层路径或拼写错误 |
本系统实际使用的回调地址
- 自动跳转登录(微信内打开 H5):
你的站点域名+/wap/passport/wxstart.html(或无 .html,以实际 URL 为准) - 手动点击「微信登录」:
你的站点域名+/wap/passport/wxcallback.html
务必在微信后台配置的「网页授权域名」与上述地址的域名部分一致(只填域名,不填协议和路径)。
二、如何查看 / 配置「授权回调域名」
1. 微信公众号(本系统使用的是公众号网页授权)
- 登录 微信公众平台
- 设置与开发 → 公众号设置 → 功能设置
- 找到 「网页授权域名」
- 点击「设置」,填写仅域名(如
www.yoursite.com),不要写http://、路径或端口 - 按提示上传验证文件到网站根目录,保存后约 5–10 分钟生效
说明:这里配置的是「授权回调域名」。授权时 redirect_uri 可以是该域名下的任意路径(如 /wap/passport/wxcallback),只要域名在列表中即可。
2. 微信开放平台(网站应用,若你用的是开放平台)
- 登录 微信开放平台
- 管理中心 → 网站应用 → 进入对应应用
- 开发信息 里有一项 「授权回调域」(或类似名称)
- 填写仅域名(如
www.yoursite.com),保存后等待几分钟生效
区别:
- 公众号:用于微信内 H5、服务号网页授权(本系统当前方式)。
- 开放平台网站应用:用于 PC 网站「微信扫码登录」等。
若你是微信内打开页面登录,重点核对公众号的网页授权域名。
三、除 10039 外常见错误码
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 10039 | redirect_uri 与后台配置不一致 | 按上文核对协议、域名、路径 |
| 40013 | appid 无效 | 检查公众号/开放平台 appid 是否填错、是否属于当前应用 |
| 40029 | 不合法的 oauth_code(code 无效/已用) | code 只能用一次,不能重复用;重新发起授权 |
| 41008 | 缺少 oauth code | 确保回调页能收到微信带上的 code 参数 |
| 42003 | oauth_code 已超时(约 5 分钟) | 重新授权获取新 code |
| 40125 | 无效的 appsecret | 检查公众号/开放平台 appsecret 是否正确、是否重置过 |
四、微信公众号「网页授权获取用户基本信息」流程
- 引导用户打开授权页
后端生成链接并 302 跳转:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
- 用户在微信内同意授权
微信会重定向到你的 redirect_uri,并在 URL 上带上 code 和 state。
- 后端用 code 换 access_token
请求:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
得到 access_token 和 openid。
- (可选)拉取用户信息
若 scope 为 snsapi_userinfo,再请求:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
得到昵称、头像等(部分字段可能不再返回,以当前文档为准)。
注意:
- 回调地址必须 HTTPS(正式环境)。
- code 只能用一次,换完 token 即失效。
- 修改公众号/开放平台配置后,一般 5–10 分钟 生效再测。
- 本地测试(localhost)需用内网穿透,并把穿透后的域名配置到微信后台。
五、本系统后台需核对项
- 站点设置中的「站点 URL / host」:建议与对外访问的域名、协议一致(如
https://www.yoursite.com),否则__HOST__拼出的 redirect_uri 会与微信里填的域名不一致。 - 微信配置中的 APPID、appsecret:必须与当前使用的公众号一致。
配置好后,可在后台「微信配置」页查看当前用于授权的域名提示,与公众号「网页授权域名」保持一致即可避免 10039。
