Discuz教程网

QQ登录 PHP OAuth示例代码

[复制链接]
authicon 星火燎原 发表于 2011-7-25 21:01:28 | 显示全部楼层 |阅读模式
申请是立即通过的 目前腾讯仅开放获取昵称和头像的API,以后会陆续推出其他API 头像是QQ空间的,官方文档都是写QQ空间登录
根据官方文档编写
代码如下:

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

打包下载: qq_php.rar (4.47 KB, 下载次数: 7)



上一篇:PHP多个版本的分析解释
下一篇:模板引擎正则表达式调试小技巧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 05:43

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表