前提・実現したいこと
フロントエンドとバックエンドでサーバーを分けて開発をしています
・フロントエンド: Nuxt.js, Netlify
・バックエンド: Laravel, Heroku
バックエンドでstripeのcheckoutページを作成して、決済画面にリダイレクトさせたいのですがCORSエラーが発生しました。
発生している問題・エラーメッセージ
CORSエラーが発生しています。
Access to XMLHttpRequest at 'https://checkout.stripe.com/pay/cs_test_XXXXX' (redirected from 'https://liff-nuxt-laravel-ec.herokuapp.com/api/stripe/store') from origin 'https://deploy-preview-4--liff-nuxt-laravel-ec.netlify.app' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
該当のソースコード
フロントエンド
vue:checkout.vue
1<template> 2 <div class="card"> 3 <img class="card-product-img" :src="this.$route.query.image" /> 4 <p class="card-product-name">{{ this.$route.query.name }}</p> 5 <p class="card-product-price">¥{{ this.$route.query.price }}</p> 6 <div class="button"> 7 <button type="submit" class="button-btn" @click="buyProducts">購入する</button> 8 </div> 9 </div> 10</template> 11 12<script> 13export default { 14 head: { 15 script: [ 16 { 17 src: 'https://js.stripe.com/v3/', 18 }, 19 ], 20 }, 21 methods: { 22 async buyProducts() { 23 const res = await this.$axios.$post('/stripe/store', { 24 productImage: this.$route.query.image, 25 productName: this.$route.query.name, 26 productPrice: this.$route.query.price, 27 productStripePriceApi: this.$route.query.stripePriceApi, 28 }); 29 console.log(res); 30 }, 31 }, 32}; 33</script>
バックエンド
php:
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use Stripe\Stripe; 7use Stripe\Checkout\Session; 8 9class PayloadController extends Controller 10{ 11 public function store(Request $request) 12 { 13 // API 14 $stripeApiKey = config("env.stripe_api_key"); 15 Stripe::setApiKey($stripeApiKey); 16 17 // header 18 header('Content-Type: application/json'); 19 20 // domain(仮ドメイン) 21 $domain = "https://deploy-preview-4--liff-nuxt-laravel-ec.netlify.app"; 22 23 // product 24 $productImage = $request->input("productImage"); 25 $productName = $request->input("productName"); 26 $productPrice = $request->input("productPrice"); 27 $productStripePriceApi = $request->input("productStripePriceApi"); 28 29 // checkout 30 $checkout_session = Session::create([ 31 'payment_method_types' => ['card'], 32 'line_items' => [[ 33 'price' => $productStripePriceApi, 34 'quantity' => 1, 35 ]], 36 'mode' => 'payment', 37 'success_url' => $domain . '/success', 38 'cancel_url' => $domain . '/cancel', 39 ]); 40 41 return redirect($checkout_session->url, 303, [], true); 42 } 43}
CORS
php:Cors.php
1<?php 2 3namespace App\Http\Middleware; 4 5use Closure; 6 7class Cors 8{ 9 public function handle($request, Closure $next) 10 { 11 return $next($request) 12 ->header('Access-Control-Allow-Origin', '*') 13 ->header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') 14 ->header('Access-Control-Allow-Headers', 'Content-Type, X-XSRF-TOKEN'); 15 } 16}
考えたこと
Access-Control-Allow-Origin: *
と指定しているので、どのドメインに対してもCORSはうまくいくと思っていました。
リダイレクトを行うときには別のheader情報を付与する必要があるのかと思い調べてみました。
https://rinoguchi.net/2019/05/302-redirect-cors.html
上記の記事内では302を使う場合、CORSエラーが発生し、対策としては302をやめるしかないとのことでした。
2点質問があります。
①私も同様に、303リダイレクトをやめるべきなのでしょうか?
②バックエンド側でリダイレクトが使えないのならば、「このURLをフロントエンド側に渡して、フロントエンド側でページ移動を行う」というものは考えついたのですが、そのような対応でいいのでしょうか?
ご確認よろしくお願いいたします。
追記
404エラーのRequest Headers情報です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/28 01:37
2021/07/28 09:14
2021/07/28 09:22
2021/07/28 09:42