重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文部分知识来自网络后加工,目前服务号授权域名只有两个,项目一个一个上,后发现域名不够用,在此记录下。
成都一家集口碑和实力的网站建设服务商,拥有专业的企业建站团队和靠谱的建站技术,十年企业及个人网站建设经验 ,为成都数千家客户提供网页设计制作,网站开发,企业网站制作建设等服务,包括成都营销型网站建设,品牌网站制作,同时也为不同行业的客户提供网站建设、网站设计的服务,包括成都电商型网站制作建设,装修行业网站制作建设,传统机械行业网站建设,传统农业行业网站制作建设。在成都做网站,选网站制作建设服务商就选创新互联建站。
项目进行微信开发, 认证了一个微信服务号专门用于内部测试,但是内部可能存在多套不同环境(开发dev、测试sit、预发布uat)等,由于微信限制一个服务号只能配置2个网页授权域名, 又不可能给每个环境单独配一个服务号,这样不仅需要成本而且很浪费资源, 所以重点需要解决下面这个问题:
1、可以自动区分环境。比方部署开发环境。url可能是 ,而在测试环境的时候应该是 。而并且不能写死,否则开发和测试就要换来换去。非常麻烦.
2、总结分享一下思路:
主要是通过中间页面代理获取微信授权CODE,然后跳转到对应需要使用的环境URL下;
比如原来开发环境, 微信中授权域名配置的是dev.xxx点抗 ,那么现在配置的是一个代理域名proxy.xxx点抗 ,通过代理域名拿到code后在跳回dev.xxx点抗 ,如下图所示
中间页的原理
中间页主要做了依次做了两件事情:
解决办法
假设我们有 A.example点抗 、 B.example点抗 、C.example点抗 域名想使用微信授权,我们可以将网页授权域名设置为A.example点抗 。
步骤如下:
设置回调域名。将域名 A.example点抗
微信公众平台-设置-公众号设置-功能设置-网页授权域名
在域名 A.example点抗 添加中间页 get-weixin-code.html
中间页不一定在根域名下。在这里我们放在根域名下。中间页的访问地址如下,
假设域名 B.example点抗 /game需要进行网页授权。我们可以使用下面链接进行授权,获取微信的授权code
;scope=snsapi_basestate=hello-worldredirect_uri=https%3A%2F%2FB.example点抗 %2Fgame
最终会回调到这个地址 ;state=hello-world ,这样就可以拿到授权 code 和 state 参数。
利用授权 code ,请求自己后端服务器,获取微信用户信息。
当下的解决方案是引入一个新的非常简单的应用来作为微信授权的代理服务,可以这么做:
1. 把公众号的网页授权接口域名设置成另外一个子域名,如proxy.your点抗 ;
2. 然后把php_weixin_proxy里面的index.php部署到proxy.your点抗
php_weixin_proxy下的index.php是一个很简单的php文件,你可以直接查看源码了解它的实现方式。因为当前项目的环境,我采用php来完成这个代理服务实现,实际上,你完全可以用任意平台语言来完成类似的功能。
当其它业务需要发起微信授权时,将授权请求先发到proxy.your点抗 ,然后proxy.your点抗 会把这个请求转发到微信;
当用户同意授权后,proxy.your点抗 会收到微信的授权回调,并把回调结果(code、state参数)原封不动地再返回给最开始发起授权的业务。
唯一的区别在于,在不使用proxy.your点抗 的时候,你从应用发起微信授权的链接应该是这样的:
;redirect_uri=http%3A%2F%2Fpassport.your点抗 %2Fresponse_type=codescope=snsapi_loginstate=584bc87e11ff37492#wechat_redirect
用了proxy.your点抗 之后,这个授权链接就应该是这样的:
;redirect_uri=http%3A%2F%2Fpassport.your点抗 %2Flogin%2Fnotifyresponse_type=codescope=snsapi_basestate=584bc87e11ff37492device=pc
后面这个链接跟上面的比:
1. 后面的链接中的host变成了proxy.your点抗 ,也就是代理的授权回调域名;
2. 后面的多了一个device参数,这个是必要的。因为微信pc端跟移动端的授权地址是不一样的,而后面的链接是发送个proxy.your点抗 的,所以需要多加个参数告诉它在转发给授权申请给微信的时候,是用PC端还是移动端的授权地址。
1. 用户从我们的应用触发需要授权的操作,比如点击微信登录;
2. 应用收到这种用户请求后,将用户重定向到微信提供的一个授权页面:
或
3. 用户通过微信扫码(PC端授权,上边左图)或者点击确认按钮(移动端授权,上边右图)告知微信,授权应用访问自己的微信账号信息;
4. 微信收到用户的授权许可后,生成授权码,并把它作为参数回调至应用的某个页面;
5. 应用的回调页面在接收到微信的回调请求后,拿到其中的授权码,并通过微信官方提供的access token api接口获取access token;
6. 最后通过access token以及微信官方提供的另一个userinfo api接口就能获取到用户的微信账号信息。
为了实现这个过程,首先要为应用申请一个微信公众号,并将应用最终部署的域名设置到微信公众号设置里面的授权回调页面域名这个选项里面。微信官方对这个选项的说明如下:
关于网页授权回调域名的说明
1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:,配置以后此域名下面的页面 、 都可以进行OAuth2.0鉴权。但 、 、 无法进行OAuth2.0鉴权
3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
由此可见,这个规则极其严格。如果说我们的应用最终部署的时候只有一个域名,那么这种规则不会有什么问题;但是考虑到将来应用的复杂性,我们可能在应用设计之初就会对应用做拆分,然后不同的业务采用不同的二级域名来部署。比如一个带有交易的应用,你可能会把登录注册,交易管理和常规业务都独立出来,然后采用以下的方式来部署它们:
部署常规业务;
trade.your点抗 部署交易管理的业务;
passport.your点抗 部署登录注册的业务;
在这种模式下,如果集成微信登录和微信支付,前面说的授权回调页面域名的规则就会给应用带来问题。在这里:至少可以确认trade.your点抗 和passport.your点抗 都需要前面的介绍的用户微信授权,但是它们是两个不同的子域名,而且我们只有一个公众号;根据授权回调页面域名的原则,它只能用一个域名,并且只有回调地址的域名与该设置完全相同,才能成功发起微信授权,否则就会提示rediret_uri参数错误或者引发无法回调的问题。
那么这种情况该如何处理?
当下的解决方案是引入一个新的非常简单的应用来作为微信授权的代理服务,可以这么做:
1. 把公众号的网页授权接口域名设置成另外一个子域名,如proxy.your点抗 ;
2. 然后把php_weixin_proxy里面的index.php部署到proxy.your点抗
php_weixin_proxy下的index.php是一个很简单的php文件,你可以直接查看源码了解它的实现方式。因为当前项目的环境,我采用php来完成这个代理服务实现,实际上,你完全可以用任意平台语言来完成类似的功能。
当其它业务需要发起微信授权时,将授权请求先发到proxy.your点抗 ,然后proxy.your点抗 会把这个请求转发到微信;
当用户同意授权后,proxy.your点抗 会收到微信的授权回调,并把回调结果(code、state参数)原封不动地再返回给最开始发起授权的业务。
唯一的区别在于,在不使用proxy.your点抗 的时候,你从应用发起微信授权的链接应该是这样的:
;redirect_uri=http%3A%2F%2Fpassport.your点抗 %2Fresponse_type=codescope=snsapi_loginstate=584bc87e11ff37492#wechat_redirect
用了proxy.your点抗 之后,这个授权链接就应该是这样的:
;redirect_uri=http%3A%2F%2Fpassport.your点抗 %2Flogin%2Fnotifyresponse_type=codescope=snsapi_basestate=584bc87e11ff37492device=pc
后面这个链接跟上面的比:
1. 后面的链接中的host变成了proxy.your点抗 ,也就是代理的授权回调域名;
2. 后面的多了一个device参数,这个是必要的。因为微信pc端跟移动端的授权地址是不一样的,而后面的链接是发送个proxy.your点抗 的,所以需要多加个参数告诉它在转发给授权申请给微信的时候,是用PC端还是移动端的授权地址。
整体方案思路:
小结:
这个方案我测试过,是行的通的。虽然说引入了代理服务,增加了一次重定向操作,不过由于这个授权请求并不是所有请求都需要,所以实际上也不会对用户体验产生多大的影响,但是从架构上来说,它的好处很明显,能够配合着应用的拆分逻辑,集成同一个公众号的登录及支付功能,不必为每个子应用都单独申请一个公众号来开发了(这种方式从业务上来说也不合理,一个公司哪需要运营那么多公众号)。
其次 :微信会立即发送code值和state(你自己设定的字段)到你的redirect_uri中,如: ;state=STATE
2: 拉取用户信息
微信的网页授权回调域名 只能设置一个 ,但是多个业务使用同一个微信公众号授权信息的话,就需要使用者内部进行处理了。我在应用设计之初就会对应用做业务拆分,然后不同的业务采用不同的二级域名来部署。如果每个业务集成微信登录和微信支付,那么就会存在问题。因为根据授权回调页面域名的原则,它只能用一个域名,并且只有回调地址的域名与该设置完全相同,才能成功发起微信授权。
1、打开微信公众平台,输入账号密码登录后台。
2、点击【公众号设置】。
3、点击【功能设置】。

4、找到【网页授权域名】,点击旁边的【设置】。

5、在修改业务域名和JS接口域名时,已经上传过这个文件的话,那么请直接跳过这一步。如果还没上传的,直接点击文件下载,然后上传到服务器。
6、上传成功后,直接输入授权域名,点击【确认】即可。