准备工作:
1、微信登录时在微信开放平台(open.weixin.qq.com)上面,注册登录之后,认证开发者资质,在管理中心添加网站应用,相关信息准备齐全,通过审核之后,可以获取到APPID和APPSECERT,然后在应用详情里面查看微信登录接口状态,如果为已获得,表示可以正常开发了。
2、 通过获取用户基本信息接口中的UnionID来区分用户的唯一性,不过需要注意的是:公众号只有在被绑定到微信开放平台帐号下后,才会获取UnionID。只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的。换句话说, 同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。
ps:登录和绑定其实是一套流程,就算绑定,也是操作的snsapi_login的scope接口,就是说,登录是点击扫码获取openid登录,绑定也是点击扫码获取openid绑定。
流程:
1、用户同意授权,获取code
2、通过code获取网页授权access_token
3、刷新access_token
4、拉取用户信息
正式开发:
1、控制器:
这个方法用来触发微信登录请求(用户在网站上点击微信登录跳转的URL)
/*
* Appid在开放平台创建应用后获取的
* redirect_uri是用户在微信端扫码确认登录之后的回调地址
*/
public function wxLogin(){
$appid = $this->appid;
$redirect_uri = urlencode($this->redirect_uri);
$scope = "snsapi_login";
$state = "wxLogin";
$url = "https://open.weixin.qq.com/connect/qrconnect?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=".$scope."&state=".$state."#wechat_redirect";
return redirect($url);
}
这是用户扫码之后从微信的二维码页面会跳转到我们服务器的处理页面,用户扫码登录成功之后会携带code和state参数(通过code参数来获取网页授权access_token,拉取用户信息)
/**
* 微信登录
* @param Request $req
* @return Ambigous <\Illuminate\Routing\Redirector, \Illuminate\Http\RedirectResponse>
*/
public function weixin(Request $req){
$appid=""; //在开放平台创建应用后获取的
$appkey=""; //应用签名
$code=$req->code;//触发微信登录请求接口后返回的code参数
$url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appkey.'&code='.$code.'&grant_type=authorization_code';
$data=file_get_contents($url);
$data=json_decode($data);
$access_token=$data->access_token;
$openid=$data->openid;
$url1='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid;
$call=file_get_contents($url1);
$call=json_decode($call);
//openid存在,直接登录,openid不存在,先注册再登录
$user=User::where(['type'=>User::USER_TYPE_WEIXIN, 'openid'=>$call->unionid])->first();
if ($user) {//当用户存在时直接登录
self::homeLogin($user->id,$user->name);return redirect('/user/index');
}
//获取从微信获取的用户信息
$name=$call->nickname;
$img=$call->headimgurl;
$sex=$call->sex;
$openid=$call->openid;
$unionid = $call->unionid;
$id=User::insertGetId(array(
'name'=>$name,
'nickname'=>$name,
'type'=>User::USER_TYPE_WEIXIN,
'openid'=>$unionid,
'img'=>$img,
));
self::homeLogin($id,$name);
return redirect('/user/index');
}