300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 网站中应用QQ一键登录 详细讲解和范例

网站中应用QQ一键登录 详细讲解和范例

时间:2019-08-09 10:47:06

相关推荐

网站中应用QQ一键登录 详细讲解和范例

准备工作:

1、下好qq官方提供的SDK,内含简单说明

2、确保你的php开启了extension=php_openssl.dll

官方文档写的很麻烦,很复杂,其实通过php的sdk很简单,只需要几个步骤,js方法什么的都不需要去用

1.去connect. 中申请 appid

根据提示进行操作,非常简单,注意记录appid,appkey,同时如果是想本机使用接口测试,需要注意网站应用地址 写真实存在的http,回调地址写 127.0.0.1即可,不允许写http://localhost

2.上传服务器,调整配置文件:

把解压好的sdk包,传到服务器上应用的根目录中,然后找到comm目录-config.php文件打开它,里面有很完整的备注文字

/*** 在你运行本demo之前请到 http://connect./申请appid, appkey, 并注册callback地址*///申请到的appid//$_SESSION["appid"] = yourappid; $_SESSION["appid"] = 100258287; //申请到的appkey//$_SESSION["appkey"] = "yourappkey"; $_SESSION["appkey"] = "0e306a8a3d101e7d55f86b1afd903eac"; //QQ登录成功后跳转的地址,请确保地址真实可用,否则会导致登录失败。//$_SESSION["callback"] = "http://localhost/qqAPI/oauth/get_access_token.php"; $_SESSION["callback"] = "http://127.0.0.1/yingtaome/qqAPI/return.php";//QQ授权api接口.按需调用$_SESSION["scope"] = "get_info";

把appid和appkey写成自己申请的,callback 对应是你的处理文件,目录中没有得自己新建文件-起名-写相关处理(如写入用户表 同步Ucenter 送积分啊 等等 ......)

注意一点:如果你的项目中自有session类处理功能,请把config.php文件中的 include_once('session.php')注释掉

/*** session*///include_once("session.php");

3.测试一下,如果能进入到登陆qq,授权页面则表示正常,如果错误 根据提示的错误代码自己去google一下找问题吧

http://wiki./wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E5%85%AC%E5%85%B1%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E //公共返回码 地址

4.好了,现在什么问题都没有了,需要自己动手写回调文件的处理功能了

先占个我的代码,以此说明

<?php header("Content-Type:text/html;charset=gb2312");define('IN_ECS', true);require('../includes/init.php');include_once('../includes/lib_transaction.php');include_once('../includes/lib_passport.php');

