这篇文章那个主要写根据我们项目做的一些修改,记录下来。
这功能一般做在user端,首先需要判断下是否微信打开,如果是微信打开,就会走微信的授权,如果是外部打开,就会走一个登录页面。
在基类里判断,如果是微信打开,就进入到checkValid方法里面
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')!==false){
//是微信打开,后台自动获取信息
$this->checkValid();
}
同时我们写个全局静态变量将sessionid保存起来
protected static $SessionID=0;//sessionID
self::$SessionID=session_id();
然后在该方法里判断,缓存或者session(看你想怎么做了,session好点吧个人觉得)里面有没有存入的用户信息,如果没有就走到授权登录的方法
protected function wx_login(){
$appid = "*************";
$url=urlencode('https://**********/wx_callback');
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$url.'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
header("Location:".$url);
}
授权成功,微信会访问你填写的回调网址,然后带上code参数
public function wx_callback(){
$appid = "*******";
$secret = "********";
$code = $_GET["code"];
//通过code换取网页授权access_token还有openid
$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code';
$res=curl($get_token_url);
$json_obj = json_decode($res, true);
//这里做token缓存
$redis = Cache::store("redis")->handler();
$redis->set('wechat_'.$json_obj['openid'],$json_obj['access_token'],$json_obj['expires_in']);
//根据openid和access_token查询用户信息
$access_token = $json_obj['access_token'];
$openid = $json_obj['openid'];
//获取用户信息接口
$get_user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
$res=curl($get_user_info_url);
//解析json
$user_obj = json_decode($res, true);
//获得用户信息后 判断是否记录过
$data['user_openid'] = $user_obj['openid'];
$data['user_nickname'] = $user_obj['nickname'];
$data['user_headpic'] = $user_obj['headimgurl'];
$data['user_unionid'] = $user_obj['unionid'];
//$data['sex'] = $user_obj['sex'];
//这里我认为如果判断已经记录过,就更新信息,没有记录过,写入缓存,然后强制进行手机号认证,认证成功后写入user表
$user_data = db('user')->where('user_openid', $user_obj['openid'])->field('user_id,user_mp')->find();
session(self::$SessionID,$data);
if ($user_data){
//跳转loading
return $this->redirect('/user/index/show/loading');
}else
return $this->redirect('/user/index/show/binding');
}
这个方法根据我们的项目做了一定更改,将信息存在了session里面,如果用户信息已经存在于系统(openid能查到)就跳转到loading页面,查不到就跳转到绑定界面。
在绑定界面将用户手机号和微信号进行绑定,绑定成功后写入user表(相当于注册操作),然后跳转到loading页面,loading页面自动访问一个登录接口,这个登录接口读取session,读取数据出来之后后台做一个登录操作,返回所需要的token等数据。
//用于微信的登录,还包含讲user信息创建等功能
public function wechat_login(){
$data=session(self::$SessionID);
if (!array_key_exists('user_id',$data)){
$user=db('user')->field('user_id,user_mp')->where('user_openid',$data['user_openid'])->find();
$data['user_id']=$user['user_id'];
$data['user_mp']=$user['user_mp'];
}
list($access_token,$refresh_token) = TokenManager::createToken($this->Access_Type,$data);
$result=[
'access_token'=>$access_token,
'refresh_token'=>$refresh_token,
'expire_in'=>config('api.expires_in')
];
return $this->jsuccess('',$result);
}
public function binding($mp){
//这里需要判断,有三种情况(目前就想到三种)
//1 微信号已在系统记录过,不需要绑定手机号直接进入界面
//2 微信号没在系统记录过,需要绑定手机号后进入界面
//3 微信号 已在系统记录过,但是绑定的手机号已经绑定了微信,而且和当前微信号不一样
//其中2和3都需要跳转到绑定页面,然后在绑定的后台方法判断
$user = db('user')->where('user_mp', $mp)->find();
$data=session(self::$SessionID);
$datas['user_nickname'] = $data['user_nickname'];
$datas['user_headpic'] = $data['user_headpic'];
$datas['user_openid'] = $data['user_openid'];
$datas['user_unionid'] = $data['user_unionid'];
$datas['user_loginip'] = get_client_ip();
if ($user) {
//判断是否存有openid
//不判断了,直接给他改
db('user')->where('user_id', $user['user_id'])->update($datas);
return $this->jsuccess();
} else {
$datas['user_name'] = $mp;
$datas['user_mp'] = $mp;
$datas['user_createtime'] = time();
db('user')->insert($datas);
return $this->jsuccess();
}
}
0 条评论