大家对openid都或多或少有些了解,在小程序里openid是,通过前端获取code传给后端,而在公众号里,前端没有传code的接口,这就导致了,code必须后端自己取出来,我让前端循环访问的的wucode的接口,如果没有code就继续执行微信的而链接去换取code,如果有code就把code换取openid,头像和昵称;如果有code就执行youcode接口,这是后端判断的
public function wucode($user_token = '',$yq_openid =''){
if(!empty($yq_openid)){
Session::set('yq_openid',$yq_openid);
}
if(empty($user_token)){
$user_token = Session::get('user_token');
if(empty($user_token)){
$user_token=time().rand(100000,999999);
}
}
$user_data = Db::table('xc_member')->where(['user_token'=>$user_token])->find();
//$yq_openid = Session::get('yq_openid');
if(!empty($user_data) && empty($yq_openid)){
return json(['code'=>1000,'data'=>$user_data['uid'],'msg'=>'openid获取成功']);
}elseif(!empty($user_data) && !empty($yq_openid)){
$this->redirect('http://yfj.sharexwd.top/dist');
}else{
Session::set('user_token',$user_token);
$wechat = Config::get('wechat');
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize';
$url .= '?appid=' . $wechat['appid'];
$url .= '&redirect_uri=' . urlencode('http://yfj.sharexwd.top/index/login/youcode');
$url .= '&response_type=code';
$url .= '&scope=snsapi_userinfo';
$url .= '&state=' . rand(10,99);
$url .= '#wechat_redirect';
$this->redirect($url);
}
}
public function youcode($code = ''){
$wechat = Config::get('wechat');
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token';
$url .= '?appid=' . $wechat['appid'];
$url .= '&secret=' . $wechat['appsecret'];
$url .= '&code=' . $code;
$url .= '&grant_type=authorization_code';
$result = file_get_contents($url);
$result = json_decode($result, true);
if (isset($result['errcode'])) {
$this->error('失效的参数,请重新授权');
}
//通过access_token和openid获取用户信息
$url = 'https://api.weixin.qq.com/sns/userinfo';
$url .= '?access_token=' . $result['access_token'];
$url .= '&openid=' . $result['openid'];
$url .= '&lang=zh_CN';
$result = file_get_contents($url);
$result = json_decode($result, true);
if (isset($result['errcode'])) {
$this->error('失效的参数,请重新授权');
}
$data = [
'openid'=>$result['openid'],
'username'=>$result['nickname'],
'headimage'=>$result['headimgurl']
];
$user_token = Session::get('user_token');
//查询对应的openid是否已经有了
$user_data = Db::table('xc_member')->where(['uid'=>$result['openid']])->find();
if($user_data){
Db::table('xc_member')->where(['uid'=>$result['openid']])->update(['user_token'=>$user_token]);
$this->redirect('http://yfj.sharexwd.top/dist');
}else{
$dbi=db('xc_member');
$list=$dbi->insert([
'uid'=>$result['openid'],
'nicheng'=>$result['nickname'],
'touxiang'=>$result['headimgurl'],
'user_token'=>$user_token
]);
//绑定上级
$yq_openid = Session::get('yq_openid');
Session::set('yq_openid',null);
if(!empty($yq_openid)){
//这里写自己的操作
$this->redirect('http://yfj.sharexwd.top/dist');
}
}
前端无限循环访问wucode接口就可以获取所有信息