?><!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><?php //应用的APPID$app_id = $_SESSION['appid'];//应用的APPKEY$app_secret = $_SESSION["appkey"];//成功授权后的回调地址$my_url = $_SESSION["callback"];//Step1:获取Authorization Code$code = $_REQUEST["code"];if(empty($code)) {//state参数用于防止CSRF攻击,成功授权后回调时会原样带回$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //拼接URL$dialog_url = "/oauth2.0/authorize?response_type=code&client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=". $_SESSION['state'];echo("<script> top.location.href='" . $dialog_url . "'</script>");}//Step2:通过Authorization Code获取Access Tokenif(@$_REQUEST['state'] == @$_SESSION['state']) {//拼接URL $token_url = "/oauth2.0/token?grant_type=authorization_code&". "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url). "&client_secret=" . $app_secret . "&code=" . $code;$response = file_get_contents($token_url);if (strpos($response, "callback") !== false){$lpos = strpos($response, "(");$rpos = strrpos($response, ")");$response = substr($response, $lpos + 1, $rpos - $lpos -1);$msg = json_decode($response);if (isset($msg->error)){echo "<h3>error:</h3>" . $msg->error;echo "<h3>msg :</h3>" . $msg->error_description;exit;}}//Step3:使用Access Token来获取用户的OpenID$params = array();parse_str($response, $params);$graph_url = "/oauth2.0/me?access_token=".$params['access_token'];$str = file_get_contents($graph_url);if (strpos($str, "callback") !== false){$lpos = strpos($str, "(");$rpos = strrpos($str, ")");$str = substr($str, $lpos + 1, $rpos - $lpos -1);}$user_qq = json_decode($str);if (isset($user_qq->error)){echo "<h3>error:</h3>" . $user_qq->error;echo "<h3>msg :</h3>" . $user_qq->error_description;exit;}$user_info_url = "/user/get_info?access_token=".$params['access_token']."&oauth_consumer_key=".$_SESSION['appid']."&openid=".$user_qq->openid;$user_info = file_get_contents($user_info_url);$user_info = @json_decode($user_info);/*** 建立账号*/if($user_info->msg == 'ok'){$open_id = $user_info->data->openid;//开放的id$email = $user_info->data->email;//用户邮箱$head = $user_info->data->head;//用户头像$nickname = $user_info->data->nick; //用户昵称$nickname = iconv("UTF-8","gbk//TRANSLIT",$nickname);if($open_id != false){if(empty($nickname)){ //如果不存在真实姓名$username='QQ会员<span style=display:none;>'.$open_id.'</span>';//这时是存入到ecs_user表中得}else{$username = $nickname.'<span style=display:none;>'.$open_id.'</span>';}$password=(time()+rand(100,1000));//创建密码,无用,为了表中不为空if(empty($email)){$email='qq_'.$open_id.'@';//qq如果没有返回邮箱,自己定义, 其他的可以根据返回情况而定}/*** 判断用户名是否存在*/if (check_user($username)){//已存在$GLOBALS['user']->set_session($username);/* 设置登录session */$GLOBALS['user']->set_cookie($username);die("<script>window.location.href='".WEB_HOST."index.php';</script>");//跳转登陆}else{$reg_date = time();$ip = real_ip();//获得用户的真实ip/*插入数据库*/$GLOBALS['db']->query('INSERT INTO ' . $GLOBALS['ecs']->table("users") . "(`email`, `user_name`, `password`, `reg_time`, `last_login`, `last_ip`) VALUES ('$email', '$username', '$password', '$reg_date', '$reg_date', '$ip')");$user_id = mysql_insert_id();//ucenter 库中$GLOBALS['db']->query('INSERT INTO ' . $GLOBALS['user']->dbname.'uc_members' . "(`uid`, `email`, `username`, `password`, `regdate`, `regip`) VALUES ('$user_id', '$email', '$username', '$password', '$reg_date', '$ip')");/* 用户注册就发红包 */ $bonus = $db->getRow('SELECT * FROM ' . $ecs->table("bonus_type") . ' WHERE send_type = 0', true); if($bonus && $bonus != ''){ if(time()<($bonus['send_end_date']+28800)){ //当前时间,小于红包发送时间+8小时$sql = "INSERT INTO " . $ecs->table('user_bonus') . "(bonus_type_id, bonus_sn, user_id, used_time, order_id, emailed) " . "VALUES ('$bonus[type_id]', 0, '$user_id', 0, 0, 0)"; $db->query($sql); } } $GLOBALS['user']->set_session($username);/* 设置登录session */$GLOBALS['user']->set_cookie($username);/* 设置登录cookie */die("<script>window.location.href='".WEB_HOST."index.php';</script>");//跳转}}}}else {echo("The state does not match. You may be a victim of CSRF.");}function check_user($username){$sql = "SELECT user_id FROM " . $GLOBALS['ecs']->table('users'). " WHERE user_name='$username'";$row = $GLOBALS['db']->getRow($sql);if (!empty($row)){return true;}else{return false;}}?>

其实您读一下代码,发现前几步有很多的跳转回馈地址也还是这个文件,有人把取code,取token,取openid 分别做了好几个,我觉得完全没有必要,不如一个文件也就多做几个判断,效率,代码维护都非常好的

1、第一步 获取授权码

/oauth2.0/authorize?response_type=code&client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=". $_SESSION['state'];

2、第二部 根据获得的code 取token

//拼接URL $token_url = "/oauth2.0/token?grant_type=authorization_code&". "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url). "&client_secret=" . $app_secret . "&code=" . $code;

3、根据token 取Openid

$graph_url = "/oauth2.0/me?access_token=".$params['access_token'];

4、通过token,openid获取user_info(注意,返回的的事json格式 json_decode一下)

$user_info_url = "/user/get_info?access_token=".$params['access_token']."&oauth_consumer_key=".$_SESSION['appid']."&openid=".$user_qq->openid;

5、接口信息返回的信息 编码只有utf-8,有需要的话可以 自己转一下

$nickname = iconv("UTF-8","gbk//TRANSLIT",$nickname);

剩下就是自己写自己的了,最后可以给 跳转到一首页或是用户中心即可,不要用header('location:xxx.xx')跳转,用echo 或die 去执行js的loaction就可以

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。