最终的办理方案是:https://github.com/liuyunzhuge/php_weixin_proxy,具体的先容请往下阅读。
在做项目集成微信登录以及微信付出的时候,都需要举办用户授权。这个授权的流程可以简朴描写为:
1. 用户从我们的应用触发需要授权的操纵,好比点击微信登录;
2. 应用收到这种用户请求后,将用户重定向到微信提供的一个授权页面:
或
3. 用户通过微信扫码(PC端授权,上边左图)可能点击确认按钮(移动端授权,上边右图)奉告微信,授权应用会见本身的微信账号信息;
4. 微信收到用户的授权许可后,生成授权码,并把它作为参数回调至应用的某个页面;
5. 应用的回调页面在吸收到微信的回调请求后,拿到个中的授权码,并通过微信官方提供的access token api接口获取access token;
6. 最后通过access token以及微信官方提供的另一个userinfo api接口就能获取到用户的微信账号信息。
为了实现这个进程,首先要为应用申请一个微信公家号,并将应用最终陈设的域名配置到微信公家号配置内里的授权回调页面域名这个选项内里。微信官方对这个选项的说明如下:
关于网页授权回调域名的说明
1、在微信公家号请求用户网页授权之前,开拓者需要先到公家平台官网中的“开拓 - 接口权限 - 网页处事 - 网页帐号 - 网页授权获取用户根基信息”的设置选项中,修改授权回调域名。请留意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 等协议头;
2、授权回调域名设置类型为全域名,好比需要网页授权的域名为:,设置今后此域名下面的页面 、 都可以举办OAuth2.0鉴权。但 、 、 无法举办OAuth2.0鉴权
3、假如公家号登录授权给了第三方开拓者来举办打点,则不必做任何配置,由第三方取代公家号实现网页授权即可
由此可见,这个法则极其严格。假如说我们的应用最终陈设的时候只有一个域名,那么这种法则不会有什么问题;可是思量到未来应用的巨大性,我们大概在应用设计之初就会对应用做拆分,然后差异的业务回收差异的二级域名来陈设。好比一个带有生意业务的应用,你大概会把登录注册,生意业务打点和通例业务都独立出来,然后回收以下的方法来陈设它们:
陈设通例业务;
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会收到微信的授权回调,并把回调功效(code、state参数)原封不动地再返回给最开始提倡授权的业务。
独一的区别在于,在不利用proxy.your.com的时候,你从应用提倡微信授权的链策应该是这样的:
用了proxy.your.com之后,这个授权链接就应该是这样的:
?appid=xxxxx&redirect_uri=http%3A%2F%2Fpassport.your.com%2Flogin%2Fnotify&response_type=code&scope=snsapi_base&state=584bc87e11ff37492&device=pc
后头这个链接跟上面的比:
1. 后头的链接中的host酿成了proxy.your.com,也就是署理的授权回调域名;
2. 后头的多了一个device参数,这个是须要的。因为微信pc端跟移动端的授权地点是纷歧样的,尔后头的链接是发送个proxy.your.com的,所以需要多加个参数汇报它在转发给授权申请给微信的时候,是用PC端照旧移动端的授权地点。
整体方案思路: