我们现在在各大网站论坛都可以看到点击一个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代码如下:

  1. $ch = curl_init();
  2. curl_setopt($ch, CURLOPT_URL,$url);
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  4. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  6. $result = curl_exec($ch);
  7. return $result

下面是一个完整的实例,是一个QQ登录API示范接口,程序为PHP、具体代码如下:

  1. <?php /**
  2. * 申请http://connect.opensns.qq.com/apply
  3. * 列表http://connect.opensns.qq.com/my
  4. */
  5. session_start();
  6. $qq_oauth_config = array(
  7. 'oauth_consumer_key'=>'*******',//APP ID
  8. 'oauth_consumer_secret'=>'******************',//APP KEY
  9. 'oauth_callback'=>"http://www.sunnyi.cn/qq.php?action=reg",//这里修改为当前脚本,但是要保留?action=reg
  10. 'oauth_request_token_url'=>"http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token",
  11. 'oauth_authorize_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize',
  12. 'oauth_request_access_token_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token',
  13. 'user_info_url' => 'http://openapi.qzone.qq.com/user/get_user_info',
  14. );
  15. $action = isset($_GET['action']) ? $_GET['action'] : '';
  16. $qq = new qq_oauth($qq_oauth_config);
  17. switch($action){
  18. //用户登录 Step1:请求临时token
  19. case 'login':
  20. $token = $qq->oauth_request_token();
  21. $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];
  22. $qq->authorize($token['oauth_token']);
  23. break;
  24. //Step4:Qzone引导用户跳转到第三方应用
  25. case 'reg':
  26. $qq->register_user();
  27. $access_token = $qq->request_access_token();
  28. if($token = $qq->save_access_token($access_token)){
  29. //保存,一般发给用户cookie,以及用户入库
  30. //var_dump($token);
  31. $_SESSION['oauth_token'] = $token['oauth_token'];
  32. $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];
  33. $_SESSION['openid'] = $token['openid'];
  34. header('Content-Type: text/html; charset=utf-8');
  35. $user_info = json_decode($qq->get_user_info());
  36. if($user_info->ret!=0){
  37. exit("获取头像昵称时发生错误".$user_info->msg);
  38. } else {
  39. echo 'QQ昵称:',$user_info->nickname,
  40. '<img src="',$user_info->figureurl,'" />',
  41. '<img src="',$user_info->figureurl_1,'" />',
  42. '<img src="',$user_info->figureurl_2,'" />';
  43. }
  44. }
  45. break;
  46. default :
  47. }
  48. class qq_oauth{
  49. private $config;
  50. function __construct($config){
  51. $this->config = $config;
  52. }
  53. /**
  54. * 返回配置
  55. * @param string $name
  56. *
  57. */
  58. function C($name){
  59. return isset($this->config[$name]) ?  $this->config[$name] : FALSE;
  60. }
  61. /**
  62. * 构建请求URL
  63. * @param string $url
  64. * @param array $params
  65. * @param string $oauth_token_secret
  66. *
  67. */
  68. function build_request_uri($url,$params=array(),$oauth_token_secret=''){
  69. $oauth_consumer_key = $this->C('oauth_consumer_key');
  70. $oauth_consumer_secret = $this->C('oauth_consumer_secret');
  71. $params = array_merge(array(
  72. 'oauth_version'=>'1.0',
  73. 'oauth_signature_method'=>'HMAC-SHA1',
  74. 'oauth_timestamp'=>time(),
  75. 'oauth_nonce'=>rand(1000,99999999),
  76. 'oauth_consumer_key'=>$oauth_consumer_key,
  77. ),$params);
  78. $encode_params = $params;
  79. ksort($encode_params);
  80. $oauth_signature = 'GET&'.urlencode($url).'&'.urlencode(http_build_query($encode_params));
  81. $oauth_signature = base64_encode(hash_hmac('sha1',$oauth_signature,$oauth_consumer_secret.'&'.$oauth_token_secret,true));
  82. $params['oauth_signature'] = $oauth_signature;
  83. return $url.'?'.http_build_query($params);
  84. }
  85. /**
  86. * 校验回调是否返回约定的参数
  87. */
  88. function check_callback(){
  89. if(isset($_GET['oauth_token']))
  90. if(isset($_GET['openid']))
  91. if(isset($_GET['oauth_signature']))
  92. if(isset($_GET['timestamp']))
  93. if(isset($_GET['oauth_vericode']))
  94. return true;
  95. return false;
  96. }
  97. function get_contents($url){
  98. $curl = curl_init();
  99. curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
  100. curl_setopt($curl,CURLOPT_URL,$url);
  101. return curl_exec($curl);
  102. }
  103. /**
  104. * Step1:请求临时token、Step2:生成未授权的临时token
  105. */
  106. function oauth_request_token(){
  107. $url = $this->build_request_uri($this->C('oauth_request_token_url'));
  108. $tmp_oauth_token = $this->get_contents($url);
  109. parse_str($tmp_oauth_token);
  110. /*
  111. oauth_token 未授权的临时token
  112. oauth_token_secret  token的密钥,该密钥仅限于临时token
  113. error_code  错误码
  114. */
  115. if(isset($error_code)) exit($error_code);
  116. return array(
  117. 'oauth_token'=>$oauth_token,
  118. 'oauth_token_secret'=>$oauth_token_secret
  119. );
  120. }
  121. /**
  122. * Step3:引导用户到Qzone的登录页
  123. * @param string $oauth_token 未授权的临时token
  124. */
  125. function authorize($oauth_token){
  126. $str = "HTTP/1.1 302 Found";
  127. header($str);
  128. $url = $this->C('oauth_authorize_url');
  129. $query_strings = http_build_query(array(
  130. 'oauth_consumer_key'=>$this->C('oauth_consumer_key'),
  131. 'oauth_token'=>$oauth_token,
  132. 'oauth_callback'=>$this->C('oauth_callback'),
  133. ));
  134. header('Location: '.$url.'?'.$query_strings);
  135. }
  136. /**
  137. * Step4:Qzone引导用户跳转到第三方应用
  138. * @return bool 验证是否有效
  139. */
  140. function register_user(){
  141. /*
  142. * oauth_token  已授权的临时token
  143. * openid   腾讯用户对外的统一ID,该OpenID与用户QQ号码一一对应
  144. * oauth_signature  签名值,方便第三方来验证openid以及来源的可靠性。
  145. *      使用HMAC-SHA1算法:
  146. *      源串:openid+timestamp(串中间不要添加'+'符号)
  147. *      密钥:oauth_consumer_secret
  148. * timestamp    openid的时间戳
  149. * oauth_vericode   授权验证码。
  150. */
  151. if($this->check_callback()){
  152. //校验签名
  153. $signature = base64_encode(hash_hmac('sha1',$_GET['openid'].$_GET['timestamp'],$this->C('oauth_consumer_secret'),true));
  154. if(!emptyempty($_GET['oauth_signature']) && $signature==$_GET['oauth_signature']){
  155. $_SESSION['oauth_token'] = $_GET['oauth_token'];
  156. $_SESSION['oauth_vericode'] = $_GET['oauth_vericode'];
  157. return;
  158. }
  159. }
  160. //校验未通过
  161. exit('UNKNOW REQUEST');
  162. }
  163. /**
  164. * Step5:请求access token
  165. */
  166. function request_access_token(){
  167. $url = $this->build_request_uri($this->C('oauth_request_access_token_url'),array(
  168. 'oauth_token'=>$_SESSION['oauth_token'],
  169. 'oauth_vericode'=>$_SESSION['oauth_vericode']
  170. ),$_SESSION['oauth_token_secret']);
  171. return $this->get_contents($url);
  172. }
  173. /**
  174. * Step6:生成access token (保存access token)
  175. *
  176. * 关于access_token
  177. * 目前access_token(及其secret)是长期有效的,和某一个openid对应,目前可以支持线下获取该openid的信息。
  178. * 当然,用户有权限在Qzone这边删除对第三方的授权,此时该access_token会失效,需要重新走整个流程让用户授权。
  179. * 以后会逐步丰富access_token的有效性,长期有效、短期有效、用户登录时才有效等。
  180. */
  181. function save_access_token($access_token_str){
  182. parse_str($access_token_str,$access_token_arr);
  183. if(isset($access_token_arr['error_code'])){
  184. return FALSE;
  185. } else {
  186. return $access_token_arr;
  187. }
  188. }
  189. /**
  190. * 目前腾讯仅开放该API
  191. * 获取登录用户信息,目前可获取用户昵称及头像信息。
  192. * http://openapi.qzone.qq.com/user/get_user_info
  193. */
  194. function get_user_info(){
  195. $url = $this->build_request_uri($this->C('user_info_url'),array(
  196. 'oauth_token'=>$_SESSION['oauth_token'],
  197. 'openid'=>$_SESSION['openid'],
  198. ),$_SESSION['oauth_token_secret']);
  199. return $this->get_contents($url);
  200. }
  201. }?>

