解决微信授权回拨页面只能设置一个域名的问题
最终的解决方案是:https://github.com/liuyunzhuge/php_weixin_proxy,请阅读详细的介绍。
做项目集成微信登录和微信支付需要用户授权。这个授权过程可以简单地描述为:
1.用户触发需要我们应用授权的操作,比如点击微信登录;
2.收到该用户请求后,应用将用户重定向到微信提供的授权页面:
或者
3.用户通过微信扫码(PC授权,左图上方)或点击确认按钮(移动授权,右图上方)通知微信,授权应用访问自己的微信账号信息;
4.微信收到用户授权许可后,生成授权码,作为参数回调至应用的某个页面;
5.应用回拨页面收到微信回拨请求后,获取授权码,通过微信官方提供的访问令牌api接口获取访问令牌;
6.最后可以通过访问令牌和微信官方提供的另一个userinfo api接口获取用户的微信账号信息。
要实现这个过程,首先要为应用申请一个微信微信官方账号,在微信微信官方账号设置中将应用最终部署的域名设置为授权回拨页面的域名。微信官方对此选项解释如下:
网页授权回调域名描述
1.在微信微信官方账号请求用户网页授权前,开发者需要在公众平台官网“开发-界面权限-网页服务-网页账号-网页授权获取用户基本信息”的配置选项中修改授权回调域名。请注意,这里填写的是域名(字符串),不是URL,所以请不要添加http://等协议头;
2.授权回叫域名的配置规范为全域名。例如,需要网页授权的域名是www.qq.com。配置后,此域名下的页面可以由http://www.qq.com/music.html和http://www.qq.com/login.html.的OAuth2.0进行身份验证。但是,http://pay.qq.com、http://music.qq.com和http://qq.com无法对OAuth2.0进行身份验证
3.如果微信官方账号登录授权给第三方开发者管理,则无需做任何设置,第三方可以更换微信官方账号实现网页授权
因此,这一规则极其严格。如果我们的应用最终部署时只有一个域名,那么这个规则就不会有问题;但是考虑到未来应用的复杂性,我们可能会在应用设计之初就对应用进行拆分,然后用不同的二级域名部署不同的服务。例如,一个具有事务的应用程序,您可以将登录注册、事务管理和常规业务分开,然后通过以下方式部署它们:
Www.your.com部署常规业务;
Trade.your.com部署交易管理业务;
Passport.your.com部署登录注册业务;
在这种模式下,如果微信登录和微信支付一体化,上述回拨页面域名授权规则会给应用带来问题。这里:至少可以确认,trade.your.com和passport.your.com都需要上面介绍的用户微信授权,但是是两个不同的子域,我们只有一个微信官方账号;根据回拨页面的域名授权原则,只能使用一个域名,只有回拨地址的域名与此设置完全一致时,才能成功发起微信授权,否则会提示rediret_uri参数错误或导致无法回拨的问题。
那么如何应对这种情况呢?
目前的解决方案是引入一个新的非常简单的应用程序,作为微信授权的代理服务。您可以这样做:
1.将微信官方账号的网页授权界面域名设置为另一个子域名称,如proxy.your.com;
2.然后将php_weixin_proxy中的index.php部署到proxy.your.com
php_weixin_proxy下的Index.php是一个非常简单的php文件,你可以直接查看源代码来了解它的实现。由于当前的项目环境,我使用php来实现这个代理服务。事实上,你可以使用任何平台语言来完成类似的功能。
当其他服务需要发起微信授权时,会先将授权请求发送到proxy.your.com,然后proxy.your.com再将此请求转发到微信;
用户同意授权后,proxy.your.com会收到微信的授权回拨,并将回拨结果(代码和状态参数)原封不动地返回给当初发起授权的服务。
唯一不同的是,当您不使用proxy.your.com时,您从应用程序启动微信授权的链接应该是这样的:
https://open.weixin.qq.com/connect/qrconnect?appid=
版权声明:解决微信授权回拨页面只能设置一个域名的问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。