簡體   English   中英

Laravel 條紋結帳:419(未知狀態)

[英]Laravel Stripe checkout: 419 (unknown status)

我正在嘗試使用 Stripe 上托管的付款頁面使用 Stripe 結帳。 Stripe 文檔適用於純 PHP。 但是對於 Laravel,它不會重定向到 Stripe 支付頁面。 在控制台中,它顯示POST http://127.0.0.1:8000/stripe 419 (unknown status)Error: SyntaxError: Unexpected token < in JSON at position 0 根據一些帖子,我在VerifyCsrfToken中間件中添加了https://checkout.stripe.com/

結帳頁面:

<head>
    ...
    <script src="https://polyfill.io/v3/polyfill.min.js?version=3.52.1&features=fetch"></script>
    <script src="https://js.stripe.com/v3/"></script>
</head>
<body>
<button type="button" id="checkout-button">Checkout</button>
<script type="text/javascript">
    var stripe = Stripe("{{ env('STRIPE_KEY') }}");;
    var checkoutButton = document.getElementById("checkout-button");
    checkoutButton.addEventListener("click", function () {
        fetch("{{ route('stripe-store') }}", {
            method: "POST",
        })
            .then(function (response) {
                return response.json();
            })
            .then(function (session) {
                return stripe.redirectToCheckout({ sessionId: session.id });
            })
            .then(function (result) {
                if (result.error) {
                    alert(result.error.message);
                }
            })
            .catch(function (error) {
                console.error("Error:", error);
            });
    });
</script>

在 controller 中:

public function store(Request $request)
{
    Stripe::setApiKey(env('STRIPE_SECRET'));
    header('Content-Type: application/json');
    $checkout_session = Session::create([
        'payment_method_types' => ['card'],
        'line_items' => [[
            'price_data' => [
                'currency' => 'usd',
                'unit_amount' => 2000,
                'product_data' => [
                    'name' => 'Stubborn Attachments',
                ],
            ],
            'quantity' => 1,
        ]],
        'mode' => 'payment',
        'success_url' => route('welcome'),
        'cancel_url' => route('welcome'),
    ]);
    echo json_encode(['id' => $checkout_session->id], JSON_THROW_ON_ERROR);
}

controller 方法的路由是Route::post('stripe', [StripeController::class, 'store'])->name('stripe-store');

請幫忙。

在 VerifyCsrfToken 中添加您的路線VerifyCsrfToken 。這將排除驗證 csrf 令牌。您可以在App\Http\Middleware路徑文件夾中找到此中間件

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe',
       
    ];
}

正如官方文檔所說

有時您可能希望從 CSRF 保護中排除一組 URI。 例如,如果您使用 Stripe 處理付款並使用他們的 webhook 系統,則需要將您的 Stripe webhook 處理程序路由從 CSRF 保護中排除,因為 Stripe 不會知道要向您的路由發送什么 CSRF 令牌。 通常,您應該將這些類型的路由放在 web 中間件組之外,App\Providers\RouteServiceProvider 應用於 routes/web.php 文件中的所有路由。 但是,您也可以通過將路由的 URI 添加到 VerifyCsrfToken 中間件的 $except 屬性來排除路由:

參考: https://laravel.com/docs/8.x/csrf#preventing-csrf-requests

暫無
暫無

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

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