【问题标题】:Fetching A Patron Data From Patreon API从 Patreon API 获取赞助人数据
【发布时间】:2021-01-07 06:56:50
【问题描述】:

我正在使用 Laravel 8 开发一个网页,但在从 Patreon API 通过 id 获取顾客详细信息时遇到问题。这是我的用例。

我在网页中添加了“使用 Patreon 登录”选项,效果很好。当有人成功登录 Patreon 时,我会存储她/他的 Patreon id 并设置记住令牌以在她/他下次访问我的页面时自动登录会员。

第一次登录过程很好。当我的顾客下次访问我的页面时,就会出现问题。因为我想在让她/他看到所有内容之前检查我是否收到任何付款。这就是为什么我需要从中间件获取赞助人详细信息的原因。为此,我尝试了:

  • fetch_user() 返回我的帐户详细信息,而不是登录用户。
  • fetch_user() 带有从 Patreon 返回的访问令牌,当 有人登录,未经授权返回。
  • fetch_member_details() 不适用于我传递的 id,这是一个 像 5484646 这样的整数,因为它需要一个很长的字符串,比如 55153fds-f45fd5sfs-fds42ds,不知道是什么。
  • fetch_page_of_members_from_campaign() 和 fetch_member_details() 一起获取正确的 ID,但获取数据需要很长时间,这 是不可接受的。

那么,怎么做呢?

【问题讨论】:

    标签: php api patreon


    【解决方案1】:

    https://further-reading.net/2020/06/getting-names-of-your-patreon-patrons-by-tier/

    这可能很有用。我相信,没有一个直接的单一 API,但你可以 -

    1. 首先获取所有广告系列/层级数据
    2. 然后为每个活动/层级获取顾客

    【讨论】:

    • 问题是关于 PHP 的,关于如何用 PHP 做的任何想法?链接的文章改用 Python,并且函数名称似乎没有映射到 PHP 等价物。
    • @LeigerGaming 看到我的回答。
    【解决方案2】:

    我喜欢为需要帮助的人回答我的问题。

    首先我用的是Patreon官方的PHP package

    我创建了一个中间件来检查用户是否应该再次获得授权。为了防止每次都执行相同的进程,我为 users 表设置了 timeout 并检查它是否还有时间过期。如果是这样,则无需执行任何操作。当然,这是我的用例,但如果没有那个解释,代码的某些部分对你来说可能是无稽之谈。

    // 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()
        ];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多