您的位置:首页 > 移动开发 > 微信开发

微信扫码登录

2016-08-19 11:26 288 查看
/*
* 红包问卷,扫码登录
* example:问卷链接为http://cc/s/qwer
* 用户点击上述连接,没有$GET['esurvey_token']就跳转到这里
* 跳转到User/esurvey_scan_code,携带2个参数,1个是问卷链接,一个是问卷token=md5(pid.'sunjiuyang'),然后跳转去扫二维码。
* 之后跳转到User/esurvey_scan_code_redirect
*/
public function esurvey_scan_code($esurvey_url,$esurvey_token){
$callback = C('USER_HOST')."/user.php/home/Wechat/esurvey_scan_code_redirect?esurvey_url=".$esurvey_url."&esurvey_token=".$esurvey_token;
$callback = urlencode($callback);

$state  = md5(uniqid(rand(100,999), TRUE)); //-------生成唯一随机串防CSRF攻击
$_SESSION["wx_state"] = $state; //存到SESSION

$wxurl = "https://open.weixin.qq.com/connect/qrconnect?appid=".self::APPID_SITE."&redirect_uri=".$callback."&response_type=code&scope=snsapi_login&state=".$state."#wechat_redirect";

header("Location: $wxurl");
}

/*
* js形式 扫码答问卷
*/
public function esurvey_scan_code_by_js($esurvey_url,$esurvey_token){
$callback = C('USER_HOST')."/user.php/home/Wechat/esurvey_scan_code_redirect?esurvey_url=".$esurvey_url."&esurvey_token=".$esurvey_token;
$callback = urlencode($callback);

$state  = md5(uniqid(rand(100,999), TRUE)); //-------生成唯一随机串防CSRF攻击
$_SESSION["wx_state"] = $state; //存到SESSION

$this->assign('callback',$callback);
$this->assign('state',$state);
$this->display();
}
/*
* 红包问卷 扫码登录回调地址
* 根据get的code参数,拿到openid和unionid
* 若user表中没有unionid,说明是全新的微信用户,add到user表中.
* 若有unionid,则取出user_id值
* 跳转到答题页面,携带参数有2个,一个是uid,一个是esurvey_token
* 答题页面首先验证esurvey_token是否正确,正确则可以答题。
*/
public function esurvey_scan_code_redirect(){

//防CSRF攻击
if ($_GET['state'] != $_SESSION["wx_state"]) {
exit("501");
}
if(!$_GET['code']){
exit("微信回调没有code参数");
}
$esurvey_url = I('get.esurvey_url','','strval');
$esurvey_token = I('get.esurvey_token','','strval');

//调用http方法 得到access_token与openid与unionid
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token';
$para['appid'] = self::APPID_SITE;
$para['secret'] = self::SECRET_SITE;
$para['code'] = $_GET['code'];
$para['grant_type'] = 'authorization_code';
$accessInfo = http($url,$para,$method = 'GET', $header = array(), $multi = false);

//添加到数据库中用来调试
$data['text'] = '扫码得access_token:'.$accessInfo;
$data['time'] = date('Y-m-d H:i:s',time());
M('aaa')->add($data);

$accessInfo = json_decode($accessInfo);
//验证user中是否有unionid
$unionid = $accessInfo->unionid;
if(!$unionid){
$url = base64_decode(base64_decode($esurvey_url));
$this->success('扫码登录失败,请重试',$url);
exit;
}

$userInfo = M('user')->where("unionid = '%s' and status != 2",array($unionid))->find();

if(!$userInfo){ //没有此unionid,新用户。
$data['openid_user'] = $accessInfo->openid;
$data['unionid'] = $accessInfo->unionid;
$data['xcode']= md5(rand(100000,999999));
$data['role_id'] = 1;
$data['status'] = 1;
$data['addtime'] = time();
$data['login_num'] = 1;
$data['last_login'] = time();
$data['regist_type'] = 4;    //扫码
$data['is_mobile'] = 2;      //没绑定手机
$data['wx_type'] = 1;        //没有关注公众号

$user_id = M('user')->add($data);
$xcode = $data['xcode'];
$role_id = 1;
}else {//有unionid,
if(!$userInfo['openid_user']){//没有user网站的openid,保存到user表中
$data['openid_user'] = $accessInfo->openid;
$data['status'] = 1;
M('user')->where("unionid = '%s' and status != 2",array($unionid))->save($data);
}
$user_id = $userInfo['user_id'];
$xcode = $userInfo['xcode'];
$role_id = $userInfo['role_id'];
}

$row['uid'] = $user_id;
$row['xcode'] = $xcode;
$row['role_id'] = $role_id;
$row['status'] = 1;
$sid = md5($user_id.$xcode.time());
$datas['sid'] = $sid;
$datas['data'] = json_encode($row);
M("sessions")->add($datas);

//添加到数据库中用来调试
$data['text'] = '扫码得sessions:'.json_encode($row);
$data['time'] = date('Y-m-d H:i:s',time());
M('aaa')->add($data);

$_SESSION['sid'] = $sid;
$_SESSION['xcode'] = $xcode;
$_SESSION['user_id'] = $user_id;
$_SESSION['regist_type'] = 4;
$_SESSION['entry_login'] = 1;

$domain = C("domain");
setcookie("xcode",$xcode,time()+3156000,'/',$domain);
setcookie("user_id",$user_id,time()+3156000,'/',$domain);
setcookie("regist_type",4,time()+3156000,'/',$domain);
setcookie('EYUID',$sid,time()+3156000,'/',$domain);
setcookie('ENTRY_LOGIN',1,time()+3156000,'/',$domain);
setcookie('GUID',$user_id,time()+3156000,'/',$domain);
setcookie('role_id',1,time()+3156000,'/',$domain);

//问卷链接解码后,添加esurvey_token参数
$esurvey_url = base64_decode(base64_decode($esurvey_url));
if(strpos($esurvey_url,'?')){
$esurvey_url .= "&esurvey_token=".$esurvey_token;
}else{
$esurvey_url .= "?esurvey_token=".$esurvey_token;
}

header('location:'.$esurvey_url);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: