QQ登录集成到自己网站php代码(转载)
我们现在在各大网站论坛都可以看到点击一个QQ图标就可以利用自己的QQ号在网站进行登录了,下面我来告诉你一段QQ登录集成到自己网站php代码,有需要的朋友可参考.
1.打开open.qq.com 添加创建应用:-》输入常规的数据,你会看到对应的APP ID和KEY值,这是对你身份证的唯一的验证.
2.打开 http://connect.qq.com/manage/ 点击->添加网站->输入相关信息,这里比较特别注意的是,回调地址那里填上你域名就可以了以上申核需要一到两天时间,耐心等待.
3.打开 http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E7%BD%91%E7%AB%99%E6%8E%A5%E5%85%A5 找到SDK库下载,我在这里下载是官方的php SDK包,如果你的虚拟空间file_get_contents不技持https,可以考虑用curl函数来替代,好多童鞋常常因为获取不到access_token也就是这个原因,任何一个包不是一气呵成了,还需你配置相关的配置,这个繁索的调试过程我就在这里展开谈了,说说原理->通过你的网站登陆QQ state和scope->获得access_token->再获得每个QQ唯一的身份ID openid.
4.在这里你调试成功后,获得ID后,还需和你当前网站帐号绑定,才能下次登陆的时候自动去识别你的相关绑定帐号内容.
常见问题:
1.Warning: session_start() [function.session-start]: open(/tmpsess_s9b1ahi6vnvc0pfl2e0dcd0l10, O_RDWR) failed: 解决方法:No such file or directory (2) inD:powhostbbcarblogwebtestqqSDKcommsession.php on line 196
找到sssion.php session_save_path 加上注释//,注释掉设置路径
2.Notice: file_get_contents() [function.file-get-contents]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? inD:powhostbbcarblogwebtestqqSDKcommutils.php on line 37
解决方法:
找到 Utils.php function get_url_contents 函数内容直接用下面代码替代,因为file_get_content默认不支持访问https,如果要支持需配置php.ini,激活 php_openssl.dll 模块,这个大家百度配置一下便可,php代码如下:
- $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);
- $result = curl_exec($ch);
- return $result
下面是一个完整的实例,是一个QQ登录API示范接口,程序为PHP、具体代码如下:
- <?php /**
- * 申请http://connect.opensns.qq.com/apply
- * 列表http://connect.opensns.qq.com/my
- */
- session_start();
- $qq_oauth_config = array(
- 'oauth_consumer_key'=>'*******',//APP ID
- 'oauth_consumer_secret'=>'******************',//APP KEY
- 'oauth_callback'=>"http://www.sunnyi.cn/qq.php?action=reg",//这里修改为当前脚本,但是要保留?action=reg
- 'oauth_request_token_url'=>"http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token",
- 'oauth_authorize_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize',
- 'oauth_request_access_token_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token',
- 'user_info_url' => 'http://openapi.qzone.qq.com/user/get_user_info',
- );
- $action = isset($_GET['action']) ? $_GET['action'] : '';
- $qq = new qq_oauth($qq_oauth_config);
- switch($action){
- //用户登录 Step1:请求临时token
- case 'login':
- $token = $qq->oauth_request_token();
- $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];
- $qq->authorize($token['oauth_token']);
- break;
- //Step4:Qzone引导用户跳转到第三方应用
- case 'reg':
- $qq->register_user();
- $access_token = $qq->request_access_token();
- if($token = $qq->save_access_token($access_token)){
- //保存,一般发给用户cookie,以及用户入库
- //var_dump($token);
- $_SESSION['oauth_token'] = $token['oauth_token'];
- $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];
- $_SESSION['openid'] = $token['openid'];
- header('Content-Type: text/html; charset=utf-8');
- $user_info = json_decode($qq->get_user_info());
- if($user_info->ret!=0){
- exit("获取头像昵称时发生错误".$user_info->msg);
- } else {
- echo 'QQ昵称:',$user_info->nickname,
- '<img src="',$user_info->figureurl,'" />',
- '<img src="',$user_info->figureurl_1,'" />',
- '<img src="',$user_info->figureurl_2,'" />';
- }
- }
- break;
- default :
- }
- class qq_oauth{
- private $config;
- function __construct($config){
- $this->config = $config;
- }
- /**
- * 返回配置
- * @param string $name
- *
- */
- function C($name){
- return isset($this->config[$name]) ? $this->config[$name] : FALSE;
- }
- /**
- * 构建请求URL
- * @param string $url
- * @param array $params
- * @param string $oauth_token_secret
- *
- */
- function build_request_uri($url,$params=array(),$oauth_token_secret=''){
- $oauth_consumer_key = $this->C('oauth_consumer_key');
- $oauth_consumer_secret = $this->C('oauth_consumer_secret');
- $params = array_merge(array(
- 'oauth_version'=>'1.0',
- 'oauth_signature_method'=>'HMAC-SHA1',
- 'oauth_timestamp'=>time(),
- 'oauth_nonce'=>rand(1000,99999999),
- 'oauth_consumer_key'=>$oauth_consumer_key,
- ),$params);
- $encode_params = $params;
- ksort($encode_params);
- $oauth_signature = 'GET&'.urlencode($url).'&'.urlencode(http_build_query($encode_params));
- $oauth_signature = base64_encode(hash_hmac('sha1',$oauth_signature,$oauth_consumer_secret.'&'.$oauth_token_secret,true));
- $params['oauth_signature'] = $oauth_signature;
- return $url.'?'.http_build_query($params);
- }
- /**
- * 校验回调是否返回约定的参数
- */
- function check_callback(){
- if(isset($_GET['oauth_token']))
- if(isset($_GET['openid']))
- if(isset($_GET['oauth_signature']))
- if(isset($_GET['timestamp']))
- if(isset($_GET['oauth_vericode']))
- return true;
- return false;
- }
- function get_contents($url){
- $curl = curl_init();
- curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
- curl_setopt($curl,CURLOPT_URL,$url);
- return curl_exec($curl);
- }
- /**
- * Step1:请求临时token、Step2:生成未授权的临时token
- */
- function oauth_request_token(){
- $url = $this->build_request_uri($this->C('oauth_request_token_url'));
- $tmp_oauth_token = $this->get_contents($url);
- parse_str($tmp_oauth_token);
- /*
- oauth_token 未授权的临时token
- oauth_token_secret token的密钥,该密钥仅限于临时token
- error_code 错误码
- */
- if(isset($error_code)) exit($error_code);
- return array(
- 'oauth_token'=>$oauth_token,
- 'oauth_token_secret'=>$oauth_token_secret
- );
- }
- /**
- * Step3:引导用户到Qzone的登录页
- * @param string $oauth_token 未授权的临时token
- */
- function authorize($oauth_token){
- $str = "HTTP/1.1 302 Found";
- header($str);
- $url = $this->C('oauth_authorize_url');
- $query_strings = http_build_query(array(
- 'oauth_consumer_key'=>$this->C('oauth_consumer_key'),
- 'oauth_token'=>$oauth_token,
- 'oauth_callback'=>$this->C('oauth_callback'),
- ));
- header('Location: '.$url.'?'.$query_strings);
- }
- /**
- * Step4:Qzone引导用户跳转到第三方应用
- * @return bool 验证是否有效
- */
- function register_user(){
- /*
- * oauth_token 已授权的临时token
- * openid 腾讯用户对外的统一ID,该OpenID与用户QQ号码一一对应
- * oauth_signature 签名值,方便第三方来验证openid以及来源的可靠性。
- * 使用HMAC-SHA1算法:
- * 源串:openid+timestamp(串中间不要添加'+'符号)
- * 密钥:oauth_consumer_secret
- * timestamp openid的时间戳
- * oauth_vericode 授权验证码。
- */
- if($this->check_callback()){
- //校验签名
- $signature = base64_encode(hash_hmac('sha1',$_GET['openid'].$_GET['timestamp'],$this->C('oauth_consumer_secret'),true));
- if(!emptyempty($_GET['oauth_signature']) && $signature==$_GET['oauth_signature']){
- $_SESSION['oauth_token'] = $_GET['oauth_token'];
- $_SESSION['oauth_vericode'] = $_GET['oauth_vericode'];
- return;
- }
- }
- //校验未通过
- exit('UNKNOW REQUEST');
- }
- /**
- * Step5:请求access token
- */
- function request_access_token(){
- $url = $this->build_request_uri($this->C('oauth_request_access_token_url'),array(
- 'oauth_token'=>$_SESSION['oauth_token'],
- 'oauth_vericode'=>$_SESSION['oauth_vericode']
- ),$_SESSION['oauth_token_secret']);
- return $this->get_contents($url);
- }
- /**
- * Step6:生成access token (保存access token)
- *
- * 关于access_token
- * 目前access_token(及其secret)是长期有效的,和某一个openid对应,目前可以支持线下获取该openid的信息。
- * 当然,用户有权限在Qzone这边删除对第三方的授权,此时该access_token会失效,需要重新走整个流程让用户授权。
- * 以后会逐步丰富access_token的有效性,长期有效、短期有效、用户登录时才有效等。
- */
- function save_access_token($access_token_str){
- parse_str($access_token_str,$access_token_arr);
- if(isset($access_token_arr['error_code'])){
- return FALSE;
- } else {
- return $access_token_arr;
- }
- }
- /**
- * 目前腾讯仅开放该API
- * 获取登录用户信息,目前可获取用户昵称及头像信息。
- * http://openapi.qzone.qq.com/user/get_user_info
- */
- function get_user_info(){
- $url = $this->build_request_uri($this->C('user_info_url'),array(
- 'oauth_token'=>$_SESSION['oauth_token'],
- 'openid'=>$_SESSION['openid'],
- ),$_SESSION['oauth_token_secret']);
- return $this->get_contents($url);
- }
- }?>
QQ登录集成到自己网站php代码(转载)的更多相关文章
- 安卓应用使用QQ登录的申请流程
“QQ互联”是腾讯为第三方网站.媒体.终端提供的开放平台.QQ互联拥有8个组件,提供诸如分享.登陆.like.qq提醒等能力.开发者使用QQ帐号登陆组件可以降低了用户的注册门槛,减少注册环节的用户流失 ...
- 什么是“QQ登录OAuth2.0”
1. 什么是“QQ登录OAuth2.0 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他 ...
- QQ登录类
2015-3-31 22:02:09 (同一套代码, pc端不能登录, 但是, 手机和平板都可以正常登录.....) 1. 首先是库文件, 登录->授权->token->openid ...
- 网站集成QQ登录功能
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- 网站集成QQ登录功能(转)
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- java集成网站微信,微博,qq登录
微信 WechatConfig.java package com.meeno.chemical.common.sdk.wechat.config; import org.springframework ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- QQ登录网站接入
QQ网站登录是一个非常常用的功能,网上有很多的资料,在此只做一个整理: QQ登录接入也在不断的升级,目前我发布的是2.1,很多资料里显示的那些繁杂的步骤已经不需要了: 第一步需要先申请,申请地址如下: ...
- 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇
第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...
随机推荐
- 如何在SQLite中创建自增字段
SQLite 简单的回答:一个声明为 INTEGER PRIMARY KEY 的字段将自动增加. 这里是详细的答案: 从 SQLite 的 2.3.4 版本开始,如果你将一个表中的一个字段声明为 ...
- JavaScript 深克隆
深克隆 function judgeType(arg){//判断js数据类型 return Object.prototype.toString.call(arg).slice(8,-1); } fun ...
- 双网卡环境导致Oracle连接异常
现在就是流行向最高水平看齐,这次项目的部署,好好的SQL Server扔了(有正版授权的企业版,神啊...),逢人就夸:“俺们那上的可是最顶级的Oracle Database System!”.看了看 ...
- mysql----乐观锁总结和实践
悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这 ...
- 穿透内网防线,USB自动渗透手法总结
USB(Universal Serial Bus)原意是指通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,这套标准在1994年底由英特尔.康柏.IBM.Microsoft等多家公 ...
- mongodb读写分离的一些选项的理解
默认情况下 驱动程序会将所有的请求路由到主节点 这通常也是你需要的 但是也可以通过设置驱动程序的读取首选项(read preferences)配置其他选项 可以在读选项中设置需要将查询路由到的服务器的 ...
- React学习之redux
在阅读本文之前,希望大家对以下知识点能提前有所了解并且上好厕所(文章有点长): 状态提升的概念 react高阶组件(函数) es6基础 pure 组件(纯函数) Dumb 组件 React.js的co ...
- DevOps企业实践与架构
原文地址:http://www.sohu.com/a/112351816_355140 什么是DevOps及其误区 DevOps概念从2009年提出已有8个年头.可是在8年前的那个时候,为什么DevO ...
- Enumerate Combination C(k, n) in a bitset
Suppose n<=32, we can enumerate C(k, n), with bits representing absence or presence, in the follo ...
- Inno Setup 使用笔记
使 用 笔 记https://blog.csdn.net/dongshibo12/article/details/79095971 1.Inno Setup 是什么?Inno Setup 是一个免费的 ...