diff --git a/Provider.php b/Provider.php new file mode 100755 index 0000000..735a9d2 --- /dev/null +++ b/Provider.php @@ -0,0 +1,140 @@ +openId = $openId; + } + + /** + * {@inheritdoc}. + */ + protected function getAuthUrl($state) + { + //return $this->buildAuthUrlFromBase('https://open.weixin.qq.com/connect/qrconnect', $state); + return $this->buildAuthUrlFromBase($this->getConfig( + 'auth_base_uri', + 'https://open.weixin.qq.com/connect/qrconnect' + ), $state); + } + + /** + * {@inheritdoc}. + */ + protected function buildAuthUrlFromBase($url, $state) + { + $query = http_build_query($this->getCodeFields($state), '', '&', $this->encodingType); + + return $url.'?'.$query.'#wechat_redirect'; + } + + /** + * {@inheritdoc}. + */ + protected function getCodeFields($state = null) + { + return [ + 'appid' => $this->clientId, 'redirect_uri' => $this->redirectUrl, + 'response_type' => 'code', + 'scope' => $this->formatScopes($this->scopes, $this->scopeSeparator), + 'state' => $state, + ]; + } + + /** + * {@inheritdoc}. + */ + protected function getTokenUrl() + { + return 'https://api.weixin.qq.com/sns/oauth2/access_token'; + } + + /** + * {@inheritdoc}. + */ + protected function getUserByToken($token) + { + $response = $this->getHttpClient()->get('https://api.weixin.qq.com/sns/userinfo', [ + 'query' => [ + 'access_token' => $token, + 'openid' => $this->openId, + 'lang' => 'zh_CN', + ], + ]); + + return json_decode($response->getBody(), true); + } + + /** + * {@inheritdoc}. + */ + protected function mapUserToObject(array $user) + { + return (new User())->setRaw($user)->map([ + 'id' => Arr::get($user, 'openid'), + 'unionid' => Arr::get($user, 'unionid'), + 'nickname' => $user['nickname'], + 'avatar' => $user['headimgurl'], + 'name' => null, 'email' => null, + ]); + } + + /** + * {@inheritdoc}. + */ + protected function getTokenFields($code) + { + return [ + 'appid' => $this->clientId, 'secret' => $this->clientSecret, + 'code' => $code, 'grant_type' => 'authorization_code', + ]; + } + + /** + * {@inheritdoc}. + */ + public function getAccessTokenResponse($code) + { + $response = $this->getHttpClient()->get($this->getTokenUrl(), [ + 'query' => $this->getTokenFields($code), + ]); + + $this->credentialsResponseBody = json_decode($response->getBody(), true); + $this->openId = $this->credentialsResponseBody['openid']; + + //return $this->parseAccessToken($response->getBody()); + return $this->credentialsResponseBody; + } + + public static function additionalConfigKeys() + { + return ['auth_base_uri']; + } +} diff --git a/WeixinWebExtendSocialite.php b/WeixinWebExtendSocialite.php new file mode 100755 index 0000000..5d46145 --- /dev/null +++ b/WeixinWebExtendSocialite.php @@ -0,0 +1,21 @@ +extendSocialite( + 'weixinweb', + __NAMESPACE__.'\Provider' + ); + } +} diff --git a/composer.json b/composer.json new file mode 100755 index 0000000..ef17149 --- /dev/null +++ b/composer.json @@ -0,0 +1,19 @@ +{ + "name": "socialiteproviders/weixin-web", + "description": "Weixin-Web OAuth2 Provider for Laravel Socialite", + "license": "MIT", + "authors": [{ + "name": "xyxu", + "email": "techxu@gmail.com" + }], + "require": { + "php": "^5.6 || ^7.0", + "ext-json": "*", + "socialiteproviders/manager": "~2.0 || ~3.0" + }, + "autoload": { + "psr-4": { + "SocialiteProviders\\WeixinWeb\\": "" + } + } +}