·设为首页收藏本站📧邮箱修改🎁免费下载专区🔐设置/修改密码👽群雄群聊
返回列表 发布新帖

Discuz!论坛解决微信公众号网页授权域名只能填写一个的问题

462 0
发表于 2020-8-28 14:06:03 | 显示全部楼层 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Discuz!论坛解决微信公众号网页授权域名只能填写一个的问题借权网页授权域名的问题解决方案:
在discuz建站中,必不可少的都会涉及到微信网页授权,来获取用户信息的功能。想要实现公众号通过微信网页授权机制,来获取用户基本信息,必须先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,填写授权回调域名。但是呢,在微信公众号后台,业务域名和JS安全域名都可以填写3个,唯独网页授权域名只能填写一个
Discuz!论坛解决微信公众号网页授权域名只能填写一个的问题 论坛,解决,微信,公众,网页
现在我只有一个公众号,由于业务需要,我在不同的场景下不同的域名都使用这个公众号,而且都需要获取用户信息。但是网页授权域名只能填写一个,并且只有回调地址的域名与该设置完全相同,才能成功发起微信授权,否则就会提示rediret_uri参数错误。

那么,就来讲讲怎么突破这个限制,实现多个域名使用一个公众号同时发起网页授权获取到用户基本信息。

它只能填写一个授权域名,那我们就从这一个域名下手,既然这个授权域名可以顺利拿到网页请求的数据,那我们其他的域名可以先去请求授权域名,然后让授权域名再去微信服务器请求数据,这样就完美解决了。这个授权域名,起到了类似于中介和代理人的作用。实现方法如下:
1.在公众号后台设置一个授权回调页面域名,比如叫:wx.agency.com,我们可以称其为代理域名。
2.在wx.agency.com指向的网站根目录下部署一个index.php文件。

工作原理如下:
(1)当你的其他域名需要发起微信授权时,将授权请求先发到代理域名wx.agency.com,然后wx.agency.com会把这个请求转发到微信服务器;
(2)当用户同意授权后,wx.agency.com会收到微信的授权回调,并把回调结果(code、state参数)原封不动地再返回给最开始发起授权的域名。

代码实现:
之前有写过微信网页授权获取用户基本信息,那是常规方法授权获取用户信息,代码如下:

  1. public function _userInfoAuth($redirect_url){
  2.        
  3.         //1.准备scope为snsapi_userInfo网页授权页面
  4.         $redirecturl = urlencode($redirect_url);
  5.         $snsapi_userInfo_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$this->_appid.'&redirect_uri='.$redirecturl.'&response_type=code&scope=snsapi_userinfo&state=YQJ#wechat_redirect';
  6.        
  7.         //2.用户手动同意授权,同意之后,获取code
  8.         //页面跳转至redirect_uri/?code=CODE&state=STATE
  9.         $code = $_GET['code'];
  10.         if( !isset($code) ){
  11.                 header('Location:'.$snsapi_userInfo_url);
  12.         }
  13.        
  14.         //3.通过code换取网页授权access_token
  15.         $curl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->_appid.'&secret='.$this->_appsecret.'&code='.$code.'&grant_type=authorization_code';
  16.         $content = $this->_request($curl);
  17.         $result = json_decode($content);
  18.        
  19.         //4.通过access_token和openid拉取用户信息
  20.         $webAccess_token = $result->access_token;
  21.         $openid = $result->openid;
  22.         $userInfourl = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$webAccess_token.'&openid='.$openid.'&lang=zh_CN ';
  23.        
  24.         $recontent = $this->_request($userInfourl);
  25.         $userInfo = json_decode($recontent,true);
  26.         return $userInfo;
  27. }
复制代码


这次获取用户信息的代码如下:

  1. //第三方代理服务器授权登录
  2. public function agencyInfoAuth($redirect_url){
  3.        
  4.         //1.准备scope为snsapi_userInfo网页授权页面
  5.         $redirecturl = urlencode($redirect_url);
  6.         $snsapi_userInfo_url = 'http://wx.agency.com/index.php?appid='.$this->_appid.'&redirect_uri='.$redirecturl.'&response_type=code&scope=snsapi_userinfo&state=YQJ#wechat_redirect';
  7.        
  8.         //2.用户手动同意授权,同意之后,获取code
  9.         //页面跳转至redirect_uri/?code=CODE&state=STATE
  10.         $code = $_GET['code'];
  11.         if( !isset($code) ){
  12.                 header('Location:'.$snsapi_userInfo_url);
  13.         }
  14.        
  15.         //3.通过code换取网页授权access_token
  16.         $curl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->_appid.'&secret='.$this->_appsecret.'&code='.$code.'&grant_type=authorization_code';
  17.         $content = $this->_request($curl);
  18.         $result = json_decode($content);
  19.        
  20.         //4.通过access_token和openid拉取用户信息
  21.         $webAccess_token = $result->access_token;
  22.         $openid = $result->openid;
  23.         $userInfourl = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$webAccess_token.'&openid='.$openid.'&lang=zh_CN ';
  24.        
  25.         $recontent = $this->_request($userInfourl);
  26.         $userInfo = json_decode($recontent,true);
  27.         return $userInfo;
  28. }
复制代码



可以看到两种方法唯一的区别就在第一步准备scope为snsapi_userInfo网页授权页面链接不同,一个是去open.weixin.qq.com请求数据,另一个是去wx.agency.com请求数据。

这个方案我亲测有效,虽然增加了一次重定向操作,但实际上不会对用户体验产生多大的影响,真实解决了公众号网页授权域名只能填写一个的问题。


我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图

您的IP:3.143.168.172,1.71.157.54,GMT+8, 2024-4-24 08:50 , Processed in 0.167880 second(s), 69 queries , Gzip On, Redis On.

Based on Discuz! W1.0 Licensed

© 2001-2024 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表