这篇文章那个主要写根据我们项目做的一些修改,记录下来。
这功能一般做在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();
    }
}
分类: PHP

发表评论

电子邮件地址不会被公开。 必填项已用*标注