公司只有一个有网页授权的微信服务号,需要开发多个业务,多个业务跨域名,却都需要用到微信授权登录,而微信上的回调域名只能设置一个,这种问题该如何解决呢?我们来详细讲解一下。
应用场景A:
为了使用微信登录,在微信开放平台建一个网站应用,设置对应的授权回调 www.abc.com
,然后网站改版,上新域名 new.abc.com
,改版过渡期内,新版网站和旧版网站同时存在,都需要微信登录,不希望为了新版二级域名重新建一个网站,到时候旧版下线的时候是需要直接 301
要主域名的。
应用场景B
一个微信公众号,开发了一套需要授权的投票H5,用的是 vote.abc.com
,对应的公众号网页授权回调地址用的就是这个域名了,然后需要开发一条完全不相干的比如某某H5游戏,需要部署在 game.abc.com
,同样需要微信登录授权,这时候不会因为公众号的回调域名只能有一个回调域而选择重新注册认证一个微信号吧?
所以由于微信三方登录回调域名只能设置一个导致的问题,我们需要一个解决方案。我们先来看下微信授权中转分发实现过程。
微信授权转发原理:
准备工作
这个原理很简单,假定我们在微信网页授权上设置的回调域名为 www.abc.com
,需要请求授权的页面是域名A、域名B。
预先约定一个参数来指定需要请求授权的域名,假设参数为 url_str
。然后在配置中约定:
$config = [
'demo1' => 'http://game.abc.com/weixin_callback.php', // 域名A
'demo2' => 'https://beltxman.com', // 域名B
];
在 www.abc.com
域名下写一个中转程序,读入配置项,可以开始向中转程序发送授权请求了。
假设授权请求地址为 http://www.abc.com/oauth
。
流程实现
参考上面的流程图
- 域名A发送授权code请求,请求的链接是
http://www.abc.com/oauth?url_str=demo1
; - 中转程序接受到请求后,将请求转发想微信获取code的接口,并将
url_str=demo1
参数拼接在回调地址后面并加上特征码参数例如’weixin_code=yes’,向微信发送code请求里面的回调地址redirect_uri
就是http://www.abc.com/oauth?url_str=demo1&weixin_code=yes
,这里需要注意,回调地址需要先urlencode
编码,然后拼接,然后再将所有参数urlencode
编码发送请求。 - 微信服务器接受到请求后,核对回调域名的确是设置的
www.abc.com
,授权code
会被发送到回调地址上,回调链接将会是http://www.abc.com/oauth?url_str=demo1&weixin_code=yes&code=CODE
。 - 中转程序接受到回调,有特征码
weixin_code=yes
可以说明是微信回调,根据另外参数url_str=demo1
读取配置文件中相应的需要授权的地址域名A,将带上回调的code
向域名A发送请求,中转程序向域名A发送的回调将会是http://game.abc.com/weixin_callback.php?code=CODE
; - 业务域名A接受到
code
后就可以向微信服务器换取access_token
,授权过程完成,然后就可以进行其他接口的请求了。
有这样一个授权中转分发程序,无论是哪个域名来请求授权都没有问题了,同时,将微信返回的 access_token
缓存起来,实现统一授权管理,一个统一的 access_token
管理分发功能就具备了,以后开发微信程序就相当方便了。