Sofort での支払いを受け付ける
ヨーロッパで一般的な支払い方法である Sofort を受け付ける方法をご紹介します。
警告
SOFORT has been discontinued as of March 31, 2025. For more information, read our support page.
注意
サーバー側での手動確定を使用する必要がある場合、またはお使いの実装で決済手段を別途表示する必要がある場合を除き、決済を受け付けるガイドに従うことをお勧めします。すでに Elements との連携が完了している場合は、Payment Element 移行ガイドをご覧ください。
Sofort は 1 回限りの使用の、通知遅延型の支払い方法であり、顧客は支払いの認証を求められます。顧客が Sofort で支払う場合は、アプリから銀行のポータルにリダイレクトされ、そこで支払いの認証を行います。成功または失敗の通知を受け取るまでに、通常 2 〜 14 日かかります。
注
Sofort を受け付けるには、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> ); }
PaymentIntent を作成するサーバ側クライアント側
PaymentIntent (支払いインテント) は、顧客から支払いを回収する意図を示し、支払いプロセスのライフサイクルを追跡します。
サーバ側
サーバーで PaymentIntent
を作成し、回収する amount
と eur
通貨を指定します (Sofort は他の通貨に対応していません)。既存の Payment Intents のシステムがある場合は、sofort
を支払い方法タイプのリストに追加します。
使用言語の変更
デフォルトでは、Stripe は指定された国コードに基づいた言語で Sofort オーソリページを表示します。リクエストの一部として国コードを指定し、preferred_
プロパティの値を変更することで、オーソリページを顧客の希望言語にカスタマイズできます。サポートされている値は、de
、en
、es
、it
、fr
、nl
、および pl
です。
PaymentIntent オブジェクト全体をアプリに渡す代わりに、その client secret を返します。PaymentIntent の client secret は、支払い額などの機密情報の操作を許可することなく、クライアントで支払いを確定し、支払い情報の詳細を更新できる一意のキーです。
クライアント側
クライアントで、サーバの 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: ['sofort'], }), }); const { clientSecret, error } = await response.json(); return { clientSecret, error }; };
支払い方法の詳細を収集する
アプリで顧客のメールアドレスを収集します。
export default function SofortPaymentScreen() { const [email, setEmail] = useState(); const handlePayPress = async () => { // ... }; return ( <Screen> <TextInput placeholder="E-mail" onChange={(value) => setEmail(value.nativeEvent.text)} /> </Screen> ); }
Stripe に支払いを送信する
作成した PaymentIntent から client secret を取得し、confirmPayment
をコールします。これにより、WebView が表示され、顧客はここから銀行の Web サイトまたはアプリで支払いを完了できます。完了後、支払い結果によって Promise が解決されます。
export default function SofortPaymentScreen() { const [email, setEmail] = useState(); const billingDetails: PaymentMethodCreateParams.BillingDetails = { name: 'John Doe', }; const { error, paymentIntent } = await confirmPayment(clientSecret, { paymentMethodType: 'Sofort', paymentMethodData: { billingDetails, country: 'DE', } }); if (error) { Alert.alert(`Error code: ${error.code}`, error.message); } else if (paymentIntent) { Alert.alert( 'Success', `The payment was confirmed successfully! currency: ${paymentIntent.currency}` ); } return ( <Screen> <TextInput placeholder="E-mail" onChange={(value) => setEmail(value.nativeEvent.text)} /> </Screen> ); }
支払い後のイベントを処理する
As Sofort is a delayed notification payment method, the PaymentIntent’s status remains in a payment_intent.processing state for up to 14 days from its creation (also known as the cutoff date). In a sandbox, the PaymentIntent’s status remains in the processing state for three minutes to simulate this.
- Stripe では、処理中の状態の間に購入をフルフィルメントすることをお勧めします。平均して、処理中状態に入った後に Sofort の支払い試行が失敗する確率は 0.2% と予測されます。この方法は、Sofort の支払いの失敗率が低い Sofort にのみ適用でき、他の遅延通知型の支払い方法には適用できません。
- 必要に応じて、payment_intent.succeeded イベントを受け取った後にのみ注文をフルフィルメントすることもできます。Stripe では、支払いが確定され、売上が保証された後でこのイベントを送信します。
- 顧客が支払いを行わない場合、Stripe は payment_intent.failed イベントを送信し、PaymentIntent は
requires_
ステータスに戻ります。payment_ method
ダッシュボード、カスタム Webhook、またはパートナーソリューションを使用して、これらのイベントを受信し、顧客への注文確認メールの送信、データベースへの売上の記録、配送ワークフローの開始などのアクションを実行します。
手動
Stripe ダッシュボードは、すべての Stripe での支払いの確認、メール領収書の送信、入金処理、または失敗した支払いの再試行に使用できます。
カスタムコード
Webhook ハンドラを作成してイベントをリッスンし、非同期型のカスタムの支払いフローを作成します。Stripe CLI を使用して、ローカルで Webhook 組み込みのテストとデバッグを行います。
事前構築のアプリ
オートメーションやマーケティングとセールスなどの一般的なビジネスイベントを、パートナーアプリケーションとの連携によって処理します。
不審請求が申請された支払い
顧客が銀行で支払いを許可する必要があるため、不正使用や未認識の支払いのリスクは低くなります。このため、チャージバックに発展する不審請求の申請を受けて、Stripe アカウントから売上が引き出されることはありません。
支払いの失敗
カットオフ時間内に支払い処理が確定されなかった場合は、PaymentIntent (支払いインテント) オブジェクトのステータスが自動的に processing
から requires_
に移行します。また、売上がカットオフ日以降に受け取られた場合は、顧客に自動的に返金されます。
平均して、Sofort の支払い処理の約 0.2% が失敗すると予測されます。この数値は、業種や顧客ベースによって異なります。支払い平均額、取り扱う商品やサービスのタイプ、およびビジネスに付随するリスクによっては、payment_
イベントを受信してからのみ注文のフルフィルメントを行うようにすることもできます。
返金
Sofort は、元の支払い日から 180 日以内の返金リクエストのみを受け付けます。180 日を過ぎると、支払いの返金を実行できなくなります。
まだ確定されていない保留中の支払いに対して返金することができます。PaymentIntent のステータスが processing
の際に全額返金または一部返金を作成する場合、返金は PaymentIntent のステータスが succeeded
になるまで実行されません。支払いの試行が失敗した後の PaymentIntent のステータスが requires_
の場合、資金が顧客の銀行口座から移動していないため、全額返金および一部返金はキャンセルとしてマークされます。