上个月做了个项目需要微信第三方登录功能,现在抽出时间整理一下分享给你们。

在微信开放平台申请开通微信登录。https://open.weixin.qq.com/

首先要明白微信登录的流程,根据微信登录官方手册整理如下:

获取code -> 使用code换取access_token -> access_token获取snsapi_userinfo

第一步:通过微信登录api获取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

第二步:使用api返回的code值中的appid、appSecret、code去读取用户资料

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_cod

第三步:通过用户的openid实现登录注册

源码分享:

微信登录按钮链接

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

注意修改您在微信开放平台申请的appid和返回链接

Thinkphp控制器源码 

public function login_wx(){
//获取code
$code = $_GET["code"];
// appId与appSecret
$appId = appid;//微信公众号开发的appid
$appSecret = appSecret;//微信公众号开发的appSecret密钥
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=$code&grant_type=authorization_code";
$res = $this->sendRequest($url);
//var_dump($res);
$access_token = $res["access_token"];
$openId = $res['openid'];
$getUserInfo = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openId&lang=zh_CN";
//得到用户信息
$user_info = $this->sendRequest($getUserInfo);
$wx_openid = $user_info['openid'];
$members = db('member')->where(array('wx_openid' => $wx_openid))->find();
//这里是查询这个openid是否存在
if($members['wx_openid']){//如果存在 更新目前的会员信息
$date['user_last_login_time']=time();
db('member')->where('user_id',$members['user_id'])->update($date);
$members = db('member')->find($members['user_id']);
$this->success('登录成功','/member');
}else{//如果不存在 添加目前的会员信息
$data['user_name']='wx_'.GetRandStr(6);
$data['wx_openid']=$user_info['openid'];
$data['user_create_time']=time();
$useradd=db('member')->insertGetId($data);
$_data['co_id']=$useradd;
$addmemberCompany=db('member_company')->insert($_data);
if($useradd && $addmemberCompany){
$date['user_last_login_time']=time();
db('member')->where('user_id',$useradd)->update($date);
$this->success('登录成功','/member');
}else{
$this->error('登录失败');
}
}
}
public function sendRequest($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return json_decode($output, true);
}

注意:查询这个openid是否存在里面的方法根据自己实际的数据结构进行操作