问题: 因此,每当我单击激活 Javascript 代码的 HTML 按钮时,我都会在控制台中收到一条错误消息,指出: POST http://127.0.0.1:8000/ payment 419(状态未知)
我尝试过的
我尝试了不同的方法来让变量工作,用视图 JSON_ENCODE() 返回它,我一直在尝试研究如何在 Laravel 中使用 fetch,我觉得我错过了一些明显的东西。
这是我的 HTML 和 Javascript 代码:
<form action="/payment" method="POST">
@csrf
<button class="btn btn-primary py-3 px-4" id="checkout-button">Proceed to Checkout</button>
<script type="text/javascript">
// Create an instance of the Stripe object with your publishable API key
var stripe = Stripe('pk_test_*******************');
var checkoutButton = document.getElementById('checkout-button');
checkoutButton.addEventListener('click', function() {
// Create a new Checkout Session using the server-side endpoint you
// created in step 3.
fetch('/payment', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'url': '/payment',
},
})
.then(function(response) {
return response.json();
})
.then(function(session) {
return stripe.redirectToCheckout({ sessionId: session.id });
})
.then(function(result) {
// If `redirectToCheckout` fails due to a browser or network
// error, you should display the localized error message to your
// customer using `error.message`.
if (result.error) {
alert(result.error.message);
}
})
.catch(function(error) {
//console.error('Error:', error);
});
});
</script>
</form>
这是我的路线:
Route::post('/payment', [StripePaymentController::class, 'payment']);
这是我的控制器方法:
/* Sends the stripe key, and payment info to the stripe api, as long as the payment session */
public function payment() {
// Sets up the businesses secret key to receive the payment
\Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
// Sets up payment method, and product information
$session = \Stripe\Checkout\Session::create ([
'payment_method_types' => ['card'],
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => [
'name' => 'T-shirt',
],
'unit_amount' => 2000,
],
'quantity' => 1,
]],
'mode' => 'payment',
'success_url' => 'http://127.0.0.1:8000/',
'cancel_url' => 'http://127.0.0.1:8000/cart',
]);
return response()->json(['id' => $session->id]);
}
这是一个关于 CSRF 令牌不匹配的错误
您需要在获取请求中手动传递令牌
fetch('/payment', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'url': '/payment',
"X-CSRF-Token": document.querySelector('input[name=_token]').value
},
})
就我而言,我只是定义最小的获取,例如:
form.addEventListener('click', event => {
event.preventDefault()
event.stopPropagation()
const btn = event.target // submit button of the form
const form = btn.form // retrieve form
const sample_id = document.querySelector('#sample-id').value
const formData = new FormData(form)
formData.append('sample-id', sample_id)
fetch('/my-url/my-command', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': formData.get('_token')
},
body: formData
没有
content-type
,如https://stackoverflow.com/a/46640744/6614155中的建议
请注意,刀片文件中的表单是使用正确的方法正确制作的(在本例中为 POST ...如果使用 spatie :
html->form->('POST')
)...表单应该是带有 PUT 隐藏输入的 POST,例如,这很棘手找到这些错误!
然后在我的 Laravel 控制器中:
public function storeFromJs(Request $formDatas)
{
dd($formDatas);
// … $sample_id = $formDatas->input('sample-id');