多站点微信公众号网页授权处理
我们经常需要多个站点微信网页授权登录,以前公众号只能设置一个授权域名,现在也只能设置两个,如果是三个、四个改怎么办呢?下面详细介绍解决办法
一、新建站点
需要新建一个站点,专门放授权中间件,其余的站点只需要访问这个站点,就可以获取到微信授权信息,然后在公众号后台—》公众号设置—》功能设置—》网页授权域名,设置中间件的域名。
中间件代码如下:
<?php if(is_HTTPS()){ $protocol = 'https'; } else { $protocol = 'http'; } if(isset($_GET['device'])){ $device = $_GET['device']; } if(isset($_GET['appid'])){ $appid = $_GET['appid']; } if(isset($_GET['state'])){ $state = $_GET['state']; } if(isset($_GET['redirect_uri'])){ $redirect_uri = $_GET['redirect_uri']; } if(isset($_GET['code'])){ $code = $_GET['code']; } if(isset($_GET['scope'])){ $scope = $_GET['scope']; } if($code == 'test'){ exit; } if(empty($code)){ $authUrl = ''; if($device == 'pc'){ $authUrl = 'https://open.weixin.qq.com/connect/qrconnect'; } else { $authUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize'; } $options = [ $authUrl, '?appid=' . $appid, '&redirect_uri=' . urlencode($protocol . '://' . $_SERVER['HTTP_HOST'] . '/index.php?redirect_uri='.$redirect_uri), // '&redirect_uri=' . urlencode($redirect_uri), '&response_type=code', '&scope=' . $scope, '&state=' . $state, '#wechat_redirect' ]; $domain = getDomain(); //把redirect_uri先写到cookie header(implode('', [ "Set-Cookie: redirect_uri=", urlencode($redirect_uri), "; path=/; domain=", $domain, "; expires=" . gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT", time() + 60), "; Max-Age=" + 60, "; httponly" ])); header('Location: ' . implode('', $options)); }else{ if(isset($redirect_uri)){ $back_url = urldecode($redirect_uri); header('Location: ' . implode('', [ $back_url, strpos($back_url, '?') ? '&' : '?', 'code=' . $code, '&state=' . $state ])); } } function is_HTTPS(){ if(!isset($_SERVER['HTTPS'])) return FALSE; if($_SERVER['HTTPS'] === 1){ //Apache return TRUE; } elseif($_SERVER['HTTPS'] === 'on'){ //IIS return TRUE; } elseif($_SERVER['SERVER_PORT'] == 443){ //其他 return TRUE; } return FALSE; } function getDomain(){ $server_name = $_SERVER['SERVER_NAME']; if(strpos($server_name, 'www.') !== false){ return substr($server_name, 4); } return $server_name; }
二、站点调用中间件(以ThinkPHP5为例)
代码如下:
if(empty(input('code'))){ // 获取传递的参数 $get_var_param = http_build_query(input('get.')); // 授权成功后跳转的地址 $redirecturl = urldecode('http://'.$_SERVER['HTTP_HOST'].'/common/index?'.$get_var_param); // 准备scope为snsapi_userInfo网页授权页面 $snsapi_userInfo_url = 'http://wx.api.laozijk.com?appid='.$_appid.'&redirect_uri='.$redirecturl.'&scope=snsapi_userinfo'; redirect($snsapi_userInfo_url); }else{ // 下面两个方法将在下一篇微信接口扩展中讲到 $weixin = controller('weixin'); // 获取access_token $jsonStr = $weixin->getOauthAccessToken(); // 获取用户信息 $user_info = $weixin->getOauthUserInfo($jsonStr['access_token'],$jsonStr["openid"]); }