簡體   English   中英

Auth::user 通過 Stripe webhook 在 Laravel 5.8 中返回 null(或頁面已過期)

[英]Auth::user returns null (or Page Expired) in Laravel 5.8 via Stripe webhook

我無法讓我的 Laravel 設置在我的 StripeController 中找到經過身份驗證的用戶。 我正在嘗試設置 Stripe webhook 以在成功付款后執行操作。

我已經閱讀了很多類似的問題,但是在嘗試了我閱讀過的修復之后,其中大多數都繼續返回 null。

我最近的嘗試是返回status code 419Page Expired

StripeController.php

class StripeController extends Controller
{

    public function __construct(){
      \Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));

    }

    public function paymentSuccess()
    {
      // The commented code fetches the first User OK but I want the logged in user.

      // $userDetails = User::first();
      // $userDetails->is_subscribed = 1;
      // $userDetails->save();

      //This always returns null, as does any other user() command.
      return Auth::user();  
    }

    public function createSession(Request $request)
    {

        $session =  \Stripe\Checkout\Session::create([
          "success_url" => "https://www.mymarketingwizard.io/#/dashboard",
          "cancel_url" => "https://example.com/cancel",
          "payment_method_types" => ["card"],
          "line_items" => [[
            "name" => "Lifetime Access",
            "description" => "Lifetime Access",
            "amount" => 15000,
            "currency" => "gbp",
            "quantity" => 1
          ]]
        ]);

        return $session;

      }

我的登錄腳本: AuthController.php

 public function login(Request $request)
   {
       $request->validate([
           'email' => 'required|string|email',
           'password' => 'required|string'
       ]);
       $credentials = request(['email', 'password']);
       $credentials['active'] = 1;
       $credentials['deleted_at'] = null;

       if(!Auth::attempt($credentials))

        return response()->json(['error' => 'unauthorized'],404);


       $user = $request->user();
       $tokenResult = $user->createToken('Personal Access Token');
       $token = $tokenResult->token;
       if ($request->remember_me)
           $token->expires_at = Carbon::now()->addWeeks(1);
       $token->save();
       return response()->json([

           'access_token' => $tokenResult->accessToken,
           'token_type' => 'Bearer',
           'expires_at' => Carbon::parse(
               $tokenResult->token->expires_at
           )->toDateTimeString()
       ]);
   }

我已經閱讀了很多關於這個問題的其他類似問題,許多指向'middleware' => 'web'必須用於您要訪問Auth::user的地方,所以這是我的最新嘗試:

api.php

Route::group(['prefix' => '/'], function () {

  Route::group(['middleware' => 'web'], function () {

      Route::auth();

 Route::post('paymentSuccess','StripeController@paymentSuccess'); // Route I'm a hitting via Stripe
  });

    Route::post('login', 'AuthController@login');
    Route::post('send-token', 'AuthController@sendToken');
    Route::post('validate-token', 'AuthController@validateToken');
    Route::post('reset-password', 'AuthController@resetPassword');

    Route::group(['middleware' => 'auth:api'], function() {
        Route::post('session','StripeController@createSession');

我還閱讀了有關將'web'類從middlewareGroups組中移出並進入 Kernel.php 中的全局middleware的其他解決方案,但這對我也不起作用。

Kernel.php


namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
        \Spatie\Cors\Cors::class,


    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,

        ],

        'api' => [

            'throttle:60,1',
            'bindings',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

    ];

    /**
     * The priority-sorted list of middleware.
     *
     * This forces non-global middleware to always be in the given order.
     *
     * @var array
     */
    protected $middlewarePriority = [
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\Authenticate::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];
}

Payment.vue這是我的 Vue 組件,它在首次創建組件時創建了 Stripe session。 當用戶單擊proceed to checkout按鈕時,將執行該方法。

 methods: {
    checkout() {
      stripe
        .redirectToCheckout({

          sessionId: this.sessionId.id
        })
        .then(result => {
          // If `redirectToCheckout` fails due to a browser or network
          // error, display the localized error message to your customer
          // using `result.error.message`.
        })
    }
  },
   created() {
    api
      .post('/session')
      .then(response => {
        this.sessionId = response.data
      })
      .catch(error => {
      })
  }

我的目標是更新我的用戶表,說明處理付款的用戶現在已訂閱。

這通常發生在 CSRF 檢查失敗時。 VerifyCsrfToken中間件中添加您的 webhook 端點作為例外:

    protected $except = [
        'paymentSuccess',
    ];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM