laravel-socialite-providers/socialite-wechat-service-account

此包已被弃用且不再维护。作者建议使用 laravel-fans/socialite-providers 包。

Laravel Socialite 微信服务号 OAuth2 提供者

0.2.0 2019-09-04 10:36 UTC

This package is auto-updated.

Last update: 2020-09-12 04:24:43 UTC


README

标题
微信服务号

1. 安装

// This assumes that you have composer installed globally
composer require laravel-socialitep-roviders/wechat-service-account

2. 服务提供者

  • 如果已经添加,请从 config\app.php 中的 providers[] 数组中移除 Laravel\Socialite\SocialiteServiceProvider

  • \SocialiteProviders\Manager\ServiceProvider::class 添加到 config\app.php 中的 providers[] 数组。

例如

'providers' => [
    // a whole bunch of providers
    // remove 'Laravel\Socialite\SocialiteServiceProvider',
    \SocialiteProviders\Manager\ServiceProvider::class, // add
];
  • 注意:如果您想使用 Socialite Facade,需要 安装它。

3. 事件监听器

  • SocialiteProviders\Manager\SocialiteWasCalled 事件添加到 app/Providers/EventServiceProvider 中的 listen[] 数组。

  • 将您的监听器(即来自提供者的监听器)添加到刚刚创建的 SocialiteProviders\Manager\SocialiteWasCalled[]

  • 为该提供者添加的监听器是 'LaravelSocialiteProviders\\WeChatServiceAccount\\WeChatServiceAccountExtendSocialite@handle',

  • 注意:除非您使用自己的提供者覆盖它们,否则不需要为内置的 socialite 提供者添加任何内容。

例如

/**
 * The event handler mappings for the application.
 *
 * @var array
 */
protected $listen = [
    \SocialiteProviders\Manager\SocialiteWasCalled::class => [
        // add your listeners (aka providers) here
        'LaravelSocialiteProviders\\WeChatServiceAccount\\WeChatServiceAccountExtendSocialite@handle',
    ],
];

参考

4. 配置设置

您需要将条目添加到服务配置文件中,以便在配置文件缓存用于生产环境(Laravel 命令 artisan config:cache)后,所有配置仍然可用。

添加到 config/services.php

'wechat_service_account' => [
    'client_id' => env('WECHAT_SERVICE_ACCOUNT_APP_ID'),
    'client_secret' => env('WECHAT_SERVICE_ACCOUNT_APP_SECRET'),
    'redirect' => env('WECHAT_SERVICE_ACCOUNT_CALLBACK_URL'),
    'scopes' => preg_split('/,/', env('WECHAT_SERVICE_ACCOUNT_SCOPES'), null, PREG_SPLIT_NO_EMPTY), // can not use explode, see vlucas/phpdotenv#175
    'union_id_with' => preg_split('/,/', env('WECHAT_SERVICE_ACCOUNT_UNION_ID_WITH'), null, PREG_SPLIT_NO_EMPTY),
],

5. 使用

// default need user grant, and then you can get user info(nickname, unionid, openid...)
return Socialite::with('wechat_service_account')->redirect();

// not need user grant, and then you can only get openid
return Socialite::with('wechat_service_account')->scopes('snsapi_base')->redirect();

Lumen 支持

您可以在 Lumen 中使用 Socialite 提供者。只需确保您已启用 facade 支持,并且正确遵循设置说明。

注意:如果您在使用 Lumen,所有提供者都将自动设置为无状态,因为 Lumen 不跟踪状态。

此外,Lumen 中无法从 services[] 解析配置。您只能设置 .env 文件中的值,正如本文件中所示。如有需要,您还可以覆盖配置(如下所示)。

无状态

  • 您可以设置是否希望以无状态方式使用提供者。请记住,OAuth 提供者(如 Twitter、Tumblr 等)必须支持您选择的任何选项。

注意:如果您在使用 Lumen,所有提供者都将自动设置为无状态,因为 Lumen 不跟踪状态。

// to turn off stateless
return Socialite::with('wechat_service_account')->stateless(false)->redirect();

// to use stateless
return Socialite::with('wechat_service_account')->stateless()->redirect();

覆盖配置

如果您需要在应用程序的任何地方动态地覆盖服务提供商的环境或配置变量,可以使用以下方法

$clientId = "secret";
$clientSecret = "secret";
$redirectUrl = "http://yourdomain.com/api/redirect";
$additionalProviderConfig = [
    // Add additional configuration values here.
];
$config = new \SocialiteProviders\Manager\Config(
    $clientId,
    $clientSecret,
    $redirectUrl,
    $additionalProviderConfig
);

return Socialite::with('wechat_service_account')->setConfig($config)->redirect();

获取访问令牌响应体

Laravel Socialite 默认只允许访问 access_token。可以通过 \Laravel\Socialite\User->token 公共属性来访问。有时您需要访问整个响应体,这可能包含如 refresh_token 等项。

在 Socialite 中调用 user() 方法后,您可以通过访问属性 $user->accessTokenResponseBody 来获取访问令牌响应体;

// default use openid as $user->id
$user = Socialite::driver('wechat_service_account')->user();
$accessTokenResponseBody = $user->accessTokenResponseBody;

// use unionid as $user->id
$user = Socialite::driver('wechat_service_account')->scopes('unionid')->user();

// not need user grant, you can only get openid
$user = Socialite::driver('wechat_service_account')->scopes('snsapi_base')->user();

从令牌中获取用户详细信息(OAuth2)

如果您已经有一个用户的有效访问令牌,您可以使用 userFromToken 方法来获取他们的详细信息,但腾讯打破了 OAuth2,需要先设置 "openid"。

$user = Socialite::driver('wechat_service_account')->setOpenId($openId)->userFromToken($token);

参考