我们现在在各大网站论坛都可以看到点击一个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. shell中eval的使用问题

    转载:http://www.blogjava.net/jasmine214--love/archive/2010/11/26/339106.html 本文将会讲解一些linux中命令的使用与技巧希望对 ...

  2. 【spring boot】6.idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到

    接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p/7712874.html 然后声明一点,下面打包的过程中,scope一直都是使用默认的范围 <!--用于 ...

  3. xamarin.android 消息推送功能--极光推送

    最近在使用xamarin.android的消息推送功能,官方使用的例子是FCM方式,按照官方文档,使用FQ软件是可以成功的,但是在国内由于众所周知的原因,在国内服务并不能使用,于是查找国内各自推送平台 ...

  4. ajax跨域解决办法

    在使用jquery的ajax作请求时,http://127.0.0.1:8080,类似这样的一个本地请求,会产生跨域问题, 解决办法一: jsonp: var url= "http://12 ...

  5. Object-C 类

    Classes 类 像其它的面向对象的语言一样,Object-C也提供创建对象的蓝本.即类. 首先我们在类中定义一些能够反复使用的属性和方法. 然后,我们实例化类,即对象,之后就能够使用属性和訪问. ...

  6. spring boot 读取配置文件(application.yml)中的属性值

    在spring boot中,简单几步,读取配置文件(application.yml)中各种不同类型的属性值: 1.引入依赖: <!-- 支持 @ConfigurationProperties 注 ...

  7. Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental……

    Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to th ...

  8. Leetcode Array 11 Container With Most Water

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...

  9. typedef,结构体,共用体,联合体

    typedef的用途: 封装数据类型,方便移植 简化函数指针的定义 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/ ...

  10. 在Mac OS X中下载Android源代码的一些经验

    首先说明.随着最近(2014年6月開始)GFW的升级.这个站点:http://www.android.com/ 已经不能正常訪问了,以下的这些操作均是在我连接VPN的时候进行的. 首先,须要做一些准备 ...