QQ登录集成到自己网站php代码(转载)的更多相关文章

  1. 安卓应用使用QQ登录的申请流程

    “QQ互联”是腾讯为第三方网站.媒体.终端提供的开放平台.QQ互联拥有8个组件,提供诸如分享.登陆.like.qq提醒等能力.开发者使用QQ帐号登陆组件可以降低了用户的注册门槛,减少注册环节的用户流失 ...

  2. 什么是“QQ登录OAuth2.0”

    1. 什么是“QQ登录OAuth2.0 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他 ...

  3. QQ登录类

    2015-3-31 22:02:09 (同一套代码, pc端不能登录, 但是, 手机和平板都可以正常登录.....) 1. 首先是库文件, 登录->授权->token->openid ...

  4. 网站集成QQ登录功能

    最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...

  5. 网站集成QQ登录功能(转)

    最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...

  6. java集成网站微信,微博,qq登录

    微信 WechatConfig.java package com.meeno.chemical.common.sdk.wechat.config; import org.springframework ...

  7. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  8. QQ登录网站接入

    QQ网站登录是一个非常常用的功能,网上有很多的资料,在此只做一个整理: QQ登录接入也在不断的升级,目前我发布的是2.1,很多资料里显示的那些繁杂的步骤已经不需要了: 第一步需要先申请,申请地址如下: ...

  9. 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇

    第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...

