首页 > 开发 > PHP > 正文

PHP版QQ互联OAuth示例代码分享

2024-05-04 23:37:19
字体:
来源:转载
供稿:网友

这篇文章主要介绍了PHP版QQ互联OAuth示例代码分享,十分的详细使用,有需要的小伙伴可以参考下。

由于国内QQ用户的普遍性,所以现在各大网站都尽可能的提供QQ登陆口,下面我们来看看php版,给大家参考下

  1. /** 
  2. * QQ互联 oauth 
  3. * @author dyllen 
  4. * 
  5. */ 
  6. class Oauth 
  7. //取Authorization Code Url 
  8. const PC_CODE_URL = 'https://graph.qq.com/oauth2.0/authorize'
  9.  
  10. //取Access Token Url 
  11. const PC_ACCESS_TOKEN_URL = 'https://graph.qq.com/oauth2.0/token'
  12.  
  13. //取用户 Open Id Url 
  14. const OPEN_ID_URL = 'https://graph.qq.com/oauth2.0/me'
  15.  
  16. //用户授权之后的回调地址 
  17. public $redirectUri = null; 
  18.  
  19. // App Id 
  20. public $appid = null; 
  21.  
  22. //App Key 
  23. public $appKey = null; 
  24.  
  25. //授权列表 
  26. //字符串,多个用逗号隔开 
  27. public $scope = null; 
  28.  
  29. //授权code 
  30. public $code = null; 
  31.  
  32. //续期access token的凭证 
  33. public $refreshToken = null; 
  34.  
  35. //access token 
  36. public $accessToken = null; 
  37.  
  38. //access token 有效期,单位秒 
  39. public $expiresIn = null; 
  40.  
  41. //state 
  42. public $state = null; 
  43.  
  44. public $openid = null; 
  45.  
  46. //construct 
  47. public function __construct($config=[]) 
  48. foreach($config as $key => $value) { 
  49. $this->$key = $value
  50.  
  51. /** 
  52. * 得到获取Code的url 
  53. * @throws /InvalidArgumentException 
  54. * @return string 
  55. */ 
  56. public function codeUrl() 
  57. if (!$this->redirectUri) { 
  58. throw new /Exception('parameter $redirectUri must be set.'); 
  59. $query = [ 
  60. 'response_type' => 'code'
  61. 'client_id' => $this->appid, 
  62. 'redirect_uri' => $this->redirectUri, 
  63. 'state' => $this->getState(), 
  64. 'scope' => $this->scope, 
  65. ]; 
  66.  
  67. return self::PC_CODE_URL . '?' . http_build_query($query); 
  68.  
  69. /** 
  70. * 取access token 
  71. * @throws Exception 
  72. * @return boolean 
  73. */ 
  74. public function getAccessToken() 
  75. $params = [ 
  76. 'grant_type' => 'authorization_code'
  77. 'client_id' => $this->appid, 
  78. 'client_secret' => $this->appKey, 
  79. 'code' => $this->code, 
  80. 'redirect_uri' => $this->redirectUri, 
  81. ]; 
  82.  
  83. $url = self::PC_ACCESS_TOKEN_URL . '?' . http_build_query($params); 
  84. $content = $this->getUrl($url); 
  85. parse_str($content$res); 
  86. if ( !isset($res['access_token']) ) { 
  87. $this->thrwoError($content); 
  88.  
  89. $this->accessToken = $res['access_token']; 
  90. $this->expiresIn = $res['expires_in']; 
  91. $this->refreshToken = $res['refresh_token']; 
  92.  
  93. return true; 
  94.  
  95. /** 
  96. * 刷新access token 
  97. * @throws Exception 
  98. * @return boolean 
  99. */ 
  100. public function refreshToken() 
  101. $params = [ 
  102. 'grant_type' => 'refresh_token'
  103. 'client_id' => $this->appid, 
  104. 'client_secret' => $this->appKey, 
  105. 'refresh_token' => $this->refreshToken, 
  106. ]; 
  107.  
  108. $url = self::PC_ACCESS_TOKEN_URL . '?' . http_build_query($params); 
  109. $content = $this->getUrl($url); 
  110. parse_str($content$res); 
  111. if ( !isset($res['access_token']) ) { 
  112. $this->thrwoError($content); 
  113.  
  114. $this->accessToken = $res['access_token']; 
  115. $this->expiresIn = $res['expires_in']; 
  116. $this->refreshToken = $res['refresh_token']; 
  117.  
  118. return true; 
  119.  
  120. /** 
  121. * 取用户open id 
  122. * @return string 
  123. */ 
  124. public function getOpenid() 
  125. $params = [ 
  126. 'access_token' => $this->accessToken, 
  127. ]; 
  128.  
  129. $url = self::OPEN_ID_URL . '?' . http_build_query($params); 
  130.  
  131. $this->openid = $this->parseOpenid( $this->getUrl($url) ); 
  132.  
  133. return $this->openid; 
  134.  
  135. /** 
  136. * get方式取url内容 
  137. * @param string $url 
  138. * @return mixed 
  139. */ 
  140. public function getUrl($url
  141. $ch = curl_init(); 
  142. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
  143. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
  144. curl_setopt($ch, CURLOPT_URL, $url); 
  145. $response = curl_exec($ch); 
  146. curl_close($ch); 
  147.  
  148. return $response
  149.  
  150. /** 
  151. * post方式取url内容 
  152. * @param string $url 
  153. * @param array $keysArr 
  154. * @param number $flag 
  155. * @return mixed 
  156. */ 
  157. public function postUrl($url$keysArr$flag = 0) 
  158. $ch = curl_init(); 
  159. if(! $flag) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
  160. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
  161. curl_setopt($ch, CURLOPT_POST, TRUE); 
  162. curl_setopt($ch, CURLOPT_POSTFIELDS, $keysArr); 
  163. curl_setopt($ch, CURLOPT_URL, $url); 
  164. $ret = curl_exec($ch); 
  165.  
  166. curl_close($ch); 
  167. return $ret
  168.  
  169.  
  170. /** 
  171. * 取state 
  172. * @return string 
  173. */ 
  174. protected function getState() 
  175. $this->state = md5(uniqid(rand(), true)); 
  176. //state暂存在缓存里面 
  177. //自己定义 
  178. //。。。。。。。。。 
  179.  
  180. return $this->state; 
  181.  
  182. /** 
  183. * 验证state 
  184. * @return boolean 
  185. */ 
  186. protected function verifyState() 
  187. //。。。。。。。 
  188.  
  189. /** 
  190. * 抛出异常 
  191. * @param string $error 
  192. * @throws /Exception 
  193. */ 
  194. protected function thrwoError($error
  195. $subError = substr($errorstrpos($error"{")); 
  196. $subError = strstr($subError"}", true) . "}"
  197. $error = json_decode($subError, true); 
  198.  
  199. throw new /Exception($error['error_description'], (int)$error['error']); 
  200.  
  201. /** 
  202. * 从获取openid接口的返回数据中解析出openid 
  203. * @param string $str 
  204. * @return string 
  205. */ 
  206. protected function parseOpenid($str
  207. $subStr = substr($strstrpos($str"{")); 
  208. $subStr = strstr($subStr"}", true) . "}"
  209. $strArr = json_decode($subStr, true); 
  210. if(!isset($strArr['openid'])) { 
  211. $this->thrwoError($str); 
  212.  
  213. return $strArr['openid']; 


以上所述就是本文的全部内容了,希望大家能够喜欢。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表