stripe-paymentslaravel-cashier

How to redirect two different types of users to different pages?


I have two types of users: Seller and Buyer.

Seller users->is_seller = 1 Buyer users->is_seller = 0

I am implementing a Stripe gateway to allow users to make a deposit.

Both can make a deposit to their balance. For the Seller, Stripe payment works fine, and when the Buyer makes a deposit, fills out the Stripe form for payment instead of redirecting to the Stripe success route, it redirects to buyer's dashboard.

How to force redirect to the Stripe success route?

StripeController

namespace App\Http\Controllers\Deposit;

use App\Classes\GeniusMailer;
use Cartalyst\Stripe\Laravel\Facades\Stripe;
use App\Http\Controllers\Controller;
use App\Models\Currency;
use App\Models\Deposit;
use App\Models\Generalsetting;
use App\Models\PaymentGateway;
use App\Models\Transaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Stripe\Error\Card;
use Carbon\Carbon;
use Input;
use Redirect;
use URL;
use Validator;
use Config;
use Illuminate\Support\Facades\DB;
use Brian2694\Toastr\Facades\Toastr;
use Stripe\StripeClient;
use Stripe\Checkout\Session;
use Closure;

class StripeController extends Controller
{
    public function __construct()
    {
        $data = PaymentGateway::whereKeyword('Stripe')->first();
        $paydata = $data->convertAutoData();
        $this->middleware('auth');

        Config::set('services.stripe.key', $paydata['key']);
        Config::set('services.stripe.secret', $paydata['secret']);
        $this->stripe = new StripeClient(config('services.stripe.secret'));
    }

     public function store(Request $request){

        $settings = Generalsetting::findOrFail(1);
        $deposit = new Deposit();

        $item_name = $settings->title." Deposit";
        $item_number = Str::random(4).time();
        $item_amount = $request->amount;
        $support = ['USD','EUR','CAD'];
        if(!in_array($request->currency_code,$support)){
            return redirect()->back()->with('warning','Please Select USD Currency For Stripe.');
        }
        $currency = Currency::whereId($request->currency_id)->first();
        $amountToAdd = $request->amount/$currency->value;

        $deposit['user_id'] = auth()->user()->id;
        $deposit['currency_id'] = $request->currency_id;
        $deposit['amount'] = $amountToAdd;
        $deposit['method'] = $request->method;
        $deposit['deposit_number'] = $item_number;
        $deposit['status'] = "pending";
        $deposit->save();

        $user = auth()->user();
        $successUrl = route('user.deposit.stripe.success') . '?session_id={CHECKOUT_SESSION_ID}';

         $line_items[] = [
            'price_data' => [
                'currency' => $request->currency_code,
                'product_data' => [
                    'name' => $settings->title." Deposit",
                    //'images' => [$service->image],
                ],
                'unit_amount' => $item_amount * 100,
                'tax_behavior' => 'exclusive',
            ],
            'quantity' => 1,
        ];

        $response = $this->stripe->checkout->sessions->create([
            'submit_type' => 'pay',
            'locale' => 'auto',
            'metadata' => [
                //'service_id' => $serviceId,

                'user_id' => auth()->user()->id,
                'deposit_number' => $item_number,
              
                'currency_code' => $request->currency_code,
            ],
            'success_url' => $successUrl,
            'payment_method_types' => ['link', 'card'],
            'line_items' => $line_items,
            "expires_at" => Carbon::now()->addMinutes(30)->timestamp,
            'mode' => 'payment',
            'customer_email' => $user->email,
        ]);
            return redirect()->to($response->url);

            }

    public function success(Request $request) {

        $sessionId = $request->get('session_id');
        $session = $this->stripe->checkout->sessions->retrieve($sessionId);                  

        $request['currency_sign'] = $session->metadata['currency_sign'];
        $request['currency_value'] = $session->metadata['currency_value'];
        $request['currency_code'] = $session->metadata['currency_code'];
        $request['deposit_number'] = $session->metadata['deposit_number'];  

        $gs =  Generalsetting::findOrFail(1);
        $currency = Currency::whereId($request->currency_id)->first();
        $amountToAdd = $session->amount_total/100;


        $deposit_number = $request->deposit_number;
        $deposit = Deposit::where('deposit_number',$deposit_number)->where('status','pending')->first();
        $deposit['status'] = "complete";
        $deposit->save();

         $user = auth()->user();
                    $user->balance += $deposit->amount;
                    $user->save();


        
                    $trans = new Transaction();
                    $trans->email = $user->email;
                    $trans->amount = $deposit->amount;
                    $trans->type = "Deposit";
                    $trans->profit = "plus";
                    $trans->txnid = $request->deposit_number;
                    $trans->user_id = $user->id;
                    $trans->save();

         if($gs->is_smtp == 1)
                    {
                        $data = [
                            'to' => $user->email,
                            'type' => "Deposit",
                            'cname' => $user->name,
                            'oamount' => $deposit->amount,
                            'aname' => "",
                            'aemail' => "",
                            'wtitle' => "",
                            'onumber' =>'',
                        ];

                        $mailer = new GeniusMailer();
                        $mailer->sendAutoMail($data);            
                    }
                    else
                    {
                       $to = $user->email;
                       $subject = " You have deposited successfully.";
                       $msg = "Hello ".$user->name."!\nYou have invested successfully.\nThank you.";
                       $headers = "From: ".$gs->from_name."<".$gs->from_email.">";
                       mail($to,$subject,$msg,$headers);            
                    }

                if(Auth::user()->is_seller == 1)
                   {
                        return redirect()->route('user.deposit.create')->with('success','Deposit amount  $'.$amountToAdd.' '.$request->currency_code. ' successfully!');
                    }
                    else{
                        return redirect()->route('buyer.deposit.create')->with('success','Deposit amount  $'.$amountToAdd.' '.$request->currency_code. ' successfully!');

                    }
                }
            }

SellerMiddleware

public function handle(Request $request, Closure $next)
{
    $user = $request->user('web');

    if ($user && (int) $user->is_seller === 0) {
        return to_route('buyer.dashboard');
    }

    return $next($request); 
}

BuyerMiddleware

public function handle(Request $request, Closure $next)
{
    $user = $request->user('web');

    
    if (auth()->user()->is_seller == 1) {
        return to_route('user.dashboard');
    }

    return $next($request); 
}

Kernel

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\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::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,
            \App\Http\Middleware\UpdateLastActivity::class,
        ],

        'api' => [
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * 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,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'permissions' => \App\Http\Middleware\Permissions::class,
        'banuser' => \App\Http\Middleware\BanUser::class,
        'super' => \App\Http\Middleware\SuperAdmin::class,
        'otp' => \App\Http\Middleware\Otp::class,
        'kyc' => \App\Http\Middleware\KYC::class,
        'maintenance' => \App\Http\Middleware\MaintenanceMode::class,
        'buyer' => \App\Http\Middleware\BuyerMiddleware::class,
        'seller' => \App\Http\Middleware\Seller::class,

    ];

userRoute.php

 Route::post('/deposit/stripe-submit', [StripeController::class, 'store'])->name('user.deposit.stripe.submit');
  Route::get('deposit/stripe-submit', [StripeController::class,'success'])->name('user.deposit.stripe.success');

buyerRoute.php

   Route::middleware('auth')->group(function () {
    Route::middleware(BuyerMiddleware::class)->group(function () {
    Route::post('/deposit/stripe-submit', [StripeController::class, 'store'])->name('buyer.deposit.stripe.submit');
    Route::get('/deposit/stripe-submit', [StripeController::class,' success'])->name('buyer.deposit.stripe.success');
    });
});

Solution

  • I solved the problem by moving both routes to web.php.