问题:
网页授权域名使用了 “路径指向的web服务器(或虚拟主机)的目录” 方式后,通过将相应的校验文件和公众号网页一起打包,并通过nginx部署至服务器,采用 `域名+Path` 方式指向来获取相应资源,公众号设置上填写正确访问路径目录后,校验通过保存成功。公众号网页打包时配置redirectUri为公众号所设置的网页授权域名的值,出现在访问中,微信授权登录时,出现 “redirect_uri域名与后台设置不一致,错误码10003”
请问这种配置方式下,公众号网页在调用云开发 Web SDK 的cloud.startLogin()方法时,参数所填写的 `redirect_uri` 应该如何填写?
当前配置情况:
公众号-公众号设置-功能设置-网页授权域名(大概格式):sub.testxxx.com/web
公众号网页,调用云开发 Web SDK 的cloud.startLogin(),配置redirect_uri: https://sub.testxxx.com/web
运行公众号网页nginx容器A:
listen 80;
location /__wx__/ {
proxy_pass https://servicewechat.com/wxa-qbase/;
}
location / {
root /usr/share/nginx/html; # 已放置公众号静态网页
index index.html index.htm;
}
公众号静态网页目录
--/usr/share/nginx/html
| -- ...
| -- index.html
| -- MP_verify_xxxxxxx.txt
前置nginx负载均衡,代理域名sub.testxxx.com
{
listen 443;
ssl on;
location ~* "^/web(/|$)(.*)" {
rewrite "(?i)/web(/|$)(.*)" /$2 break;
proxy_pass http://A容器:80;
proxy_redirect off;
}
location ~* "^/__wx__(/|$)(.*)" {
rewrite "(?i)/__wx__(/|$)(.*)" /__wx__/$2 break;
proxy_pass http://A容器:80;
proxy_redirect off;
}
}
测试情况:
curl https://sub.testxxx.com/web/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="./favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<title>公众号网页</title>
<!-- 公众号 JSSDK -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<!-- 云开发 Web SDK -->
<script src="https://res.wx.qq.com/open/js/cloudbase/1.2.0/cloud.js"></script>
<script type="module" crossorigin src="./assets/index.978a9c1f.js"></script>
<link rel="modulepreload" href="./assets/vendor.0f57903d.js">
<link rel="stylesheet" href="./assets/index.4b3c4cd9.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
curl https://sub.testxxx.com/web/MP_verify_xxxxxxx.txt
kJZoNHudBuxxxxxx
curl https://sub.testxxx.com/__wx__/oauth
{"base_resp":{"ret":40097,"errmsg":""}}
上述访问已成功测试获取资源正常,对接 `servicewechat.com` 服务正常。
但在实际微信上尝试使用时,均出现10003错误
请麻烦官方解答一下,在正常使用云开发web SDK时填写redirect_uri与公众号后台的域名字符串后,为何还会出现不一致错误?谢谢
补充:访问url在经过前置nginx中转后,到达服务nginx的路径接收变化情况
https://sub.testxxx.com/web/MP_verify_xxxxxxx.txt 前置nginx
--> http://A容器:80/MP_verify_xxxxxxx.txt 服务nginx
https://sub.testxxx.com/__wx__/oauth 前置nginx
--> http://A容器:80/__wx__/oauth 服务nginx
--> https://servicewechat.com/wxa-qbase/oauth 外部
经过论坛查询相关10003历史提问和相应评论,最后通过部署核实,总结出两种比较正确的配置方式。但前提需要满足一个先决的配置,仅供参考。
先决条件:
其中官方在设置页面上说的多写的这段话,直接忽略,请绕过这句话,因为存在实现不完整。
若填写路径,将文件放置在路径目录下,例如wx.qq.com/mp/MP_verify_kJZoNHudBxxxxxxx.txt),并确保可以访问。
公众号-功能设置-网页授权域名设置:只配置域名,即填写类似 `sub.aaa.bbb.com`,则这样等同于微信官方校验文件访问url等于
https://sub.aaa.bbb.com/MP_verify_kJZoNHudBxxxxxxx.txt
所以保证这个curl能获取到你放置这个校验文件静态服务,例如nginx。
方案一:通过只用域名方式来配置,这个是最简单的方式。
1.公众号静态网页和校验文件打包放置一个目录,然后利用nginx托管静态服务
./dist |--- index.html |--- MP_verify_xxxxxx.txt |--- src/ |---...
# /etc/nginx/conf.d/default.conf server { listen 80; # 为兼容ios14代理微信服务验证 location /__wx__/ { proxy_pass https://servicewechat.com/wxa-qbase/; } # 定向静态网页 location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } }
2.验证并使得公众号功能设置-网页授权域名设置成功
https://sub.aaa.bbb.com/MP_verfiy_xxxx.txt`
https://sub.aaa.bbb.com/__wx__/check_login
方案二:通过只用path方式,然后前置代理nginx重定向至内部的托管静态网页的nginx服务,譬如k8s的ingress和pod配套使用。
1.公众号静态网页和校验文件打包放置一个目录,然后利用nginx托管静态服务
./dist |--- index.html |--- MP_verify_xxxxxx.txt |--- src/ |---...
# /etc/nginx/conf.d/default.conf server { listen 80; # 为兼容ios14代理微信服务验证 location /__wx__/ { proxy_pass https://servicewechat.com/wxa-qbase/; } # 代理公众号网页 location /mpweb/ { proxy_pass http://127.0.0.1:90/; } # 代理其他附带静态文件,例如MP_verfiy验证文件 location / { root http://127.0.0.1:90/; } } server { listen 90; # 定向静态网页 location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } }
2.配置ingress,使得ingress-controller生成相应的nginx配置
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: .... nginx.ingress.kubernetes.io/ssl-redirect: "true" name: mpweb-ingress namespace: namespace-mpweb spec: rules: - host: sub.aaa.bbb.com http: paths: - backend: serviceName: mpweb-svc servicePort: 80 path: /mpweb - backend: serviceName: mpweb-svc servicePort: 80 path: /__wx__ - backend: serviceName: mpweb-svc servicePort: 80 # 根据自己的校验文件 path: /MP_verify_kJZoNHuxxxxx.txt tls: - hosts: - sub.aaa.bbb.com secretName: subaaabbcom-tls-secret
location ~* "^/__wx__" { set $namespace "nampespace-mpweb"; set $ingress_name "mpweb-ingress"; set $service_name "mpweb-svc"; set $service_port "80"; set $location_path "/__wx__"; ...; proxy_pass http://upstream_balancer; } location ~* "^/mpweb" { set $namespace "nampespace-mpweb"; set $ingress_name "mpweb-ingress"; set $service_name "mpweb-svc"; set $service_port "80"; set $location_path "/mpweb"; ...; proxy_pass http://upstream_balancer; } location ~* "^/MP_verify_kJZoNHxxxxxxxx.txt" { set $namespace "nampespace-mpweb"; set $ingress_name "mpweb-ingress"; set $service_name "mpweb-svc"; set $service_port "80"; set $location_path "/MP_verify_kJZoNHxxxxxxxx.txt"; ...; proxy_pass http://upstream_balancer; }
3.以上内容相当于起到定向且直通内部服务
# 校验文件 ingress层 https://sub.aaa.bbb.com/MP_verify_kJZoNHxxxxxxxx.txt svc层 http://nampespace-mpweb-mpweb-svc-80/MP_verify_kJZoNHxxxxxxxx.txt pod层 http://mpweb-pod:80/MP_verify_kJZoNHxxxxxxxx.txt 内部 http://127.0.0.1:90/MP_verify_kJZoNHxxxxxxxx.txt # 访问servicewechat ingress层 https://sub.aaa.bbb.com/__wx__/check_login svc层 http://nampespace-mpweb-mpweb-svc-80/__wx__/check_login pod层 http://mpweb-pod:80/__wx__/check_login 内部 https://servicewechat.com/wxa-qbase/check_login # 访问静态网页 ingress层 https://sub.aaa.bbb.com/mpweb/#/ svc层 http://nampespace-mpweb-mpweb-svc-80/mpweb/#/ pod层 http://mpweb-pod:80/mpweb/#/ 内部 http://127.0.0.1:90/#/
4.验证并使得公众号功能设置-网页授权域名设置成功
https://sub.aaa.bbb.com/MP_verfiy_xxxx.txt`
https://sub.aaa.bbb.com/__wx__/check_login
总结:
1.对于第二种解决方案,主要是方便把服务托管至已经有的域名体系下,通过path来重定位内部托管的公众号静态服务,又因为微信官方的所谓“文档”和“友好”,需要另外对于校验文件的url和servicewechat的访问在前置nginx上再做具体path的rewrite,才能解决一直出现在微信app上的 `redirect_uri与后台配置域名不一致` 错误。
2.对于微信云开发SDK中,cloud.startLogin() 中的redirect_uri填写问题,根据采取的部署方案来填写
# 采用方案一的方式填写 https://sub.aaa.bbb.com # 采取方案二的方式填写 https://sub.aaa.bbb.com/mpweb
从中也间接说明SDK的redirect_uri的相应填写,是根据自己部署静态网页服务后,所定的url的path来确定。
3.至于为什么公众号上网页授权域名设置上,只使用域名来填写是正确的,而不使用带路径的方式,但官方又说明了可以使用路径方式,那就不清楚了。