1. 程式人生 > >PHP QQ 登入介面應用

PHP QQ 登入介面應用

QQ 登入申請網址:  http://connect.qq.com/manage/info?id=1

  1. <?php   
  2. class qzone  
  3. {  
  4. var$appid = "***********";//換成您的
  5. var$appkey = "**********";//換成您的
  6. //除去陣列中的空值和簽名模式
  7. function filter($parameter)   
  8. {  
  9. $para = array();  
  10. while (list ($key$val) = each ($parameter))   
  11. {  
  12. if($key == "sign" || $key == "sign_type" || $val == 
    "")  
  13. {  
  14. continue;  
  15. }  
  16. else
  17. {  
  18. $para[$key] = $parameter[$key];  
  19. }  
  20. }  
  21. return$para;  
  22. }  
  23. /** 
  24. * 生成請求程式碼 
  25. * @param String $callback 回撥地址 
  26. */
  27. function request($callback = '')  
  28. {  
  29. //必要引數,不要隨便更改!!
  30. $params = array();  
  31. $params["oauth_version"] = "1.0";  
  32. $params["oauth_signature_method"] = "HMAC-SHA1";  
  33. $params["oauth_timestamp"
    ] = time();  
  34. $params["oauth_nonce"] = mt_rand();  
  35. $params["oauth_consumer_key"] = $this->appid;  
  36. $sign = $this->sign($params"GET"."&".rawurlencode("http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token")."&"$this->appkey . '&');  
  37. $url = "http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token?"
    .$this->format($params)."&"."oauth_signature=".rawurlencode($sign);  
  38. $request = file_get_contents($url);//print_r($url);print_r($request);die;
  39. $result = array();  
  40. parse_str($request$result);  
  41. if (!isset($result['oauth_token']))  
  42. {  
  43. //錯誤返回輸出
  44. die();  
  45. }  
  46. $_SESSION["qq_token"] = $result["oauth_token"];  
  47. $_SESSION["qq_secret"] = $result["oauth_token_secret"];  
  48. //302跳轉到授權頁面
  49. $redirect .= "http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize?oauth_consumer_key=".$this->appid."&oauth_token=".$result["oauth_token"]."&oauth_callback=".rawurlencode($callback);//die($redirect);  
  50. header("Location:$redirect");  
  51. }  
  52. /** 
  53. * 響應操作 
  54. */
  55. function respond()  
  56. {  
  57. $params = array();  
  58. $params["oauth_version"] = "1.0";  
  59. $params["oauth_signature_method"] = "HMAC-SHA1";  
  60. $params["oauth_timestamp"] = time();  
  61. $params["oauth_nonce"] = mt_rand();  
  62. $params["oauth_consumer_key"] = $this->appid;  
  63. $params["oauth_token"] = $_SESSION["qq_token"];  
  64. $params["oauth_vericode"] = $_REQUEST["oauth_vericode"];  
  65. //echo "sig:$sig/n";
  66. //echo "str:$str/n";
  67. $sign = $this->sign($params"GET"."&".rawurlencode("http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token")."&"$this->appkey. '&' . $_SESSION["qq_secret"]);  
  68. $url = "http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token?".$this->format($params)."&"."oauth_signature=".rawurlencode($sign);  
  69. $request = file_get_contents($url);  
  70. $result = array();  
  71. parse_str($request$result);  
  72. if (isset($result["error_code"]))  
  73. {  
  74. return false;  
  75. }  
  76. //驗證簽名
  77. $key = $this->appkey;  
  78. $str = $_REQUEST["openid"] . trim($_REQUEST["timestamp"]);  
  79. if ($_REQUEST["oauth_signature"] != $this->sign(array(), $str$key))  
  80. {  
  81. return false;  
  82. }  
  83. $_SESSION["qq_token"] = $result["oauth_token"];  
  84. $_SESSION["qq_secret"] = $result["oauth_token_secret"];   
  85. $_SESSION["qq_openid"] = $result["openid"];  
  86. return true;  
  87. }  
  88. //連結字串
  89. function format($parameter)  
  90. {  
  91. $parameter = $this->filter($parameter);  
  92. ksort($parameter);  
  93. reset($parameter);  
  94. $params = '';  
  95. foreach ($parameter AS $key => $val)  
  96. {  
  97. $params .= "$key=$val&";  
  98. }  
  99. $params = substr($params, 0, -1);  
  100. return$params;  
  101. }  
  102. function sign($parameter$source$key)  
  103. {  
  104. $params = $source . rawurlencode($this->format($parameter));  
  105. //$key = $this->appkey . '&' . $secret;
  106. $sign = "";  
  107. if (function_exists('hash_hmac'))  
  108. {  
  109. $sign = base64_encode(hash_hmac("sha1"$params$key, true));  
  110. }  
  111. else
  112. {  
  113. $blocksize = 64;  
  114. $hashfunc = 'sha1';  
  115. if (strlen($key) > $blocksize)  
  116. {  
  117. $key = pack('H*'$hashfunc($key));  
  118. }  
  119. $key = str_pad($key,$blocksize,chr(0x00));  
  120. $ipad = str_repeat(chr(0x36),$blocksize);  
  121. $opad = str_repeat(chr(0x5c),$blocksize);  
  122. $hmac = pack(  
  123. 'H*',$hashfunc(  
  124. ($key^$opad).pack(  
  125. 'H*',$hashfunc(  
  126. ($key^$ipad).$params
  127. )  
  128. )  
  129. )  
  130. );  
  131. $sign = base64_encode($hmac);  
  132. }  
  133. return$sign;  
  134. }  
  135. /** 
  136. * 遠端獲取資料 
  137. * $url 指定URL完整路徑地址 
  138. * @param $input_charset 編碼格式。預設值:空值 
  139. * @param $time_out 超時時間。預設值:60 
  140. * return 遠端輸出的資料 
  141. */
  142. function getHttpRequest($url$access_token$access_token_secret$openid)  
  143. {  
  144. $sigstr = "GET"."&".rawurlencode("$url")."&";  
  145. //必要引數, 不要隨便更改!!
  146. $params = $_GET;  
  147. $params["oauth_version"] = "1.0";  
  148. $params["oauth_signature_method"] = "HMAC-SHA1";  
  149. $params["oauth_timestamp"] = time();  
  150. $params["oauth_nonce"] = mt_rand();  
  151. $params["oauth_consumer_key"] = $this->appid;  
  152. $params["oauth_token"] = $access_token;  
  153. $params["openid"] = $openid;  
  154. unset($params["oauth_signature"]);  
  155. $sign = $this->sign($params"GET"."&".rawurlencode("$url")."&"$this->appkey . '&' . $_SESSION["qq_secret"]);  
  156. $url = $url."?".$this->format($params)."&"."oauth_signature=".rawurlencode($sign);  
  157. $result = file_get_contents($url);  
  158. return json_decode(str_replace(array("/n""/t"), ''$result), true);  
  159. }  
  160. }  
  161. //---------------------------
  162. ?>  
  163. 使用方法  
  164. 請求程式碼  
  165. <?php   
  166. //---------------------------
  167. //請求
  168. $qzone = new qzone;  
  169. $qzone->request('域名/qzone/login');  
  170. //---------------------------
  171. ?>  
  172. 接受程式碼  
  173. <?php   
  174. //---------------------------
  175. //接收
  176. if ($qzone->respond())  
  177. {  
  178. //如果成功,獲取使用者資訊
  179. $result = $qq->getHttpRequest("http://openapi.qzone.qq.com/user/get_user_info"$_SESSION["qq_token"], $_SESSION["qq_secret"], $_SESSION["qq_openid"]);  
  180. //下面是資料庫操作業務
  181. }  
  182. //---------------------------
  183. ?>