OXXO での支払いを受け付ける
メキシコで一般的な支払い方法である OXXO を受け付ける方法をご紹介します。
注意
サーバー側での手動確定を使用する必要がある場合、またはお使いの実装で決済手段を別途表示する必要がある場合を除き、決済を受け付けるガイドに従うことをお勧めします。すでに Elements との連携が完了している場合は、Payment Element 移行ガイドをご覧ください。
アプリで OXXO を受け付けるには、Webview で OXXO の取引の詳細を表示します。顧客は、OXXO コンビニエンスストアで、生成された番号が記載された取引の詳細を提示し、現金で支払います。支払いが完了すると、Stripe からお客様に通知が送られます。
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 (支払いインテント) は、顧客から支払いを回収する意図を表すオブジェクトで、決済プロセスのライフサイクルの各段階を追跡します。
サーバー側
金額と mxn
通貨 (OXXO は他の通貨には対応していません) を指定して、サーバーで PaymentIntent を作成します。すでに Payment Intents API を使用したシステムがある場合は、oxxo
を PaymentIntent
の支払い方法タイプのリストに追加します。
その他の支払い方法オプション
PaymentIntent
の支払い方法オプションでオプションの expires_
パラメーターを指定して、OXXO の支払い票の有効期限が切れるまでの日数を設定できます。たとえば、月曜日に OXXO の支払い票を作成し、expires_
を 2 に設定した場合、OXXO の支払い票は、America/Mexico_City (UTC-6) 時間で水曜日の 23:59 に有効期限が切れます。expires_
パラメーターは 1 日から 7 日まで設定できます。デフォルトは 3 日です。
クライアント側
クライアント側で、サーバーの 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: 'mxn', payment_method_types: ['oxxo'], }), }); const {clientSecret, error} = await response.json(); return {clientSecret, error}; };
支払い方法の詳細を収集するクライアント側
アプリで顧客の氏名とメールアドレスを収集します。
export default function OxxoPaymentScreen() { const [name, setName] = useState(); const [email, setEmail] = useState(); const handlePayPress = async () => { // ... }; return ( <Screen> <TextInput placeholder="Name" onChange={(value) => setName(value.nativeEvent.text)} /> <TextInput placeholder="E-mail" onChange={(value) => setEmail(value.nativeEvent.text)} /> </Screen> ); }
Stripe に支払いを送信するクライアント側
作成した PaymentIntent から client secret を取得し、confirmPayment
を呼び出します。これにより、Webview で OXXO 支払い向けに取引の詳細が表示されます。
export default function OxxoPaymentScreen() { const [name, setName] = useState(); const [email, setEmail] = useState(); const handlePayPress = async () => { const billingDetails: PaymentMethodCreateParams.BillingDetails = { name, email, }; const { error, paymentIntent } = await confirmPayment(clientSecret, { paymentMethodType: 'Oxxo', paymentMethodData: { billingDetails, } }); if (error) { Alert.alert(`Error code: ${error.code}`, error.message); console.log('Payment confirmation error', error.message); } else if (paymentIntent) { if (paymentIntent.status === PaymentIntents.Status.RequiresAction) { Alert.alert( 'Success', `The OXXO voucher was created successfully. Awaiting payment from customer.` ); } else { Alert.alert('Payment intent status:', paymentIntent.status); } } }; return ( <Screen> <TextInput placeholder="Name" onChange={(value) => setName(value.nativeEvent.text)} /> <TextInput placeholder="E-mail" onChange={(value) => setEmail(value.nativeEvent.text)} /> </Screen> ); }
オプション: 顧客に取引の詳細へのリンクをメールで送信する
Stripe は、OXXO の取引の詳細が正常に作成されると、payment_intent.requires_action イベントを送信します。顧客に取引の詳細のリンクをメールで送信する必要がある場合は、イベントの受信時に PaymentIntent (支払いインテント) を取得することで、リンクを取得できます。payment_intent.next_action.oxxo_display_details の hosted_
フィールドには、取引の詳細へのリンクが含まれています。
オプション: 取引の詳細をカスタマイズする
Stripe では、ブランディング設定ページで、顧客に表示される UI をカスタマイズできます。
取引の詳細には、以下のブランド設定を適用できます。
- アイコン: ブランド画像と公開ビジネス名
- アクセント—番号コピーボタンの色として使用されます
- ブランドカラー: 背景色として使用されます
支払い後のイベントを処理するサーバー側
OXXO は遅延通知型の支払い方法であるため、売上はすぐには利用可能になりません。顧客は決済直後に OXXO コンビニエンスストアで OXXO の支払いを行わない場合があります。
Stripe は、支払われた OXXO の支払いごとに、翌営業日 (メキシコの祝日を除く月曜日から金曜日) に payment_intent.succeeded イベントを送信します。ダッシュボードを使用するか、Webhook ハンドラーを構築して、これらのイベントを受信し、アクション (顧客への注文確認メールの送信、データベースへの売上の記録、配送ワークフローの開始など) を実行します。
有効期限日を過ぎると、PaymentIntent のステータスは processing
に移行し、顧客は期限切れの OXXO の支払い票に対する支払いを行うことができなくなります。OXXO の支払い票が有効期限日の 23:59 America/Mexico_City (UTC-6) より前に支払われなかった場合、Stripe は有効期限日から 10 日以内に payment_intent.payment_failed イベントを送信します (ほとんどの場合、このイベントは 7 日以内に送信されます)。たとえば、OXXO の支払い票の有効期限日が 9 月 1 日の場合、このイベントは遅くとも 9 月 10 日までに送信されます。
イベント | 説明 | 次のステップ |
---|---|---|
payment_ | OXXO の支払い票が正常に作成されました。 | 顧客が OXXO で支払うのを待ちます。 |
payment_ | 顧客は OXXO の支払いができなくなりました。 | 支払いの成功、または失敗を待ちます。 |
payment_ | 顧客は有効期限が切れる前に OXXO の支払い票に対する支払いを行いました。 | 顧客が購入した商品またはサービスのフルフィルメントを行います。 |
payment_ | 顧客が有効期限までに OXXO の支払い票に対する支払いを行いませんでした。 | Contact the customer through email or push notification and request another payment method. |
イベントを受信し、ビジネスアクションを実行する
手動
Stripe ダッシュボードを使用して、Stripe のすべての支払いの確認、メール領収書の送信、入金処理、失敗した支払いの再試行を実行します。
カスタムコード
Webhook ハンドラを構築してイベントをリッスンし、非同期型のカスタムの決済フローを作成します。Stripe CLI を使用して、ローカルで Webhook の組み込みのテストとデバッグを行います。
構築したシステムをテストする
サンドボックスでは、confirmPayment
を呼び出してさまざまなシナリオをテストするときに、次のメールアドレスを使用します。
メールアドレス | 説明 |
---|---|
| 顧客が 3 分後に支払い、約 3 分後に 例: fulano@test.com |
| 顧客が即座に支払う OXXO をシミュレーションし、 例: succeed_immediately@test.com |
| 顧客が支払う前に期限切れになり、 支払い方法オプションで 例: expire_immediately@test.com |
| 顧客が支払う前に期限切れになり、 支払い方法オプションで 例: expire_with_delay@test.com |
| 顧客が支払う前に期限切れになり、 例: fill_never@test.com |
有効期限とキャンセル
OXXO vouchers expire after the expires_
UNIX timestamp and a customer can’t pay an OXXO voucher once it has expired. OXXO vouchers can’t be canceled before expiration.
OXXO 支払い票の有効期限が切れると、PaymentIntent のステータスは requires_
に変わります。この時点では、別の支払い方法を指定して PaymentIntent を確定するか、キャンセルすることができます。