我正在尝试使用 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>
在控制器中:
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);
}
控制器方法的路由是Route::post('stripe', [StripeController::class, 'store'])->name('stripe-store');
请帮忙。
答案 0 :(得分:2)
在 VerifyCsrfToken
中添加您的路由 url。这将排除验证 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 由于 Stripe 不知道,来自 CSRF 保护的 webhook 处理程序路由 要发送到您的路由的 CSRF 令牌。通常,您应该放置 Web 中间件组之外的这些类型的路由 App\Providers\RouteServiceProvider 适用于 路由/web.php 文件。但是,您也可以通过以下方式排除路线 将它们的 URI 添加到 VerifyCsrfToken 的 $except 属性 中间件:
参考:https://laravel.com/docs/8.x/csrf#preventing-csrf-requests