SEPA ダイレクトデビットによる支払いを受け付ける
SEPA ダイレクトデビット支払いの受け付けについて説明します。
注意
サーバー側での手動確定を使用する必要がある場合、またはお使いの実装で決済手段を別途表示する必要がある場合を除き、決済を受け付けるガイドに従うことをお勧めします。すでに Elements との連携が完了している場合は、Payment Element 移行ガイドをご覧ください。
Web サイトでの SEPA ダイレクトデビット支払いの受け付けは、支払いを追跡するオブジェクトの作成、支払い方法に関する情報と同意書承認の収集、および支払いを処理するための Stripe への支払いの送信で構成されます。Stripe はこの PaymentIntent と呼ばれる支払いオブジェクトを使用して、支払いが完了するまで、支払いのすべての状態の追跡と処理を行います。
SEPA ダイレクトデビットの PaymentMethod は、顧客に Bancontact、iDEAL、または Sofort を使用した銀行情報の認証を依頼することによっても設定できます。
Stripe を設定するサーバ側クライアント側
サーバ側
この組み込みには、Stripe API と通信するエンドポイントがサーバ上に必要です。Stripe の公式ライブラリを使用して、サーバから Stripe API にアクセスします。
クライアント側
React Native SDK はオープンソースであり、詳細なドキュメントが提供されています。内部では、ネイティブの iOS および Android の SDK を使用します。Stripe の React Native SDK をインストールするには、プロジェクトのディレクトリーで (使用するパッケージマネージャーによって異なる) 次のいずれかのコマンドを実行します。
次に、その他の必要な依存関係をインストールします。
- iOS の場合は、ios ディレクトリーに移動して
pod install
を実行し、必要なネイティブ依存関係もインストールします。 - Android の場合は、依存関係をインストールする必要はありません。
Stripe の初期化
React Native アプリで Stripe を初期化するには、決済画面を StripeProvider
コンポーネントでラップするか、initStripe
初期化メソッドを使用します。publishableKey
の API 公開可能キーのみが必要です。次の例は、StripeProvider
コンポーネントを使用して Stripe を初期化する方法を示しています。
import React, { useState, useEffect } from 'react'; import { StripeProvider } from '@stripe/stripe-react-native'; function App() { const [publishableKey, setPublishableKey] = useState(''); const fetchPublishableKey = async () => { const key = await fetchKey(); // fetch key from your server here setPublishableKey(key); }; useEffect(() => { fetchPublishableKey(); }, []); return ( <StripeProvider publishableKey={publishableKey} merchantIdentifier="merchant.identifier" // required for Apple Pay urlScheme="your-url-scheme" // required for 3D Secure and bank redirects > // Your app code here </StripeProvider> ); }
Customer を作成または取得するサーバ側
以降の支払いに SEPA ダイレクトデビットの口座を再利用するには、その口座を Customer に関連付ける必要があります。
顧客がお客様のビジネスでアカウントを作成する際、Customer オブジェクトを作成してください。この Customer オブジェクトの ID を、顧客を表す独自の内部表記と関連付けることで、保存した支払い方法の詳細を後で取得して使用することができます。
新しい Customer を作成するか、または既存の Customer を取得して、この支払いに関連付けます。サーバに以下のコードを含め、新しい Customer を作成します。
PaymentIntent を作成するサーバ側クライアント側
サーバ側
PaymentIntent (支払いインテント) は、顧客から支払いを回収する意図を表すオブジェクトであり、支払いプロセスのライフサイクルの各段階を追跡します。まず、サーバーで PaymentIntent を作成し、回収する金額と eur
通貨を指定します (SEPA ダイレクトデビットは他の通貨には対応していません)。すでに Payment Intents API を使用したシステムがある場合は、sepa_
を PaymentIntent の支払い方法タイプのリストに追加します。Customer の id を指定します。
再利用するために SEPA ダイレクトデビットの口座を保存するには、setup_future_usage パラメーターを off_
に設定します。SEPA ダイレクトデビットはこのパラメーターの値として off_
のみを受け付けます。
クライアント側
クライアント側で、サーバーの PaymentIntent をリクエストし、その client secret を保存します。
const fetchPaymentIntentClientSecret = async () => { const response = await fetch(`${API_URL}/create-payment-intent`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, currency: 'eur', payment_method_types: ['sepa_debit'], }), }); const {clientSecret, error} = await response.json(); return {clientSecret, error}; };
支払い方法の詳細と同意書承認を収集するクライアント側
決済フォームで顧客の IBAN を収集し、顧客が黙示的にこの同意書に署名するように以下の標準オーソリテキストを表示します。
以下に示す定型の承認用文書を表示し、顧客が黙示的にこの同意書に署名するようにしてください。
「Rocket Rides」はお客様の社名に置き換えます。
支払い方法を設定するか、PaymentIntent を確定すると、承認済みの同意書が作成されます。顧客は黙示的に同意書に署名したため、フォームまたはメールを通じて、顧客にこれらの規約を伝える必要があります。
export default function SepaPaymentScreen() { const [email, setEmail] = useState(''); const [iban, setIban] = useState(''); return ( <Screen> <TextInput placeholder="E-mail" keyboardType="email-address" onChange={(value) => setEmail(value.nativeEvent.text)} style={styles.input} /> <TextInput placeholder="Iban" onChange={(value) => setIban(value.nativeEvent.text.toLowerCase())} style={styles.input} /> <Button variant="primary" onPress={handlePayPress} title="Save IBAN" loading={loading} /> </Screen> ); }
Stripe に支払いを送信するクライアント側
作成した PaymentIntent から client secret を取得し、confirmPayment
を呼び出します。
client secret は支払いを完了できるため、慎重に扱う必要があります。記録したり、URL に埋め込んだり、当該の顧客以外に漏洩することがないようにしてください。
注
IBAN に国コード AD、PF、TF、GI、GB、GG、VA、IM、JE、MC、NC、BL、PM、SM、CH、WF が含まれる場合は、billingDetails
に addressCountry
と addressLine1
を指定する必要があります。住所フィールドの一覧については、React Native SDK リファレンスをご覧ください。
export default function SepaPaymentScreen() { const [iban, setIban] = useState(''); const {confirmPayment, loading} = useConfirmPayment(); const handlePayPress = async () => { const { clientSecret, error: clientSecretError, } = await fetchPaymentIntentClientSecret(); if (clientSecretError) { Alert.alert(`Error`, clientSecretError); return; } const billingDetails: PaymentMethodCreateParams.BillingDetails = { name: 'Jenny Rosen', email: 'jenny.rosen@example.com', }; const {error, paymentIntent} = await confirmPayment(clientSecret, { paymentMethodType: 'SepaDebit', paymentMethodData: { billingDetails, iban, }, }); if (error) { Alert.alert(`Error code: ${error.code}`, error.message); } else if (paymentIntent) { if (paymentIntent.status === PaymentIntents.Status.Processing) { Alert.alert( 'Processing', `The debit has been successfully submitted and is now processing.`, ); } else if (paymentIntent.status === PaymentIntents.Status.Succeeded) { Alert.alert( 'Success', `The payment was confirmed successfully! currency: ${paymentIntent.currency}`, ); } else { Alert.alert('Payment status:', paymentIntent.status); } } }; return <Screen>{/* ... */}</Screen>; }
PaymentIntent の成功を確認する
SEPA ダイレクトデビットは、通知遅延型の支払い方法であるため、売上はすぐに利用可能にはなりません。支払いが正常に送信されると、PaymentIntent のステータスが requires_
から processing
に更新されます。支払いが成功すると、PaymentIntent のステータスが processing
から succeeded
に更新されます。
PaymentIntent のステータスが更新されると、以下のイベントが送信されます。
イベント | 説明 | 次のステップ |
---|---|---|
payment_ | 顧客の支払いは、Stripe に正常に送信されました。 | 開始された支払いの成功、または失敗の結果を待ちます。 |
payment_ | 顧客の決済が成功しました。 | 顧客が購入した商品またはサービスのフルフィルメントを行います。 |
payment_ | 顧客の支払いが拒否されました。 | Contact the customer through email or push notification and request another payment method. |
支払いが成功したことを確認し、顧客に支払い完了を通知するには、Webhook を使用することをお勧めします。
setup_future_usage および customer が設定されているため、支払いが processing
状態になると、PaymentMethod が Customer オブジェクトに関連付けられることに注意してください。この関連付けは、支払いが最終的に成功するか、失敗するかには関係なく行われます。
組み込みをテストする
SEPA ダイレクトデビットのテスト用アカウント番号を confirmSepaDebitPayment リクエストで使用することにより、フォームをテストできます。