微信一直都是比较坑的,具体有官方文档补全、文档错误(环境)、域名、目录要求严格等。我也不是专业开发微信,只是做网站要用到微信支付、微信登录注册、微信发消息等,没有什么专业的测试工具,一直是修改一点、上传一点、测试一下,有必要把代码整理一下好提醒自己。
下面的代码意思是
1-检测到在微信中且没登录就获取用户openID
2-获取到openID后查找数据库发现有用户就自动登录
3-数据库中没有用户信息就获取微信用户的信息,包括头像、昵称、头像等,调到注册页面
4-如果不在微信中也没登录就调到登录页面
//检测网页授权
$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
if( preg_match('/micromessenger/', $ua) && empty(session('user'))){
// 公众号的id和secret
$appid = config('wx_appid');
$appsecret = config('wx_appsecret');
$index=url('portal/index/index','',true,true);
$index0= urlencode($index);
if(empty($_GET["code"])){
//开始只获取openid
$scope='snsapi_base';
$url0='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.
'&redirect_uri='.$index0.'&response_type=code&scope='.$scope.'&state=STATE#wechat_redirect';
session('wx',['scope'=>$scope,'url0'=>$url0]);
header("Location: ".$url0);
exit('正在获取微信授权openid');
}
$code = $_GET["code"];
//openid
$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid.
"&secret=".$appsecret."&code=".$code."&grant_type=authorization_code";
$res =zz_curl($url);
//获取到openid就查询用户信息,没有信息需要查询微信信息后注册,有信息到主页
if(empty($res['openid'])){
exit('微信信息获取失败,请退出重试');
}else{
session('wx.openid',$res['openid']);
$user=Db::name('user')->where('openid',$res['openid'])->find();
if(empty($user)){
//需要获取微信信息
$access_token = config('access_token');
$openid = $res['openid'];
$get_user_info_url='https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
//获取到用户信息
$userinfo =zz_curl($get_user_info_url);
if(empty($userinfo['openid'])){
zz_log('user_info授权失败$$access_token'.$access_token);
session('wx',null);
session('redirect',null);
exit('微信授权信息获取失败,请退出重试');
}else{
session('wx',$userinfo);
session('redirect',null);
$this->redirect(url('user/register/register'));
}
}else{
session('user',$user);
$this->redirect($redirect);
}
}
}
//不是在微信中就调到登录页面
if(empty(session('user'))){
$this->redirect(url('user/login/login'));
}else{
$this->redirect(url('user/index/index'));
}