Несколько вещей, во-первых, я бы выяснил, почему ваш createOrder занимает так много времени, от 3 до 4 секунд. Используйте очередь (https://laravel.com/docs/5.8/queues) и обработайте большую часть работы там.
Ваше решение должно работать нормально, если его поместить в начало контроллера. Возможно, я толстый, но вы хотитеотвергать те, где хэш совпадает, поэтому вам нужно удалить!
т.е.
if(hash_equals($request->session()->get('custom_token'), $request->custom_token)){
flash()->error('Order placed twice');
return redirect('/checkout/thank-you');
}
$request->session()->put('custom_token', Str::random(40));
Я предполагаю, что вы создаете свой хэш, сохраняете его и передаете его вам в форму, и онаправильно вернул ваш контроллер в запросе $? Попробуйте установить custom_token что-то вроде 'fred_bloggs' и просто убедитесь, что он входит правильно.