skip to Main Content

I am having an issue with Laravel Cashier. I am trying to use their checkout functionality that should redirect to a Stripe checkout page, however it does not. It returns a blank page as if it were a get request.

Note, this is a subscription checkout, not a product checkout

Notes: I recently upgraded this application to Laravel 6 from 5.8 and Cashier to 12.17.2 from 10.2 so I could get the checkout functionality which was introduced in Cashier 12.7

The blade page just has a form and a submit button that posts to the subscription.create route.

That route has the following code, but when it executes it does not load a Stripe checkout page, it loads a blank page at the /subscription endpoint. This is set up as a POST route in web.php pointing to the correct function

Note, the variables being passed to the newSubscription function have been changed, they are correct in the actual code

    Route::get('/subscription-checkout', function (Request $request) {
    return $request->user()
        ->newSubscription('default', 'plan')
        ->allowPromotionCodes()
        ->checkout([
          'success_url' => route('thankyou'),
          'cancel_url' => route('home'),
        ]);
    })->name('subscription.create');

Update – So it is returning a JSON object to the page, but it is never redirecting to the payment page as it is supposed to. The JSON object contains the payment page URL….

This is very confusing.

2

Answers


  1. Chosen as BEST ANSWER

    Okay, so it turns out Cashier 12.7 works on Laravel 6 But Checkout only works on 8 and above.


  2. not sure why you are calling the checkout on a create method. and its showing blank because you are not returning anything.

    you have to define a route which returns that checkout process (which then redirects to stripe checkout page).

    Something like

    Route::get('/sub', function (Request $request) {
    
        return $request->user()
            ->newSubscription('Subscription', 'plan')
            ->allowPromotionCodes()
            ->checkout([
                'success_url' => route('thankyou'),
                'cancel_url' => route('home'),
            ]);
    });
    

    the checkout method of cashier is just a wrapper of stripe checkout which you have to pass in the data of what you trying to checkout, you can see here full example from Stripe

    EDIT:

    if the object you getting from the response is actual stripe checkout object, you could simply grab the checkout url and redirect to it. if not then you might be able to do your own checkout session assuming your cashier version supports checkout session.

    Something like

    Route::get('/sub', function (Request $request) {
    
        $checkout =  $request->user()->stripe()->checkout->sessions->create([
            'customer_email' => $request->user()->email,
            'line_items' => [[
                'price' => 'SUBSCRIPTION_ID',
                'quantity' => 1,
            ]],
            'mode' => 'subscription',
            'success_url' => route('thankyou'),
            'cancel_url' => route('home')
        ]);
    
        //return $checkout; //checkout session response.
    
        return redirect()->to( $checkout->url )->send();
    
    });
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search