欢迎光临
Life Is Becoming Better

yii2 qq互联 qq登录

2019.7.27 制作qq登录功能网上找了诸多教程发现有一些因为官方插件更新出来的新bug。。遂改之。

官方authclient

"yiisoft/yii2-authclient": "^2.2"

新建common/components/Qq.php

<?php

namespace common\components;

use yii\authclient\OAuth2;
use yii\base\InvalidParamException;
use yii\httpclient\Request;
use yii\web\HttpException;
use Yii;

/**
 * QQ allows authentication via QQ OAuth.
 *
 * In order to use QQ OAuth you must register your application at <http://connect.qq.com/>.
 *
 * Example application configuration:
 *
 * ~~~
 * 'components' => [
 *     'authClientCollection' => [
 *         'class' => 'yii\authclient\Collection',
 *         'clients' => [
 *             'qq' => [
 *                 'class' => 'yujiandong\authclient\Qq',
 *                 'clientId' => 'qq_appid',
 *                 'clientSecret' => 'qq_appkey',
 *             ],
 *         ],
 *     ]
 *     ...
 * ]
 * ~~~
 *
 * @see http://connect.qq.com/
 * @see http://wiki.connect.qq.com/
 *
 */
class Qq extends OAuth2
{

    /**
     * @inheritdoc
     */
    public $authUrl = 'https://graph.qq.com/oauth2.0/authorize';
    /**
     * @inheritdoc
     */
    public $tokenUrl = 'https://graph.qq.com/oauth2.0/token';
    /**
     * @inheritdoc
     */
    public $apiBaseUrl = 'https://graph.qq.com';

    /**
     * @inheritdoc
     */
    public function init()
	{
        parent::init();
        if ($this->scope === null) {
            $this->scope = implode(' ', [
                'get_user_info',
            ]);
        }
    }

    /**
     * @inheritdoc
     */
    public function buildAuthUrl(array $params = [])
	{
        //$authState = $this->generateAuthState();
        //$this->setState('authState', $authState);
        //$params['state'] = $authState;
        return parent::buildAuthUrl($params);
    }

    /**
     * @inheritdoc
     */

    public function fetchAccessToken($authCode, array $params = [])
	{
        /*$authState = $this->getState('authState');

        if (!isset($_REQUEST['state']) || empty($authState) || strcmp($_REQUEST['state'], $authState) !== 0) {
            throw new HttpException(400, 'Invalid auth state parameter2.');
        } else {
            //$this->removeState('authState');
        }*/

		return parent::fetchAccessToken($authCode, $params);

    }

    /**
     * @inheritdoc
     */
    protected function defaultNormalizeUserAttributeMap()
    {
        return [
            'username' => 'nickname',
        ];
    }



    /**
     * @inheritdoc
     */
    protected function initUserAttributes()
	{
        $user = $this->api('oauth2.0/me', 'GET');
		if ( isset($user['error']) ) {
            throw new HttpException(400, $user['error']. ':'. $user['error_description']);
		}
        $userAttributes = $this->api(
			"user/get_user_info",
			'GET',
			[
				'oauth_consumer_key' => $user['client_id'],
            	'openid' => $user['openid'],
			]
		);
		$userAttributes['id'] = $user['openid'];
		return $userAttributes;
    }

    public function createApiRequest()
    {
        $request=parent::createApiRequest();
        $request->on(Request::EVENT_AFTER_SEND, [$this, 'processResponse']);
        return $request;
    }
    /**
     * @inheritdoc
     */
    protected function processResponse($event)
	{
        $rawResponse=$event->response->getContent();
        if ( strpos($rawResponse, "callback(") === 0) {
			$count = 0;
            $jsonData = preg_replace('/^callback\(\s*(\\{.*\\})\s*\);$/is', '\1', $rawResponse, 1, $count);
			if ($count === 1) {
				$rawResponse = $jsonData;
				$contentType = 'json';
			}
        }
        $event->response->setContent($rawResponse);
        return $event;
    }


    /**
     * Generates the auth state value.
     * @return string auth state value.
     */
    protected function generateAuthState()
    {
        return sha1(uniqid(get_class($this), true));
    }

    /**
     * @inheritdoc
     */
    protected function defaultReturnUrl()
    {
        $params = $_GET;
        unset($params['code']);
        unset($params['state']);
        $params[0] = Yii::$app->controller->getRoute();

        return Yii::$app->getUrlManager()->createAbsoluteUrl($params);
    }

    /**
     * @inheritdoc
     */
    protected function defaultName()
	{
        return 'qq';
    }

    /**
     * @inheritdoc
     */
    protected function defaultTitle()
	{
        return 'QQ';
    }

    /**
     * @inheritdoc
     */
    protected function defaultViewOptions()
	{
        return [
            'popupWidth' => 800,
            'popupHeight' => 500,
        ];
    }
}

main.php  组件中加入 也就是 comonents接点

'authClientCollection' => [
            'class' => 'yii\authclient\Collection',
            'clients' => [

                'qq' => [
                    'class' => 'common\components\Qq',
                    'clientId' => '',
                    'clientSecret' => '',
                ],

            ],
        ]

siteController.php

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
            'auth' => [
                'class' => 'yii\authclient\AuthAction',
                'successCallback' => [$this, 'successCallback'],
            ],
        ];
    }
    public function successCallback($client)

    {

        $attributes = $client->getUserAttributes();

        // 用户的信息在$attributes中,以下是您根据您的实际情况增加的代码

        // 如果您同时有QQ互联登录,新浪微博等,可以通过 $client->id 来区别。
        var_dump($attributes);die;

    }

访问/site/auth?authclient=qq

未经允许不得转载:Donghy的博客 » yii2 qq互联 qq登录

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址