ホームページ  >  記事  >  バックエンド開発  >  PHP バージョン QQ インターネット OAuth サンプル コードの共有

PHP バージョン QQ インターネット OAuth サンプル コードの共有

WBOY
WBOYオリジナル
2016-07-25 08:45:001112ブラウズ

国内の QQ ユーザーの人気により、大手 Web サイトは QQ ログイン ポートの提供に全力を尽くしています。参考までに php バージョンを見てみましょう。

  1. /**
  2. * QQ インターネット認証
  3. * @author dyllen
  4. *
  5. */
  6. class Oauth
  7. {
  8. //認可コードURLを取得
  9. const PC_CODE_URL = 'https://graph.qq.com/oauth2.0/authorize';
  10. / /アクセストークンのURLを取得
  11. const PC_ACCESS_TOKEN_URL = 'https://graph.qq.com/oauth2.0/token';
  12. //ユーザーのオープンID URLを取得
  13. const OPEN_ID_URL = 'https://graph.qq.com /oauth2.0/me';
  14. //ユーザー認証後のコールバックアドレス
  15. public $redirectUri = null;
  16. // アプリID
  17. public $appid = null;
  18. //アプリキー
  19. public $appKey = null ;
  20. //認可リスト
  21. //複数のカンマ区切りの文字列
  22. public $scope = null;
  23. //認可コード
  24. public $code = null;
  25. //アクセストークン更新用の証明書
  26. public $refreshToken = null ;
  27. //アクセス トークン
  28. public $accessToken = null;
  29. //アクセス トークンの有効期間、秒単位
  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. * コードを取得するための URL を取得します
  43. * @throws InvalidArgumentException
  44. * @return string
  45. */
  46. public function codeUrl()
  47. {
  48. if (!$this->redirectUri) {
  49. throw new Exception('パラメータ $redirectUri を設定する必要があります。') ;
  50. }
  51. $query = [
  52. 'response_type' => 'code',
  53. 'client_id' => $this->appid,
  54. 'redirect_uri' => $this->getState(),
  55. 'scope' => $this->scope,
  56. ];
  57. return self::PC_CODE_URL . http_build_query($query);
  58. /* *
  59. * アクセストークンの取得
  60. * @throws Exception
  61. * @return boolean
  62. */
  63. public function getAccessToken()
  64. {
  65. $params = [
  66. 'grant_type' => 'authorization_code',
  67. 'client_id' => $this->appid,
  68. ' client_secret' => ; $this->appKey,
  69. 'code' => $this->code,
  70. 'redirect_uri' => $this->redirectUri,
  71. $url = self:PC_ACCESS_TOKEN_URL ' ?' . http_build_query($params);
  72. $content = $this->getUrl($url);
  73. parse_str($content, $res);
  74. if ( !isset($res['access_token' ]) ) {
  75. $this->thrwoError($content);
  76. }
  77. $this->accessToken = $res['access_token'];
  78. $this->expiresIn = $res['expires_in'] ;
  79. $this ->refreshToken = $res['refresh_token'];
  80. return true;
  81. }
  82. /**
  83. * 刷新アクセストークン
  84. * @throws Exception
  85. * @return boolean
  86. */
  87. public function freshToken()
  88. {
  89. $params = [
  90. 'grant_type ' => 'refresh_token',
  91. 'client_id' => $this->appid,
  92. 'client_secret' => $this->refreshToken,
  93. ];
  94. $url = self::PC_ACCESS_TOKEN_URL . '?' http_build_query($params);
  95. $content = $this->getUrl($url);
  96. if ( !isset( $res['access_token']) ) {
  97. $this->thrwoError($content);
  98. }
  99. $this->accessToken = $res['access_token'];
  100. $this-> ;expiresIn = $ res['expires_in'];
  101. $this->refreshToken = $res['refresh_token'];
  102. return true;
  103. }
  104. /**
  105. * ユーザーオープンIDを取得します
  106. * @return string
  107. */
  108. public function getOpenid()
  109. {
  110. $ params = [
  111. 'access_token' => $this->accessToken,
  112. ];
  113. $url = self::OPEN_ID_URL . http_build_query($params);
  114. ;openid = $ this->parseOpenid( $this->getUrl($url) );
  115. return $this->openid;
  116. }
  117. /**
  118. * URLコンテンツを取得するgetメソッド
  119. * @param string $url
  120. * @returnmixed
  121. */
  122. public function getUrl($ url)
  123. {
  124. $ch =curl_init();
  125. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  126. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  127. curl_setopt($ch, CURLOPT_URL, $url);
  128. $response =curl_exec($ch );
  129. curl_close($ch);
  130. return $response;
  131. }
  132. /**
  133. * URLコンテンツを取得するPostメソッド
  134. * @param string $url
  135. * @param array $keysArr
  136. * @paramnumber $flag
  137. * @returnmixed
  138. */
  139. public function postUrl($url, $keysArr, $flag = 0)
  140. {
  141. $ch =curl_init();
  142. if(! $flag)curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  143. curl_setopt($ch、CURLOPT_RETURNTRANSFER、TRUE);
  144. curl_setopt($ch、CURLOPT_POST、TRUE);
  145. curl_setopt($ch、CURLOPT_POSTFIELDS、$keysArr);
  146. curl_setopt($ch、CURLOPT_URL、$url);
  147. $ret =curl_exec($ch);
  148. curl_close($ch);
  149. return $ret;
  150. }
  151. /**
  152. * 状態を取得します
  153. * @return string
  154. */
  155. protected function getState()
  156. {
  157. $this->state = md5(uniqid(rand(), true));
  158. //state が存在します領域
  159. //自己定義
  160. //。。。。。。。。
  161. return $this->state;
  162. }
  163. /**
  164. * 状態を確認します
  165. * @return boolean
  166. */
  167. 保護関数 verifyState()
  168. {
  169. //。。。。。。。
  170. }
  171. /**
  172. * 例外をスローします
  173. * @param string $error
  174. * @throws 例外
  175. */
  176. 保護関数 thrwoError($error)
  177. {
  178. $subError = substr($error, strpos($error, "{"));
  179. $subError = strstr($subError, "}", true) 。 "}";
  180. $error = json_decode($subError, true);
  181. throw new Exception($error['error_description'], (int)$error['error']);
  182. }
  183. /**
  184. * openid インターフェースの戻りデータから openid を解析します
  185. * @param string $str
  186. * @return string
  187. */
  188. 保護された関数 parseOpenid($str)
  189. {
  190. $subStr = substr($str, strpos($str, "{"));
  191. $subStr = strstr($subStr, "}", true) 。 "}";
  192. $strArr = json_decode($subStr, true);
  193. if(!isset($strArr['openid'])) {
  194. $this->thrwoError($str);
  195. }
  196. return $ strArr['openid'];
  197. }
  198. }
复制代码

以上の記載は本書のすべての内容であり、皆様に喜んでいただけることを願っております。

互联、PHP
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。