【问题标题】:Laravel auth user on webhookWebhook 上的 Laravel 身份验证用户
【发布时间】:2020-09-11 06:33:38
【问题描述】:

我在我的 Laravel/Vue 应用程序中遇到了经过身份验证的用户问题。登录后,您可以选择通过 Stripe 进行购买,这会引导您离开页面,并在付款后返回。

只是为了确保,我已经创建了一个端点:

Route::get('test', function(){
    return Auth::user();
});

在 Stripe 之前和之后,当我点击它时,我确实找回了用户。因此,身份验证是有序的。

但发生的情况是,Stripe 在支付事件时会对我的路由进行 webhook 回调:

Route::post('api/stripe/checkout-session-completed', 'StripeController@checkoutSessionCompleted');

在钩子中,触发了事件,该事件应该将购买的积分数传播给进行购买的用户,但是我总是得到 Auth::user() 未定义。

use Illuminate\Support\Facades\Auth;
...

public function checkoutSessionCompleted()
{
    ...
    $this->handleCheckout($session); // this is Stripe session object
    ...
}

private function handleCheckout($session)
{
    ...
    event(new PaymentSuccessful($payment, Auth::user()));
    ...
}

这应该发生吗?如果不是这样,如何获取当前的 auth 用户?

【问题讨论】:

  • 您是否在应用程序中使用了多个守卫?
  • 没有。但是,我确实覆盖了EloquentUserProvider 以始终为validateCredentials 方法返回true。但身份验证按预期工作。看起来好像在 webhook POST 上,建立了新会话并且它无权访问 auth 用户对象

标签: php laravel events stripe-payments webhooks


【解决方案1】:

当外部来源向您的路线发出 POST 请求时,似乎没有共享会话。我做了一个解决方法,在 Stripe 会话元数据中包含用户 ID,这样当请求通过 webhook 返回时,我可以通过相同的 ID 找到用户。

$stripeSession = Session::create([
    'success_url'          => route('stripe.success') . '/?session_id={CHECKOUT_SESSION_ID}',
    'cancel_url'           => route('stripe.cancel'),
    'payment_method_types' => ['card'],
    'mode'                 => 'payment',
    'line_items'           => [
        [
            'price_data'  => [
                'currency'    => 'eur',
                'product'     => env('STRIPE_PRODUCT_ID'),
                'unit_amount' => $price->stripe_price * 100,
            ],
            'description' => "Credits to receive: $price->quantity",
            'quantity'    => 1,
        ],
    ],
    'metadata'             => [
        'quantity' => $price->quantity,
        'user_id'  => Auth::user()->id,
    ],
    'customer_email'       => optional(Auth::user())->email ?? null,
    'client_reference_id'  => optional(Auth::user())->id ?? null,
]);

【讨论】:

  • 这是正确的答案并添加到它。 webhook 通知的 POST 请求来自 Stripe 的服务器。身份验证的工作方式要求用户浏览器向您的服务器发出请求。您需要 (1) 删除 webhook 路由的任何身份验证要求,以及 (2) 使用 Checkout Session 上的元数据或以其他方式将 Checkout Session 的 ID 存储在您的数据库中,并以某种方式将其与用户相关联,以便查看它们当您收到 webhook 通知时启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2022-06-28
  • 2013-09-11
  • 2018-09-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
相关资源
最近更新 更多