Open6

Stripe ✖️ React での決済機能実装について

ピン留めされたアイテム
まさぴょんまさぴょん

Stripe React で、使用可能な Element コンポーネントまとめ🌟

https://docs.stripe.com/sdks/stripejs-react#available-element-components

コンポーネント名 説明
AddressElement 236種以上の地域別フォームで住所詳細を収集します。 住所Element をご覧ください。
AfterpayClearpayMessageElement Afterpay支払いの分割払いのメッセージを表示します。
AuBankAccountElement BECSダイレクトデビット支払いに使用する、オーストラリアの銀行口座情報(BSBと口座番号)を収集します。
CardCvcElement カードのセキュリティコードを収集します。
CardElement 必要なすべてのカード詳細を収集する柔軟な一行の入力。
CardExpiryElement カードの有効期限を収集します。
CardNumberElement カード番号を収集します。
ExpressCheckoutElement Apple Pay、Google Pay、Link、PayPalなど、複数の支払いボタンやカードまたはウォレットによる決済を簡単に行うことができます。 Express Checkout Element をご覧ください。
FpxBankElement FPX支払いに使用する顧客の銀行。
IbanElement 国際銀行口座番号(IBAN)、SEPAの国々に使用できます。
IdealBankElement iDEAL支払いに使用する顧客の銀行。
LinkAuthenticationElement メールアドレスを収集し、Linkへのログインをユーザーに許可します。 Link Authentication Element をご覧ください。
PaymentElement 世界中の25種類以上の支払い方法から、支払い情報を収集します。 Payment Element をご覧ください。
PaymentRequestButtonElement Apple Pay または Payment Request API によって処理されるオールインワンの決済ボタン。詳細については、支払いリクエストボタンのドキュメントをご覧ください。
ピン留めされたアイテム
まさぴょんまさぴょん

実際に実装したサービスの処理フロー by Code Rabbit 作図

  • FE:Next.js
    • 支払い情報を作成して、Hono API に送信する
  • BE:Hono
    • 支払い情報を受け取り、Stripe API を使って決済する
    • Stripe.PaymentIntentsResource.create() を使用したクレカ決済 (単発)
  • Payment Plattform:Stripe

まさぴょんまさぴょん

Stripe ✖️ React での決済機能実装について整理する🌟

Stripe Reactで使用可能なElementコンポーネントについて整理しました。

Stripe ✖️ React の Docがわかりやすい🙏
https://docs.stripe.com/sdks/stripejs-react#available-element-components

使用可能なElementコンポーネント一覧

  1. CardElement
    カード番号、有効期限、CVCコードなどの全てのカード情報を一つのUIで入力できるコンポーネント。

  2. CardNumberElement
    カード番号のみを入力するコンポーネント。

  3. CardExpiryElement
    カードの有効期限のみを入力するコンポーネント。

  4. CardCvcElement
    カードのCVCコードのみを入力するコンポーネント。

  5. PaymentRequestButtonElement
    Apple PayやGoogle Payなどの即時支払いオプションを提供するボタン。

  6. IbanElement
    ヨーロッパのIBAN形式の銀行口座番号を入力するためのコンポーネント。

  7. IdealBankElement
    オランダの銀行決済サービス「iDEAL」の銀行選択用コンポーネント。

  8. AuBankAccountElement
    オーストラリアの銀行口座情報を入力するためのコンポーネント。

  9. FpxBankElement
    マレーシアの銀行決済サービス「FPX」の銀行選択用コンポーネント。

  10. AfterpayClearpayMessageElement
    AfterpayやClearpayのプロモーションメッセージを表示するためのコンポーネント。

  11. AffirmMessageElement
    Affirmのプロモーションメッセージを表示するためのコンポーネント。

  12. PaymentElement
    複数の支払い方法を一つのUIに統合した最新の支払いコンポーネント。

  13. LinkAuthenticationElement
    Stripeの「Link」機能に関連したユーザー認証情報を入力するコンポーネント。

  14. AddressElement
    ユーザーの住所情報を入力するための汎用コンポーネント。

  15. ShippingAddressElement
    配送先の住所情報を入力するためのコンポーネント。

比較表

コンポーネント名 用途 特徴 対応地域
CardElement カード情報全体の入力 一つのUIで全てのカード情報を入力 全世界
CardNumberElement カード番号の入力 カード番号のみ個別に入力 全世界
CardExpiryElement カード有効期限の入力 有効期限のみ個別に入力 全世界
CardCvcElement カードCVCコードの入力 CVCコードのみ個別に入力 全世界
PaymentRequestButtonElement クイックペイメントオプションの提供 Apple Pay、Google Pay対応 対応地域のみ
IbanElement IBAN形式の銀行口座番号入力 ヨーロッパの銀行口座対応 ヨーロッパ
IdealBankElement iDEAL決済の銀行選択 オランダの銀行決済サービス オランダ
AuBankAccountElement オーストラリアの銀行口座情報入力 BSB番号と口座番号の入力 オーストラリア
FpxBankElement FPX決済の銀行選択 マレーシアの銀行決済サービス マレーシア
AfterpayClearpayMessageElement Afterpay/Clearpayのプロモーション表示 分割払いオプションのプロモーション 対応地域のみ
AffirmMessageElement Affirmのプロモーション表示 分割払いオプションのプロモーション 対応地域のみ
PaymentElement 複数支払い方法の統合入力 カード、Wallet、銀行決済などを一つに統合 全世界
LinkAuthenticationElement Link機能のユーザー認証 Emailアドレスと電話番号の認証 対応地域のみ
AddressElement 汎用的な住所情報の入力 請求先住所や個人情報の入力に使用 全世界
ShippingAddressElement 配送先住所情報の入力 配送オプションと連携可能 全世界

類似する用語・コンポーネントの比較

CardElementと個別のカード情報コンポーネント

  • CardElementはカード番号、有効期限、CVCコードなどを一つのUIで入力します。一方、CardNumberElementCardExpiryElementCardCvcElementはそれぞれの情報を個別に入力します。
  • メリットの比較:
    • CardElement: 実装が簡単で、フォームがシンプルになる。
    • 個別コンポーネント: レイアウトやスタイルを細かくカスタマイズできる。

AddressElementShippingAddressElement

  • AddressElementは請求先住所や一般的な住所情報の入力に使用されます。
  • ShippingAddressElementは配送先住所の入力に特化しており、配送オプションや送料計算と連携しやすい設計になっています。

PaymentElementCardElement

  • PaymentElementはカード情報だけでなく、複数の支払い方法(Wallet、銀行決済、分割払いなど)を一つのUIに統合しています。
  • CardElementはカード支払いに特化しています。
  • メリットの比較:
    • PaymentElement: 多様な支払いオプションを提供し、ユーザー体験を向上。
    • CardElement: 実装が軽量で、カード支払いのみを簡潔に提供。

まとめ

Stripe Reactでは、多様なニーズに対応するために多数のElementコンポーネントが提供されています。支払い方法や地域、カスタマイズの必要性に応じて適切なコンポーネントを選択することで、最適なユーザー体験を提供できます。

参考・引用

https://docs.stripe.com/sdks/stripejs-react

https://docs.stripe.com/sdks/stripejs-react#available-element-components

まさぴょんまさぴょん

Stripe Docの参考になるページ・まとめ

支払い受付フォームのカスタムフロー

https://docs.stripe.com/payments/accept-a-payment?platform=web&ui=elements

Stripe Web Elements カタログ

https://docs.stripe.com/payments/elements

カスタムの支払いフロー・Quick Start

https://docs.stripe.com/payments/quickstart

Stripe API の概要

https://docs.stripe.com/payments-api/tour

住所入力のStripe Component

https://docs.stripe.com/elements/address-element/collect-addresses?platform=web&client=react

まさぴょんまさぴょん

useStripe, useElements について整理

useStripeuseElements は、主にカード決済やその他の支払いフォームを作成するために使用されるフックで、それぞれ Stripe API のインスタンスや要素を管理する役割を持っています。

useStripe

useStripe フックは、Stripe.js のインスタンスにアクセスするために使用されます。
これにより、Stripe API の各種機能やメソッドを呼び出せるようになります。

特徴:

  • Stripe オブジェクトへの参照を取得でき、決済やトークン化などの操作が可能。
  • Elements コンポーネントの内側でのみ利用可能。アプリケーションのルートや適切な親コンポーネントで <Elements stripe={stripePromise}> のラップが必要。
  • 非同期で Stripe インスタンスを取得するため、null の可能性があり、初期化されるまでに条件分岐が必要になることがある。

使い方:

  1. useStripe を呼び出して、stripe オブジェクトを取得。
  2. stripe.confirmCardPaymentstripe.createToken などのメソッドを利用して、決済の確認やトークンの生成を行う。
import { useStripe } from '@stripe/react-stripe-js';

function PaymentForm() {
  const stripe = useStripe();

  const handleSubmit = async (event) => {
    event.preventDefault();
    if (!stripe) return; // Stripe がまだ読み込まれていない場合のガード

    const { paymentIntent, error } = await stripe.confirmCardPayment(clientSecret, {
      payment_method: {
        card: elements.getElement(CardElement),
      },
    });
    // エラーハンドリングなど
  };

  return <form onSubmit={handleSubmit}>{/* フォーム内容 */}</form>;
}

useElements

useElements フックは、Stripe の Elements インスタンスにアクセスするために使います。
Elements は、カード番号、CVC、などの各フィールドを管理し、セキュアに支払い情報を入力するための要素です。

特徴:

  • <Elements> コンポーネントの内部で呼び出し、Stripe の各要素(例: CardElement, CardNumberElement)を取得しやすくする。
  • 各要素は PCI 準拠のため、直接カード情報をアプリケーションで保持せず、安全なフォーム構築が可能。
  • elements.getElement() メソッドを使って、CardElement などの各要素への参照を取得し、トークン化や決済処理で利用する。

使い方:

  1. useElements を呼び出して、elements インスタンスを取得。
  2. elements.getElement(CardElement)CardElement 要素の参照を取得し、useStripe で取得した stripe オブジェクトと一緒に決済処理を行う。
import { useStripe, useElements, CardElement } from '@stripe/react-stripe-js';

function PaymentForm() {
  const stripe = useStripe();
  const elements = useElements();

  const handleSubmit = async (event) => {
    event.preventDefault();
    if (!stripe || !elements) return;

    const cardElement = elements.getElement(CardElement);

    const { error, paymentMethod } = await stripe.createPaymentMethod({
      type: 'card',
      card: cardElement,
    });

    if (error) {
      console.log('[error]', error);
    } else {
      console.log('[PaymentMethod]', paymentMethod);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <CardElement />
      <button type="submit" disabled={!stripe}>
        支払う
      </button>
    </form>
  );
}

まとめ

  • useStripeStripe オブジェクトの参照を取得し、決済やトークン生成の操作を行う。
  • useElementsElements インスタンスへの参照を取得し、カード情報のセキュアな要素を管理する。
  • 両者はセットで使うことが多く、stripeelements を使って支払いフォームや処理を安全に管理する。

<Elements> で全体をラップしてから、それぞれの要素や決済処理を行う設計が基本です。
このセットアップにより、Stripe でのカード情報入力や決済をセキュアに、シンプルに実装できます。