Techioz Blog

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