QqAuth.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. namespace common\modules\user\clients;
  3. use yii\authclient\OAuth2;
  4. use yii\base\Exception;
  5. use yii\helpers\Json;
  6. class QqAuth extends OAuth2
  7. {
  8. public $authUrl = 'https://graph.qq.com/oauth2.0/authorize';
  9. public $tokenUrl = 'https://graph.qq.com/oauth2.0/token';
  10. public $apiBaseUrl = 'https://graph.qq.com';
  11. public function init()
  12. {
  13. parent::init();
  14. if ($this->scope === null) {
  15. $this->scope = implode(',', [
  16. 'get_user_info',
  17. ]);
  18. }
  19. }
  20. protected function initUserAttributes()
  21. {
  22. // 因为authclient升级导致processResponse方法没有了,QQ获取openid这个接口的返回又很奇葩,是个jsonp格式,httpclient又不支持
  23. $openid = $this->getOpenId();
  24. $qquser = $this->api("user/get_user_info", 'GET', ['oauth_consumer_key'=>$openid['client_id'], 'openid'=>$openid['openid']]);
  25. $qquser['openid'] = $openid['openid'];
  26. $qquser['id'] = $qquser['openid'];
  27. $qquser['login'] = $qquser['nickname'];
  28. $qquser['email'] = $qquser['nickname'] . '@qq.com';
  29. $qquser['avatar'] = $qquser['figureurl_qq_2'];
  30. return $qquser;
  31. }
  32. public function getOpenId()
  33. {
  34. $request = $this->createApiRequest()
  35. ->setMethod('get')
  36. ->setUrl('oauth2.0/me');
  37. $response = $request->send();
  38. $rawResponse = $response->getContent();
  39. if(strpos($rawResponse, "callback") !== false){
  40. $lpos = strpos($rawResponse, "(");
  41. $rpos = strrpos($rawResponse, ")");
  42. $rawResponse = substr($rawResponse, $lpos + 1, $rpos - $lpos -1);
  43. $openid = Json::decode($rawResponse);
  44. return $openid;
  45. }
  46. return false;
  47. }
  48. protected function defaultName()
  49. {
  50. return 'QQ';
  51. }
  52. protected function defaultTitle()
  53. {
  54. return 'QQ';
  55. }
  56. }