Revolut Pay による決済を受け付ける
システムに Revolut Pay のサポートを追加します。
Stripe を設定するサーバー側クライアント側
Stripe アカウントを作成して開始します。
サーバー側
この実装は、Stripe API と通信するサーバー上にエンドポイントを必要とします。サーバーから Stripe API へのアクセスには、次のように Stripe の公式ライブラリを使用します。
クライアント側
React Native SDK はオープンソースであり、詳細なドキュメントが提供されています。内部では、ネイティブの iOS および Android の SDK を使用します。Stripe の React Native SDK をインストールするには、プロジェクトのディレクトリーで (使用するパッケージマネージャーによって異なる) 次のいずれかのコマンドを実行します。
次に、その他の必要な依存関係をインストールします。
- For iOS, go to the ios directory and run
pod install
to ensure that you also install the required native dependencies. - Android の場合は、依存関係をインストールする必要はありません。
注
公式の TypeScript ガイドに従って TypeScript のサポートを追加することをお勧めします。
Stripe の初期化
React Native アプリで Stripe を初期化するには、決済画面を StripeProvider
コンポーネントでラップするか、initStripe
初期化メソッドを使用します。publishableKey
の API 公開可能キーのみが必要です。次の例は、StripeProvider
コンポーネントを使用して Stripe を初期化する方法を示しています。
import { 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
を作成して確定するには、以下の手順に従います。
- 回収する金額と通貨を指定します。
PaymentIntent
の支払い方法のタイプのリストにrevolut_
を追加します。ダッシュボードで Revolut Pay が有効になっていることを確認してください。pay
返される PaymentIntent には client secret が含まれ、これは PaymentIntent の確定に使用されます。次のステップで使用できるように、クライアントに client secret を送り返します。
クライアント側
クライアント側で、サーバーの PaymentIntent をリクエストし、その client secret を保存します。
function PaymentScreen() { const fetchPaymentIntentClientSecret = async () => { const response = await fetch(`${API_URL}/create-payment-intent`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ currency: 'gbp', }), }); const {clientSecret} = await response.json(); return clientSecret; }; const handlePayPress = async () => { // See below }; return ( <View> <Button onPress={handlePayPress} title="Pay" /> </View> ); }
client secret は、Stripe API リクエストを認証する API キーとは異なります。これは支払いを完了できるため、慎重に扱う必要があります。記録したり、URL に埋め込んだり、当該の顧客以外に漏洩することがないようにしてください。
戻り先 URL を設定する (iOS のみ)クライアント側
顧客がアプリを終了すると (Safari やバンキングアプリで認証するなど)、自動的にアプリに戻るための方法を提供します。多くの決済手段タイプで、戻り先 URL の指定が「必須」です。戻り先 URL を有効にしていても、指定がされていないと、戻り先 URL が必要な決済手段をユーザーに提示できません。
戻り先 URL を指定するには、以下のようにします。
- カスタム URL を登録します。ユニバーサルリンクはサポートされていません。
- カスタム URL を設定 します。
- 以下のように、URL を Stripe SDK に転送するようにルートコンポーネントを設定します。
注
Expo を使用している場合は、app.
ファイルでスキームを設定します。
import { useEffect, useCallback } from 'react'; import { Linking } from 'react-native'; import { useStripe } from '@stripe/stripe-react-native'; export default function MyApp() { const { handleURLCallback } = useStripe(); const handleDeepLink = useCallback( async (url: string | null) => { if (url) { const stripeHandled = await handleURLCallback(url); if (stripeHandled) { // This was a Stripe URL - you can return or add extra handling here as you see fit } else { // This was NOT a Stripe URL – handle as you normally would } } }, [handleURLCallback] ); useEffect(() => { const getUrlAsync = async () => { const initialUrl = await Linking.getInitialURL(); handleDeepLink(initialUrl); }; getUrlAsync(); const deepLinkListener = Linking.addEventListener( 'url', (event: { url: string }) => { handleDeepLink(event.url); } ); return () => deepLinkListener.remove(); }, [handleDeepLink]); return ( <View> <AwesomeAppComponent /> </View> ); }
Revolut Pay での決済を確定するクライアント側
顧客が Revolut Pay での支払いを試みてタップすると、confirmPayment を呼び出して支払いを完了します。これにより WebView が表示され、顧客はそこから Revolut Pay で支払いを完了できます。完了後、プロミスは、paymentIntent
フィールド、または支払いでエラーが発生した場合には error
フィールドのどちらかを格納したオブジェクトで解決されます。
import {useConfirmPayment} from '@stripe/stripe-react-native'; function PaymentScreen() { const {confirmPayment, loading} = useConfirmPayment(); const fetchPaymentIntentClientSecret = async () => { // See above }; const handlePayPress = async () => { // Fetch the client secret from the backend. const clientSecret = await fetchPaymentIntentClientSecret(); const {error, paymentIntent} = await confirmPayment(clientSecret, { paymentMethodType: 'RevolutPay', }); if (error) { console.log('Payment confirmation error: ', error); } else if (paymentIntent) { console.log('Successfully confirmed payment: ', paymentIntent); } }; return ( <View> <Button onPress={handlePayPress} title="Pay" disabled={loading} /> </View> ); }
実装をテストする
テスト API キーを使用して Revolut Pay の導入をテストするには、リダイレクトページを表示します。リダイレクトページで支払いを認証することにより、支払い成功のケースをテストできます。PaymentIntent (支払いインテント) は requires_
から succeeded
に変化します。
ユーザーが認証に失敗するケースをテストするには、テスト API キーを使用してリダイレクトページを表示します。リダイレクトページで Fail test payment (テスト支払い失敗) をクリックします。PaymentIntent (支払いインテント) が、requires_
から requires_
に変化します。
テスト環境で PaymentIntent を手動でキャプチャーする場合、未キャプチャーの PaymentIntent は、オーソリの成功後 10 分で自動的に期限切れになります。
ベストプラクティスとして、顧客にリリースする前に、実際の Revolut Pay アカウントを使用して本番環境でテストします。
失敗した支払い
Revolut Pay は複数のデータポイントを使用して、取引を拒否する状況を判断します (たとえば、AI モデルが取引で高い不正利用リスクを検出した場合や、Revolut Pay で請求する許可を顧客が取り消した場合など)。
このケースでは、PaymentMethod は切り離され、PaymentIntent オブジェクトのステータスは自動的に requires_
に移行します。
支払いが拒否された場合を除き、Revolut Pay の PaymentIntent (支払いインテント) が requires_
ステータスである場合、顧客は Revolut Pay にリダイレクトされてから 10 分以内に支払いを完了する必要があります。10 分経過しても何もアクションが行われなかった場合は、PaymentMethod (支払い方法) の関連付けが解除され、PaymentIntent オブジェクトのステータスは自動的に requires_
に移行します。
これが発生すると、Payment Element はエラーメッセージを表示し、顧客に別の支払い方法で再試行するように求めます。
エラーコード
次の表は、一般的なエラーコードと推奨アクションの詳細を示しています。
エラーコード | 推奨アクション |
---|---|
missing_ | 必須のパラメーターの詳細については、エラーメッセージを確認してください。 |
payment_ | このコードは PaymentIntent の last_payment_error.code フィールドに表示されることがあります。エラーメッセージで失敗の詳細な理由と推奨されるエラー処理を確認します。 |
payment_ | Revolut Pay で PaymentIntent を確定する際は、return_ を指定します。 |