正在从 Patreon 获取赞助人数据 API
Fetching A Patron Data From Patreon API
我正在使用 Laravel 8 开发一个网页,但我在通过 ID 从 Patreon API 获取赞助人详细信息时遇到了问题。这是我的用例。
我在我的网页上添加了“使用 Patreon 登录”选项,效果很好。当有人成功登录 Patreon 时,我存储 her/his Patreon id 并设置记住令牌以在 she/he 下次访问我的页面时自动登录会员。
第一次登录过程没问题。当我的赞助人下次访问我的页面时出现问题。因为我想在让 she/he 查看所有内容之前检查我是否收到任何付款。这就是为什么我需要从中间件中获取赞助人详细信息的原因。为此,我尝试了:
- fetch_user() returns 我的帐户详细信息而不是登录用户。
- fetch_user() 与来自 Patreon 的 returns 的访问令牌
有人登录,returns 未经授权。
- fetch_member_details() 不适用于我传递的 id,这是一个
像 5484646 这样的整数,因为它需要一个很长的字符串,比如
55153fds-f45fd5sfs-fds42ds,不知道是什么
- fetch_page_of_members_from_campaign() 和 fetch_member_details()
一起获得正确的 ID,但需要很长时间才能获得数据,这
是不可接受的。
那么,如何才能做到呢?
https://further-reading.net/2020/06/getting-names-of-your-patreon-patrons-by-tier/
这可能会有用。我相信,没有直接的单一 API ,但你可以 -
- 首先获取所有campaigns/tiers数据
- 然后为每个 campaign/tier
获取订阅会员
我愿意为那些需要帮助的人回答我的问题。
首先,我用的是官方的PHP package by Patreon
我创建了一个中间件来检查用户是否应该再次获得授权。为了防止每次都执行相同的进程,我将超时设置为用户 table 并检查它是否还有时间到期。如果是这样,则无需执行任何操作。当然,这是我的用例,但如果没有那个解释,代码的某些部分对你来说可能是胡说八道。
// App\Http\Middleware\AuthenticateMember.php
public function handle(Request $request, Closure $next)
{
if (!Auth::check()) {
return $next($request);
}
if (Carbon::parse(Auth::user()->timeout)->isFuture()) {
return $next($request);
}
$this->refreshCredentials();
return $next($request);
}
如果将来没有“超时”,将调用refreshCredentials
方法。这是一个方法,会触发绑定AuthGatewayContract到服务容器。
// App\Trait\Users.php
public function refreshCredentials()
{
$gateway = App::make('App\Services\AuthGatewaysContract');
$gateway->ensureUserStillAuthenticated();
}
public function handleUserRecord($user)
{
return User::updateOrCreate([
'email' => $user['email']
], $user);
}
public function attemptToLogin($user, $remember = true)
{
Auth::login($user, $remember);
event(new Registered($user));
}
绑定是这样工作的:
// App\Providers\AppServiceProvider.php
public function register()
{
$this->app->singleton(AuthGatewaysContract::class, function () {
$routeParts = explode('/', url()->current());
$gateway = array_pop($routeParts); // this is how I know which "Login with ..." button is clicked.
$isGateway = Gateway::where('name', $gateway)->first();
$gateway = $isGateway ? ucfirst($gateway) : ucfirst(Auth::user()->gateway->name);
$class = "\App\Services\AuthGateways\$gateway";
return new $class();
});
}
所以Patreon.php现在是活动网关,ensureUserStillAuthenticated
可以被调用:
// App\Services\AuthGateways\Patreon.php
public function ensureUserStillAuthenticated()
{
$this->authenticate([
'access_token' => Auth::user()->access_token,
'refresh_token' => Auth::user()->refresh_token,
]);
}
private function authenticate($tokens)
{
$patron = $this->fetchUserFromGateway($tokens);
$user = $this->handleResponseData($patron, $tokens);
$user = $this->handleUserRecord($user);
return $this->attemptToLogin($user);
}
private function fetchUserFromGateway($tokens)
{
// This is the only function that communicate with Patreon-php package.
$api_client = new API($tokens['access_token']);
return $api_client->fetch_user();
}
private function handleResponseData($data, $tokens)
{
return [
'name' => $data['data']['attributes']['full_name'],
'email' => $data['data']['attributes']['email'],
'password' => Hash::make(Str::random(24)),
'role_id' => $this->assignRoleId($data),
'payment_id' => Payment::where('name', 'patreon')->first()->id,
'gateway_id' => Gateway::where('name', 'patreon')->first()->id,
'access_token' => $tokens['access_token'],
'refresh_token' => $tokens['refresh_token'],
'timeout' => Carbon::today()->addMonth()->toDateString()
];
}
我正在使用 Laravel 8 开发一个网页,但我在通过 ID 从 Patreon API 获取赞助人详细信息时遇到了问题。这是我的用例。
我在我的网页上添加了“使用 Patreon 登录”选项,效果很好。当有人成功登录 Patreon 时,我存储 her/his Patreon id 并设置记住令牌以在 she/he 下次访问我的页面时自动登录会员。
第一次登录过程没问题。当我的赞助人下次访问我的页面时出现问题。因为我想在让 she/he 查看所有内容之前检查我是否收到任何付款。这就是为什么我需要从中间件中获取赞助人详细信息的原因。为此,我尝试了:
- fetch_user() returns 我的帐户详细信息而不是登录用户。
- fetch_user() 与来自 Patreon 的 returns 的访问令牌 有人登录,returns 未经授权。
- fetch_member_details() 不适用于我传递的 id,这是一个 像 5484646 这样的整数,因为它需要一个很长的字符串,比如 55153fds-f45fd5sfs-fds42ds,不知道是什么
- fetch_page_of_members_from_campaign() 和 fetch_member_details() 一起获得正确的 ID,但需要很长时间才能获得数据,这 是不可接受的。
那么,如何才能做到呢?
https://further-reading.net/2020/06/getting-names-of-your-patreon-patrons-by-tier/
这可能会有用。我相信,没有直接的单一 API ,但你可以 -
- 首先获取所有campaigns/tiers数据
- 然后为每个 campaign/tier 获取订阅会员
我愿意为那些需要帮助的人回答我的问题。
首先,我用的是官方的PHP package by Patreon
我创建了一个中间件来检查用户是否应该再次获得授权。为了防止每次都执行相同的进程,我将超时设置为用户 table 并检查它是否还有时间到期。如果是这样,则无需执行任何操作。当然,这是我的用例,但如果没有那个解释,代码的某些部分对你来说可能是胡说八道。
// App\Http\Middleware\AuthenticateMember.php
public function handle(Request $request, Closure $next)
{
if (!Auth::check()) {
return $next($request);
}
if (Carbon::parse(Auth::user()->timeout)->isFuture()) {
return $next($request);
}
$this->refreshCredentials();
return $next($request);
}
如果将来没有“超时”,将调用refreshCredentials
方法。这是一个方法,会触发绑定AuthGatewayContract到服务容器。
// App\Trait\Users.php
public function refreshCredentials()
{
$gateway = App::make('App\Services\AuthGatewaysContract');
$gateway->ensureUserStillAuthenticated();
}
public function handleUserRecord($user)
{
return User::updateOrCreate([
'email' => $user['email']
], $user);
}
public function attemptToLogin($user, $remember = true)
{
Auth::login($user, $remember);
event(new Registered($user));
}
绑定是这样工作的:
// App\Providers\AppServiceProvider.php
public function register()
{
$this->app->singleton(AuthGatewaysContract::class, function () {
$routeParts = explode('/', url()->current());
$gateway = array_pop($routeParts); // this is how I know which "Login with ..." button is clicked.
$isGateway = Gateway::where('name', $gateway)->first();
$gateway = $isGateway ? ucfirst($gateway) : ucfirst(Auth::user()->gateway->name);
$class = "\App\Services\AuthGateways\$gateway";
return new $class();
});
}
所以Patreon.php现在是活动网关,ensureUserStillAuthenticated
可以被调用:
// App\Services\AuthGateways\Patreon.php
public function ensureUserStillAuthenticated()
{
$this->authenticate([
'access_token' => Auth::user()->access_token,
'refresh_token' => Auth::user()->refresh_token,
]);
}
private function authenticate($tokens)
{
$patron = $this->fetchUserFromGateway($tokens);
$user = $this->handleResponseData($patron, $tokens);
$user = $this->handleUserRecord($user);
return $this->attemptToLogin($user);
}
private function fetchUserFromGateway($tokens)
{
// This is the only function that communicate with Patreon-php package.
$api_client = new API($tokens['access_token']);
return $api_client->fetch_user();
}
private function handleResponseData($data, $tokens)
{
return [
'name' => $data['data']['attributes']['full_name'],
'email' => $data['data']['attributes']['email'],
'password' => Hash::make(Str::random(24)),
'role_id' => $this->assignRoleId($data),
'payment_id' => Payment::where('name', 'patreon')->first()->id,
'gateway_id' => Gateway::where('name', 'patreon')->first()->id,
'access_token' => $tokens['access_token'],
'refresh_token' => $tokens['refresh_token'],
'timeout' => Carbon::today()->addMonth()->toDateString()
];
}