最终的解决方案是: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,因此请勿加 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会收到微信的授权回调,并把回调结果(code、state参数)原封不动地再返回给最开始发起授权的业务。

唯一的区别在于,在不使用proxy.your.com的时候,你从应用发起微信授权的链接应该是这样的: 
https://open.weixin.qq.com/connect/qrconnect?appid=xxxxx&redirect_uri=http%3A%2F%2Fpassport.your.com%2F&response_type=code&scope=snsapi_login&state=584bc87e11ff37492#wechat_redirect 
用了proxy.your.com之后,这个授权链接就应该是这样的: 
http://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端还是移动端的授权地址。

整体方案思路

小结:

这个方案我测试过,是行的通的。虽然说引入了代理服务,增加了一次重定向操作,不过由于这个授权请求并不是所有请求都需要,所以实际上也不会对用户体验产生多大的影响,但是从架构上来说,它的好处很明显,能够配合着应用的拆分逻辑,集成同一个公众号的登录及支付功能,不必为每个子应用都单独申请一个公众号来开发了(这种方式从业务上来说也不合理,一个公司哪需要运营那么多公众号)。

如果您觉得本文对你有用,不妨帮忙点个赞,或者在评论里给我一句赞美,小小成就都是今后继续为大家编写优质文章的动力,流云拜谢! 欢迎您持续关注我的博客:)
作者:流云诸葛
出处:http://www.cnblogs.com/lyzg/
版权所有,欢迎保留原文链接进行转载:)

转载于:https://www.cnblogs.com/kinwing/p/11094994.html

解决微信授权回调页面域名只能设置一个的问题 [php]相关推荐

  1. 关于微信授权回调域名只能设置一个的解决办法

    # GetWeixinCode 解决微信OAuth2.0网页授权只能设置一个回调域名的问题 ## 使用方法 1. 部署`get-weixin-code.html`至你的微信授权回调域名的目录下 2. ...

  2. 网页授权域名需要加html,如何解决微信网页授权回调域名只能设置一个

    问题 在实际的需求中,我们常常遇到多个部署在不同域名下的业务,想使用同一个「微信服务号」进行微信网页授权.但是微信的网页授权只能设置一个回调地址.为了满足业务需求,有人想到给每个业务部门配置一个微信服 ...

  3. 企业微信应用设置可信域名_企业微信应用变更域名,可信域名只能设置一个导致原有推送的模板消息(旧域名)直接提示需使用应用可信域名...

    事故过程: 域名从A变成B后,旧有的推送消息点击直接提示 [redirect_uri需要使用应用可信域名,原有的模板消息推送中带有旧的域名地址A], 而此时,企业微信管理后台该应用的可信域名已经变成了 ...

  4. 微信授权文件放到域名根目录

    在开发微信公众号的时候有个问题.就是 微信回调页面域名授权时将文件放到域名的根目录这个问题.我这里是Windows服务器所以是放到tomcat的上的. 下面就是解决办法了 在tomcat下的confi ...

  5. 解决微信服务号授权域名不够用,微信网页授权回调域名只能设置2个的问题!

    前言 最近在做微信网页项目时,发现服务号授权域名只能有两个,而多个项目都需要用到微信授权获取用户信息,这就导致了域名不够用的问题.如果给每个项目都配一个服务号,这显然是不现实的,不仅需要成本而且很浪费 ...

  6. php微信重复回调,解决微信授权登陆重复回调的问题

    有个问题要记录一下,就是微信授权登录之后重复回调的问题. 微信授权的流程是这样: 1.用户在微信里打开链接A,微信就会携带code和state访问A中的重定向链接B. (用户的微信客户端-->微 ...

  7. ios浏览器微信支付回调页面_微信支付:手机系统自带的浏览器,调用微信支付如何实现(非扫码)...

    如果您是使用浏览器的移动网页进行支付,那就是调用微信H5支付,如果是使用APP客户端进行支付,那就要调用微信APP支付. H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使 ...

  8. ios浏览器微信支付回调页面_iOS集成H5微信支付实现跳转与回调的解决方案

    前言 最近有个需求,不能在iOS客户端内集成支付宝和微信的App支付SDK(为了防苹果审核检测SDK),因此使用H5支付,虽然微信和支付宝的H5支付文档都说不要在App内使用H5支付而是使用App支付 ...

  9. 微信支付回调页面html,微信JSAPI支付成功后获取回调数据

    微信JSAPI公众号支付是素材火群主提供的,支付成功后跳转到订单详情页,里面是微信支付成功后回调的数据,由第三方微信支付平台定时请求获取. 下载资源 下载积分: 780 积分 回调地址notify.p ...

  10. 前后端分离后解决微信授权跨域、微信H5授权登录跨域的问题解决

    前言: 我们之前做的微信授权登录流程是: 1.第一步:用同意授权,并获取code 2.第二步:通过code换取网页授权access_token 3.第三步:刷新access_token(如果需要) 4 ...

最新文章

  1. php定时执行代码漏洞_【漏洞风险提示】Drupal任意PHP代码执行漏洞通告
  2. phpcms v9整合Ueditor
  3. Python中列表索引为的负数时,意义与R不同
  4. 大数据职业理解_到底什么是大数据,大数据职业的具体工作内容是什么?
  5. WinCE切换GPRS
  6. leetcode628. 三个数的最大乘积(简单,我觉得你不会)
  7. vue-cli3.0打包时如何忽略某个第三方依赖包
  8. Netflow的配置方法
  9. Linux 命令(30)—— scp 命令
  10. [转载] python字符串处理函数汇总
  11. 新年礼物 | 今天可以免费领取3980的Hadoop视频教程!
  12. weixin-java-tools工具-微信开发常见问题
  13. java5 离线安装包_ElasticSearch 5.5 离线环境的完整安装及配置详情,附kibana、ik插件配置及安装包下载路径...
  14. Qt 5.7 亮瞎眼的更新
  15. 移动硬盘提示数据错误循环冗余检查的文件恢复方案
  16. 流利阅读2019.1.4 Secrets of the booming beauty business
  17. 国内首家!网易易盾加固第一时间适配Android Q Beta
  18. 消息传递,生产者消费者
  19. 迪米特法则(Low of Demeter)
  20. 购买的域名可以退款吗?域名购买后怎么删除?

热门文章

  1. 【已解决】qlv格式转mp4(腾讯视频)
  2. 企业用免费邮箱哪个好
  3. Linux HaProxy安装/启动/简单配置教程
  4. 计算机动漫游戏与制作,计算机动漫与游戏制作标准规范.doc
  5. 如何解决仓库无线网络覆盖问题?
  6. CodeForces 372A Counting Kangaroos is Fun 动物PK
  7. Millet谷仓,揭秘你所不知道的区块链电商
  8. 免费P2P穿透通信(4) RDT可靠通信模块测试使用
  9. 【学习】可靠数据传输协议 RDT
  10. 自然语言处理工具之 HanLP 鸟瞰