当前位置:Gxlcms > PHP教程 > PHP版QQ互联OAuth示例代码分享

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

时间:2021-07-01 10:21:17 帮助过:6人阅读

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

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

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

互联, PHP

人气教程排行