Stripe.js はユーザーを URL に転送しますが、paymentIntent のステータスは「requires_payment_method」です
概要
Stripe.js PaymentElement を使用してストライプ ワークフローを設定しています。支払いは決済され、ユーザーは stripe に指定された URL にリダイレクトされます。ただし、バックエンドがpaymentIntentのステータスをクエリすると、ステータスは数秒間「requires_payment_method」になります。
フロントエンドは React、バックエンドは Ruby on Rails です。
インテントは次のように作成されます。
intent =
Stripe::PaymentIntent.create(
{
amount: my_amount,
currency: "usd",
automatic_payment_methods: {
enabled: true,
},
metadata: {
#...
},
},
)
render json: { client_secret: intent.client_secret, pi_id: intent.id }
これは支払いを送信するハンドラーです。
const stripe = useStripe();
const elements = useElements();
const handleSubmit: React.FormEventHandler = async (event) => {
event.preventDefault();
// Stripe.js has not yet loaded.
if (!stripe || !elements) return;
const paymentElement = elements.getElement('payment');
if (!paymentElement) return;
await stripe
.confirmPayment({
elements,
confirmParams: {
return_url: my_url,
},
});
};
これは、コントローラ上で my_url のインテントがクエリされる方法です。
payment_intent = Stripe::PaymentIntent.retrieve({ id: params[:pi_id] })
raise "Payment Error" unless payment_intent.status == "succeeded"
ユーザーが新しいページに転送された後、支払い意図は「成功」ステータスになると予想します。ただし、「requires_payment_method」ステータスになることがよくあります。 IRB からインテントを再クエリすると、インテントは数秒後に最終的に「成功」として解決されます。毎回これをポーリングする必要がありますか?
解決策
支払いの確認が完了し、支払いが成功するまでに数秒かかります。 Payment Intent をポーリングすることはできますが、代わりに行うべきことは、Webhook リスナーを設定し、payment_intent.succeeded イベントを処理して、支払いがいつ成功に移行したかを判断することです。
https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://stripe.com/docs/payments/accept-a-payment?platform=web&ui=elements#web-post-payment