多站点微信公众号网页授权处理
我们经常需要多个站点微信网页授权登录,以前公众号只能设置一个授权域名,现在也只能设置两个,如果是三个、四个改怎么办呢?下面详细介绍解决办法
一、新建站点
需要新建一个站点,专门放授权中间件,其余的站点只需要访问这个站点,就可以获取到微信授权信息,然后在公众号后台—》公众号设置—》功能设置—》网页授权域名,设置中间件的域名。
中间件代码如下:
<?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"]);
}