Этот вопрос закрыт для ответов, так как повторяет вопрос Как передать csrf token вместе с платежом Интеркассы в Laravel?
iNickolay
@iNickolay

Как бороться с ошибкой 419?

Здравствуйте! Впервые сталкиваюсь с данной ошибкой - даже не знаю в какую сторону копать.
При попытке добавить Яндекс.Кассу на сайт не приходят уведомления (после успешной оплаты пользователем на определённый URL яндекс отправляет, как я понял, POST-запрос с данными).
Вот несколько ключевых роутов:

Route::post('/money/recharge', 'MoneyController@recharge')->name('money.recharge'); # Здесь обработчик формы, где указано только кол-во денег :)
Route::any('/get-notifications', 'MoneyController@confirm'); # Не был уверен какой тип запроса


Вот код контроллера:
class MoneyController extends Controller
{

    public function recharge(Request $request)
    {
        $request->validate(['amount' => 'required|numeric|max:10000|min:10']);

        $client = new Client();
        $client->setAuth('id', 'key');

        $idempotenceKey = uniqid('', true);

        $response = $client->createPayment([
            'amount'              => [
                'value'    => $request->input('amount'),
                'currency' => 'RUB'
            ],
            'payment_method_data' => [
                'type' => 'bank_card'
            ],
            'confirmation'        => [
                'type'       => 'redirect',
                'return_url' => 'https://somesite.ru/profile/recharge'
            ],
            'metadata' => [
                'user_id' => $request->user()->id
            ]
        ], $idempotenceKey);

        Payment::create([
            'user_id' => $request->user()->id,
            'unique_id' => $response->id,
            'amount' => $request->input('amount')
        ]);

        return redirect($response->confirmation->confirmationUrl);
    }

    public function confirm(Request $request)
    {
        Log::info('payment request', ['request_all' => $request->all()]); # Просто пытаюсь понять, обращается ли что-то к странице.

        return 'confirmed';
    }

}


На страницу платежа переходит, платёж проводит, но никакого уведомления нет.

После общения с тех поддержкой выяснилось:
К сожалению, Ваш последний платеж не прошел по той причине, что при доставке уведомления по адресу https://somesite.ru/get-notifications мы получаем http код 419.


Никогда не сталкивался с данным кодом, и в специфицации его нет, но вот что подсказали:
419 код - тайм-аут проверки подлинности. Другими словами запрос, требующий авторизации пользователя, не может быть обработан, так как время проверки подлинности истекло.


Но я не пойму о какой проверки идёт речь? Ведь нет никаких авторизаций/проверок.
  • Вопрос задан
  • 2176 просмотров
Решения вопроса 2
DJZT
@DJZT
Laravel - code for you
Отключите CSRF на этих роутах. Но это не безопасно.
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы