Home  >  Article  >  Backend Development  >  PHP version QQ Internet OAuth sample code sharing

PHP version QQ Internet OAuth sample code sharing

WBOY
WBOYOriginal
2016-07-25 08:45:001127browse

Due to the popularity of QQ users in China, major websites now try their best to provide QQ login ports. Let’s take a look at the php version for your reference

  1. /**
  2. * QQ Internet oauth
  3. * @author dyllen
  4. *
  5. */
  6. class Oauth
  7. {
  8. //Get Authorization Code Url
  9. const PC_CODE_URL = 'https://graph.qq.com/oauth2.0/authorize';
  10. / /Get Access Token Url
  11. const PC_ACCESS_TOKEN_URL = 'https://graph.qq.com/oauth2.0/token';
  12. //Get User Open Id Url
  13. const OPEN_ID_URL = 'https://graph.qq.com /oauth2.0/me';
  14. //Callback address after user authorization
  15. public $redirectUri = null;
  16. // App Id
  17. public $appid = null;
  18. //App Key
  19. public $appKey = null ;
  20. //Authorization list
  21. //String, multiple separated by commas
  22. public $scope = null;
  23. //Authorization code
  24. public $code = null;
  25. //Certificate for renewing access token
  26. public $refreshToken = null;
  27. //access token
  28. public $accessToken = null;
  29. //access token validity period, in seconds
  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. * Get the url to get the Code
  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. * Get user 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 method to get url content
  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 method to get url content
  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. * Get 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. * Verify state
  170. * @return boolean
  171. */
  172. protected function verifyState()
  173. {
  174. //。。。。。。。
  175. }
  176. /**
  177. * Throws Exception
  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. * Parse the openid from the return data of the openid interface
  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


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn