今後の支払いに備え、オーストラリアの BECS Direct Debit の詳細を保存する
今後のオーストラリアの BECS Direct Debit 支払いに備え、Setup Intents API を使用して決済手段の情報を保存します。
Stripe の事前構築された BECS 支払い詳細の収集用 UI である AuBECSDebitForm
を使用して、顧客の機密データを扱うことなく銀行口座の詳細を安全に収集できる決済フォームを作成します。Setup Intents API を使用して、事前に BECS ダイレクトデビットの決済手段の詳細を収集し、後から最終的な金額や支払い日を決定できます。この機能は以下の目的に利用できます。
- 支払い方法をウォレットに保存して、以降の購入を効率化する
- サービスの提供後に追加料金を回収する
- サブスクリプションの無料トライアルを開始する
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 { 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 を作成または取得するサーバー側
以降の支払いに BECS ダイレクトデビットの口座を再利用するには、その口座を Customer に関連付ける必要があります。
お客様のビジネスで顧客がアカウントを作成する際、Customer オブジェクトを作成します。この Customer オブジェクトの ID を、顧客を表す独自の内部表記と関連付けることで、保存されている支払い方法の詳細を後で取得して使用することができます。
新しい Customer を作成するか、または既存の Customer を取得して、この支払いに関連付けます。サーバに以下のコードを含め、新しい Customer を作成します。
支払い方法の詳細と同意書承認を収集するクライアント側
SDK が提供するドロップイン UI コンポーネント AuBECSDebitForm
を使用して、オーストラリアの BECS Direct Debit の支払い情報を安全に収集できます。AuBECSDebitForm
は、顧客が名前、メールアドレス、BSB 番号、口座番号を入力するための UI を提供するほか、オーストラリアの BECS Direct Debit 規約を表示します。
画面に、お客様の会社名をプロパティとして指定し、AuBECSDebitForm
コンポーネントを追加します。formStyle
プロパティを指定することにより、お客様のアプリのデザインに合わせて AuBECSDebitForm
をカスタマイズすることもできます。onComplete
プロパティを使用してフォーム詳細を収集します。
function BECSSetupFuturePaymentScreen() { const [formDetails, setFormDetails] = useState< AuBECSDebitFormComponent.FormDetails >(); return ( <View> <AuBECSDebitForm onComplete={(value) => setFormDetails(value)} companyName="Example Company Inc." formStyle={{ textColor: '#000000', fontSize: 22, placeholderColor: '#999999', }} /> <Button title="Save" variant="primary" onPress={handlePayPress} /> </View> ); }
SetupIntent を作成するサーバー側クライアント側
サーバー側
SetupIntent (支払い方法設定インテント) は、今後の支払いのために顧客の決済手段をセットアップするお客様の意図を表すオブジェクトです。SetupIntent
は、この設定プロセスのステップを追跡します。BECS ダイレクトデビットの場合、このステップには顧客からの同意書の収集と、ライフサイクル全体にわたる同意書の有効性の追跡が含まれます。
payment_method_types を au_
に設定してサーバーに SetupIntent (支払い方法設定インテント) を作成し、Customer の id を指定します。
サーバで SetupIntent
を作成した後、アプリケーションのデータモデルで現在のセッションの顧客に SetupIntent
ID を関連付けることができます。これを行うと、支払い方法の収集に成功した後で情報を取得できます。
返される SetupIntent
オブジェクトには、client_
プロパティが含まれています。この client secret をクライアント側のアプリケーションに渡して、設定プロセスを続行します。
クライアント側
クライアントで、サーバの SetupIntent をリクエストし、その client secret を格納します。
const fetchSetupIntentClientSecret = async (customerEmail: string) => { const response = await fetch(`${API_URL}/create-setup-intent`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: customerEmail, payment_method_types: ['au_becs_debit'], }), }); const {clientSecret, error} = await response.json(); return {clientSecret, error}; };
Stripe に支払い方法の詳細を送信するクライアント側
作成した SetupIntent から client secret を取得し、confirmSetupIntent
を呼び出します。これにより、WebView が表示され、顧客は銀行のウェブサイトまたはアプリで設定を完了できます。
function BECSSetupFuturePaymentScreen() { const { confirmSetupIntent } = useConfirmSetupIntent(); const [formDetails, setFormDetails] = useState< AuBECSDebitFormComponent.FormDetails >(); const handlePayPress = async () => { const { error, setupIntent } = await confirmSetupIntent(clientSecret, { paymentMethodType: 'AuBecsDebit', paymentMethodData: { formDetails, } }); if (error) { Alert.alert(`Error code: ${error.code}`, error.message); console.log('Setup intent confirmation error', error.message); } else if (setupIntent) { Alert.alert( `Success: Setup intent created. Intent status: ${setupIntent.status}` ); } }; return ( <View> <AuBECSDebitForm onComplete={(value) => setFormDetails(value)} companyName="Example Company Inc." formStyle={{ textColor: '#000000', fontSize: 22, placeholderColor: '#999999', }} /> <Button title="Save" variant="primary" onPress={handlePayPress} /> </View> ); }
構築したシステムをテストする
confirmSetupIntent
を呼び出す際に、テスト用の BSB 番号 000-000
と、以下のいずれかのテストアカウント番号を使用して、フォームをテストします。
BSB 番号 | 口座番号 | 説明 |
---|---|---|
000-000 | 000123456 | 生成された PaymentMethod で作成された PaymentIntent は、processing から succeeded に変わります。同意書のステータスは引き続き active です。 |
000-000 | 900123456 | 生成された PaymentMethod で作成された PaymentIntent は、processing から succeeded に変わります (3 分の遅延あり)。同意書のステータスは引き続き active です。 |
000-000 | 111111113 | 生成された PaymentMethod で作成された PaymentIntent は、processing から requires_ に変わり、account_ エラーコードが返されます。同意書のステータスはその時点で inactive になります。 |
000-000 | 111111116 | 生成された PaymentMethod で作成された PaymentIntent は、processing から requires_ に変わり、no_ エラーコードが返されます。同意書のステータスはその時点で inactive になります。 |
000-000 | 222222227 | 生成された PaymentMethod で作成された PaymentIntent は、processing から requires_ に変わり、refer_ エラーコードが返されます。同意書のステータスは引き続き active です。 |
000-000 | 922222227 | 生成された PaymentMethod で作成された PaymentIntent は、processing から requires_ に変わり、refer_ エラーコードが返されます (3 分の遅延あり)。同意書のステータスは引き続き active です。 |
000-000 | 333333335 | 生成された PaymentMethod で作成された PaymentIntent は、processing から requires_ に変わり、debit_ エラーコードが返されます。同意書のステータスはその時点で inactive になります。 |
000-000 | 666666660 | 生成された PaymentMethod で作成された PaymentIntent は、processing から succeeded に変わりますが、不審請求の申請が直ちに作成されます。 |
000-000 | 343434343 | The PaymentIntent that was created with the resulting PaymentMethod fails with a charge_ error due to the payment amount causing the account to exceed its weekly payment volume limit. |
000-000 | 121212121 | The PaymentIntent that was created with the resulting PaymentMethod fails with a charge_ error due to the payment amount exceeding the account’s transaction volume limit. |