随机推荐

  1. Linux(三) 一些命令

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  2. tomcat 登录时用户名和密码问题

    在编程的时候我们经常在myeclipes中直接部署web程序,大多数情况下不会登陆tomcat,这样时间长了我们就忘记了tomcat的登陆用户名和密码,下面就说一下怎么找到tomcat的用户名和密码吧 ...

  3. 接口性能测试方案 白皮书 V1.0

    一. 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间.响应时间按软件的特点再可以细分,如对于一个 C/S 软件的响应时间可以细分为网 ...

  4. (七)jQuery中的DOM操作

    一.jQuery的DOM操作 (1)查找节点: 查找元素节点: 1. 获取指定的标签节点 $(“上级标签 标签:eq(“标签索引”) ;  如:var li = $("ul li:eq(2) ...

  5. 字符串(string)操作的相关方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. H5和CSS3新增内容总结

    CSS3选择器有哪些?答:属性选择器.伪类选择器.伪元素选择器.CSS3新特性有哪些?答:1.颜色:新增RGBA,HSLA模式 文字阴影(text-shadow.) 边框: 圆角(border-rad ...

  7. Java储存过程

    存储过程:是指保存在数据库并在数据库端执行的程序. CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法.已储存过程储存在数据库中. 对已储存过程的调用 ...

  8. cocos2dx-3.0(8)------Label、LabelTTF、LabelAtlas、LabelBMFont使用之法

    ----我的生活,我的点点滴滴!! 最后一个LabelBMFont了,字体图集LabelBMFont,LabelBMFont类是一个基于位图的字体图集.是一个包括全部你须要于坐标数据一起显示在屏幕上的 ...

  9. 基于pcl 和 liblas 库 las与pcd格式(rgb点)相互转换(win10 VS2013 X64环境 )

    #include <liblas/liblas.hpp> #include <iomanip> #include <iostream> #include <s ...

  10. Android_程序未处理异常的捕获与处理

    1.简单介绍 对于程序抛出的未被捕获的异常,可能会导致程序异常退出,界面不友好且应记录关键错误信息上传至server. 这里主要使用UncaughtExceptionHandler 2.代码实现 pu ...