React Native SDK
DEUNA React Native SDKをインストールし、ウィジェット、ネイティブウォレット、リダイレクト、および不正検知デバイスフローを統合します。
このページで
DEUNA React Native SDKを使用して、Payment Widget、Payment Vault、Click to Pay、next-action、voucher、およびnative-walletの統合をiOSおよびAndroidアプリケーション間で共有します。
要件#
DEUNAのReact Native SDKを使用するには、以下が必要です:
- Node.js: 20以上
- パッケージマネージャー: Yarnまたはnpm
- React: 18.2.0以上
- React Native: 0.73.0以上
- React Native WebView: 13.15.0以上
- Expo SDK: 50以上(Expoを使用するアプリの場合)
- DEUNA認証情報: アクティブなアカウントと有効なDEUNA認証情報(遅延が発生した場合は support@deuna.com にお問い合わせください)
- Androidプロジェクト:
minSdkVersion 24以上 - Huaweiデバイス: HarmonyOS 2.0以上
SDKのインストール#
SDKの初期化を開始します。
1. 依存関係の追加
プロジェクトにDEUNA SDKを追加します:
yarn add @deuna/react-native-sdknpm i @deuna/react-native-sdkpnpm add @deuna/react-native-sdk必要な react-native-webview (≥ 13.15.0)ピア依存関係を追加します:
yarn add react-native-webviewnpm i react-native-webviewpnpm add react-native-webview2. リンク
バージョン2.1.0以降、SDKにはネイティブのGoogle PayおよびApple Pay支払いシートを有効にするネイティブモジュールが含まれています。
React Native CLI
実行 pod install iOSでネイティブモジュールをリンクするには:
cd ios && pod installExpo(マネージドワークフロー)
設定プラグインを app.jsonに追加します。アプリケーションが使用するウォレット権利と不正検知プロバイダーのみを指定してください:
{
"expo": {
"plugins": [
[
"@deuna/react-native-sdk",
{
"merchantIdentifiers": ["merchant.com.example"],
"googlePay": true,
"fraudProviders": []
}
]
]
}
}ネイティブ ios/ および android/ ディレクトリをモジュール登録済みで再生成するためにprebuildを実行します:
npx expo prebuild3. 1.xから2.x.xへの移行ガイド
レンダラーの初期化とマウント#
1つのSDKインスタンスを作成し、レンダリング時に保持します。 DeunaWidget そのインスタンスに対して、1つだけマウントします。このコンポーネントは、モーダルと埋め込みWebViewの両方のフローをレンダリングします。初期化呼び出しは、そのコントローラーのみを設定します。
import {useMemo} from 'react';
import {DeunaSDK, DeunaWidget} from '@deuna/react-native-sdk';
export function CheckoutScreen() {
const deunaSDK = useMemo(
() =>
DeunaSDK.initialize({
publicApiKey: 'YOUR_PUBLIC_API_KEY',
environment: 'sandbox',
}),
[]
);
return (
<>
<CheckoutContent deunaSDK={deunaSDK} />
<DeunaWidget instance={deunaSDK} />
</>
);
}Payment Widget の起動#
Payment Widgetは、顧客に複数の支払い方法を提供できる統合コンポーネントです:
- クレジットカードおよびデビットカード:Visa、Mastercard、American Express、およびコブランドカード。
- 代替支払い方法(APM):OXXO、KueskiPay、Aplazo、Daviplata、Nequiなど。
- デジタルウォレット:PayPal、Apple Pay、Google Pay。
モーダル表示
使用する Mode.MODAL (デフォルト)SDK管理のモーダルシート用。マウントされた <DeunaWidget instance={deunaSDK} /> は自動的に画面の上に表示されます:
import {Mode} from '@deuna/react-native-sdk';
const onShowPaymentWidget = async () => {
await deunaSDK.initPaymentWidget({
orderToken: 'YOUR_ORDER_TOKEN',
mode: Mode.MODAL,
language: 'en',
callbacks: {
onSuccess: async (order) => {
await deunaSDK.close(); // Closes modal and releases widget resources
navigation.navigate('PaymentSuccess', {order});
},
onError: (error) => showRetry(error),
onClosed: (action) => navigation.goBack(),
onPaymentProcessing: () => disablePayButton(),
onEventDispatch: (event, payload) => {
analytics.track(event, payload);
},
},
});
};パラメータリファレンス
| 属性 | Type | モーダル | 埋め込み | 説明 |
|---|---|---|---|---|
orderToken | string | ✅ | ✅ | 必須。DEUNA APIで作成された注文の一意トークン。 重要:DEUNA APIで注文を作成する際、 redirect_url を定義しないでください( onSuccess コールバックをモバイルアプリ内で実行したい場合)。 |
callbacks | object | ✅ | ✅ | 必須。ウィジェットイベントを処理するコールバック関数(onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onDownloadFile, onEventDispatch). |
mode | Mode | ✅ | ✅ | Mode.MODAL (デフォルト)または Mode.EMBEDDED. |
userToken | string | ✅ | ✅ | 任意。顧客のDEUNAベアラートークン。 重要:保存済みカードを表示するには、注文作成時に渡された userToken 必須要件 billing_address.email にリンクされたメールアドレス。 |
styleFile | string | ✅ | ✅ | 任意。カスタムテーマブランディング(色、タイポグラフィ、ロゴ)を適用するためのDEUNA提供のUUID。 |
paymentMethods | object[] | ✅ | ✅ | 任意。フォームフローに直接起動する単一支払い方法を定義する配列(例: [{ paymentMethod: 'bnpl', processors: ['kueski'] }])。ウィジェットは方法セレクターを表示せず、その方法のフォームに直接開きます。注:内部チェックアウトシステムは現在1要素のみサポート。 |
language | string | ✅ | ✅ | 任意。言語コード("es", "en", "pt")。加盟店のデフォルト設定を上書きします。 |
behavior | object | ✅ | ✅ | 任意。フローカスタマイズ(例: behavior: { paymentMethods: { flowType: "twoStep" } } PayPal用)。 |
fraudCredentials | object | ✅ | ✅ | 任意。不正防止プロバイダー認証情報(例: { RISKIFIED: { storeDomain: 'example.com' } }). |
domain | string | ✅ | ✅ | 任意。デフォルトのベースホスト(https://pay.deuna.io). |
hidePayButton | boolean | ❌ | ✅ | 任意。埋め込みモードで、アプリケーションがネイティブの支払いボタンをレンダリングする場合、組み込みの支払いボタンを非表示にします。 |
決済ウィジェットの埋め込み#
ウィジェットを画面レイアウト内に直接表示するには、 mode: Mode.EMBEDDED.
import { useEffect } from 'react';
import { View, Button } from 'react-native';
import { DeunaSDK, DeunaWidget, Mode } from '@deuna/react-native-sdk';
export function EmbeddedCheckoutScreen({ deunaSDK, orderToken }) {
// Release widget resources on unmount
useEffect(() => {
return () => {
deunaSDK.close();
};
}, [deunaSDK]);
const handleOpenEmbedded = async () => {
await deunaSDK.initPaymentWidget({
orderToken,
mode: Mode.EMBEDDED,
callbacks: {
onSuccess: async (order) => {
await deunaSDK.close();
navigateToReceipt(order);
},
onError: (error) => handlePaymentError(error),
},
});
};
return (
<View style={{ flex: 1 }}>
<View style={{ flex: 1, width: '100%' }}>
<DeunaWidget instance={deunaSDK} />
</View>
<Button title="支払いフォームの読み込み" onPress={handleOpenEmbedded} />
</View>
);
}カスタム支払いボタン(hidePayButton)
アプリが独自の支払いボタンをレンダリングする場合、 hidePayButton: true を渡し、検証と送信を手動で実行します:
await deunaSDK.initPaymentWidget({
orderToken,
mode: Mode.EMBEDDED,
hidePayButton: true,
callbacks,
});
const handleCustomSubmit = async () => {
// 1. Validate entered card/payment fields
const isValid = await deunaSDK.isValid();
if (!isValid) return;
// 2. Submit payment
const result = await deunaSDK.submit();
if (result.status === 'error') {
console.error('Submit failed:', result.message);
}
};| メソッド | 説明 | 戻り値 |
|---|---|---|
deunaSDK.isValid() | アクティブな支払いフォームのユーザー入力を検証します。 | Promise<boolean> |
deunaSDK.submit() | ウィジェットボタンをクリックするのと同等の支払いを送信します。 | Promise<{ status: 'success' | 'error', message?: string }> |
支払い方法のフィルタリングと設定#
ダイレクトフォームフロー (paymentMethods)
DEUNAのチェックアウトアーキテクチャ (checkout-base および modular-checkout) は、個別の支払いフォームに直接起動することをサポートします。これは フォームフロー.
と呼ばれるパターンです。 paymentMethods SDKパラメータ は配列として型付けされていますが、内部のチェックアウトエンジンは現在 このリスト内の要素を1つのみ
await deunaSDK.initPaymentWidget({
orderToken,
paymentMethods: [
{ paymentMethod: 'bnpl', processors: ['kueski'] },
],
callbacks,
});設定の優先順位解決
表示する支払い方法とフォームを決定する際、DEUNAは以下の順序で設定を解決します:
| 優先度 | ソース | 動作 |
|---|---|---|
| 1 (最高) | paymentMethods を返します .initPaymentWidget() | ダイレクトフォームフロー:指定された単一の支払い方法フォーム(例:Kueski)に直ちに開き、方法セレクターをバイパスします。 |
| 2 | include_payment_options 注文作成時 | 複数方法選択:注文作成時に指定され、かつアカウントで有効な支払い方法のみを表示します。 |
| 3 (フォールバック) | マーチャントレベル設定 (/payment-methods) | フルセレクター:SDK呼び出しと注文ペイロードの両方で省略された場合、マーチャントアカウントに設定されたすべての有効な支払い方法を表示します。 |
PayPal設定
フロータイプ (flowType)
PayPalが支払い前に注文サマリーを表示するか、直接認証に進むかを制御します:
await deunaSDK.initPaymentWidget({
orderToken,
behavior: {
paymentMethods: {
flowType: 'twoStep', // 'twoStep' (order summary first) or 'singleStep' (direct payment)
},
},
callbacks,
});自動購入 (express)
顧客が以前にPayPalでクイック支払いを承認している場合、即時処理を有効にします:
await deunaSDK.initPaymentWidget({
orderToken,
paymentMethods: [
{
paymentMethod: 'wallet',
processors: ['paypal_wallet'],
configuration: {
express: true, // Default: true. Set false to prompt user account confirmation.
},
},
],
callbacks,
});動的スタイリングと注文更新#
外観を動的にカスタマイズ (setCustomStyle)
ウィジェットの色、ロゴ、フォントを動的に更新します(例:カードBIN検出時のヘッダーブランディング変更):
await deunaSDK.setCustomStyle({
theme: {
colors: {
primaryTextColor: '#023047',
buttonPrimaryFill: '#FFB703',
buttonPrimaryText: '#000000',
},
},
});注文合計を更新 (refetchOrder)
フランチャイズ固有のプロモーション(例:「Mastercardで15%オフ」)を提供する場合、 onCardBinDetectedをリッスンし、バックエンドで注文合計を再計算してウィジェットに通知します:
callbacks: {
onCardBinDetected: async (metadata) => {
if (metadata?.cardBrand === 'Mastercard') {
// 1. Notify your backend to apply discount to order
await applyDiscountOnBackend(orderId, 'MASTERCARD_15');
// 2. Refresh widget to display updated totals
const updatedOrder = await deunaSDK.refetchOrder();
console.log('Order refreshed with discount:', updatedOrder);
}
},
}利用可能な機能#
| 体験 | メソッド | 重要な入力 |
|---|---|---|
| 支払いウィジェット | initPaymentWidget(...) | orderToken、コールバック、オプション mode |
| 支払いVault | initElements(...) | コールバック; types 省略可能 |
| クリック・トゥ・ペイ | initElements(...) | types: [{name: 'click_to_pay'}] |
| 次のアクション | initNextAction(...) | 注文トークン、コールバック、および mode |
| バウチャー | initVoucherWidget(...) | 注文トークン、コールバック、および mode |
SDKは、以下の機能も提供します。 setCustomStyle(...), refetchOrder(), getWidgetState(), isValid(), submit(), および close() アクティブなコントローラーに対して。
Payment Vault と Click to Pay#
Card VaultとElementsソリューションは、即時の支払いトランザクションを必要とせずに、カードトークン化、顧客ウォレット管理、Click to Payを統合します:
- Card Vault:顧客がクレジットカードとデビットカードを安全に追加、保存、管理し、将来の購入に利用できます。
- クリック・トゥ・ペイ:グローバルネットワークトークン(Visa、Mastercardなど)を活用した摩擦のないチェックアウト体験を提供します。
モーダル表示
Card VaultまたはElementsウィジェットをモーダルで表示するには、以下の手順に従います:
import { DeunaSDK, DeunaWidget, Mode } from '@deuna/react-native-sdk';
const onShowVaultModal = async () => {
await deunaSDK.initElements({
userToken: '<DEUNA_USER_TOKEN>', // Optional
userInfo: {
firstName: 'Ada',
lastName: 'Lovelace',
email: 'ada@example.com', // Required
},
types: [{ name: 'vault' }], // Default experience
mode: Mode.MODAL,
callbacks: {
onSuccess: async (data) => {
await deunaSDK.close(); // Close modal and release resources
console.log('Card tokenized successfully:', data);
},
onError: async (error) => {
console.error('Vault error:', error);
await deunaSDK.close();
},
onClosed: (action) => {
console.log('Vault closed:', action);
},
onEventDispatch: (type, response) => {
console.log('Vault event:', type, response);
},
},
widgetExperience: {
userExperience: {
showSavedCardFlow: true, // Optional: toggle for saving card
defaultCardFlow: false, // Optional: toggle for saving card as default
},
},
});
};埋め込みモードで表示
VaultまたはClick to Payフォームを画面レイアウト内に埋め込むには、以下を渡します: mode: Mode.EMBEDDED。以下の点を確認してください: <DeunaWidget /> は、その寸法を定義するコンテナでラップされていること:
import { useEffect } from 'react';
import { View, Button } from 'react-native';
import { DeunaSDK, DeunaWidget, Mode } from '@deuna/react-native-sdk';
export function EmbeddedVaultScreen({ deunaSDK }) {
useEffect(() => {
return () => {
deunaSDK.close(); // Release resources on screen unmount
};
}, [deunaSDK]);
const handleOpenEmbeddedVault = async () => {
await deunaSDK.initElements({
mode: Mode.EMBEDDED,
userInfo: {
email: 'ada@example.com',
},
callbacks: {
onSuccess: async (data) => {
await deunaSDK.close();
console.log('Tokenization successful:', data);
},
onError: (error) => console.error(error),
},
});
};
return (
<View style={{ flex: 1 }}>
<View style={{ flex: 1, width: '100%' }}>
<DeunaWidget instance={deunaSDK} />
</View>
<Button title="保存済みカードを追加" onPress={handleOpenEmbeddedVault} />
</View>
);
}パラメータリファレンス initElements
| パラメータ | Type | 説明 |
|---|---|---|
callbacks | object | 必須用 onSuccess, onError, onClosed, onCardBinDetected, および onEventDispatch. |
userInfo | object | 顧客情報のイベントリスナー email 経由で提供されます。 必須 ( userToken). firstName および lastName を渡す場合でも)は、 userToken が提供されている場合はオプションです。 |
userToken | string | 任意. DEUNAユーザーBearerトークン。 重要: 両方を渡す場合 userToken および orderToken、セキュリティ上の理由から保存済みカードを表示するために注文の userToken 必須要件 billing_address.email にリンクされたメールアドレス。 |
orderToken | string | 任意. 既存のチェックアウト注文のコンテキストでトークン化する際の注文トークン。 |
types | object[] | 任意. レンダリングするウィジェットエクスペリエンス: [{ name: 'vault' }] (デフォルト)または [{ name: 'click_to_pay' }]. 省略した場合、デフォルトはVault。 |
mode | Mode | Mode.MODAL (デフォルト)または Mode.EMBEDDED. |
widgetExperience | object | 任意. マーチャント設定を上書き: userExperience.showSavedCardFlow (カード保存トグルを表示)および userExperience.defaultCardFlow (デフォルトとしてカードを保存するトグルを表示)。 |
styleFile | string | 任意. DEUNAで設定されたカスタムスタイルシート/テーマのUUID。 |
language | string | 任意。言語コード("es", "en", "pt")。マーチャントのデフォルトを上書き。 |
hidePayButton | boolean | 任意. 埋め込み時に、 isValid() および submit(). |
domain | string | 任意を使用した手動実行のためのアクションボタンを非表示にします。 https://elements.deuna.com/vault をカスタムドメインに置き換えて)ベースホストを上書き。 |
Click to Pay統合
Click to Payウィジェットを表示するには、設定します types: [{ name: 'click_to_pay' }].
await deunaSDK.initElements({
userInfo: {
firstName: 'Ada',
lastName: 'Lovelace',
email: 'ada@example.com', // Required for Click to Pay
},
types: [
{
name: 'click_to_pay',
},
],
callbacks: {
onSuccess: async (data) => {
await deunaSDK.close();
console.log('Click to Pay success:', data);
},
onError: (error) => console.error('Click to Pay error:', error),
onClosed: (action) => console.log('Widget closed:', action),
},
});ネイティブなApple PayおよびGoogle Pay#
ウォレットボタンを表示する前に、商人の設定とデバイスのサポートを確認してください。 戻り値は apple_pay および google_pay.
const userInfo = {email: 'ada@example.com'};
const wallets = await deunaSDK.getWalletsAvailable({
orderToken,
userInfo,
});
setShowApplePay(wallets.includes('apple_pay'));
setShowGooglePay(wallets.includes('google_pay'));可用性確認後、ボタン操作でネイティブのシートを起動します。Apple Payの場合、この呼び出しをユーザーのジェスチャーに直接含めます。
const launchWallet = (provider: 'apple_pay' | 'google_pay') => {
const type = provider === 'apple_pay' ? 'APPLE_PAY' : 'GOOGLE_PAY';
deunaSDK.initElements({
orderToken,
userInfo,
types: [{name: type}],
callbacks: {
onSuccess: (credential) => useSavedCredential(credential),
onError: (error) => showRetry(error),
onClosed: () => showPaymentMethods(),
},
});
};Apple Payには、iOSの権限と商人の識別子が必要です。Google Payには、商人の有効化と、対応するAndroidデバイスが必要です。詳細は、 Apple Pay の統合について説明します および Google Pay.
保留中の操作を続行#
DEUNA が支払いに対してサポートされている 3DS チャレンジまたはリダイレクトが必要であると報告した場合、同じ注文トークンを使用してください。
await deunaSDK.initNextAction({
orderToken,
mode: Mode.MODAL,
callbacks: {
onSuccess: (order) => showConfirmation(order),
onError: (error) => showRetry(error),
onClosed: () => showPaymentMethods(),
},
});クーポンを開く#
await deunaSDK.initVoucherWidget({
orderToken,
mode: Mode.MODAL,
callbacks: {
onSuccess: (order) => showVoucherInstructions(order),
onError: (error) => showRetry(error),
onClosed: () => showPaymentMethods(),
onDownloadFile: (file) => saveVoucher(file),
},
});外部リダイレクトの処理#
以降、 v2.0.0ネイティブブラウザ機能を必要とする支払い方法(例: Mercado Pago Wallet)は、 カスタムタブ(Android) または Safari View Controller(iOS) セキュアなセッション処理とCookieの永続化を確保するためです。これをサポートするには、 inAppBrowserAdapter を提供し、 InAppBrowserAdapter インターフェースを実装した DeunaSDK.initialize.
オプションA: @deuna/react-native-in-app-browser (Metro / Expo) を使用する場合
MetroまたはExpoを使用している場合は、 @deuna/react-native-in-app-browser をインストールし、 ExpoWebBrowserAdapter:
import { DeunaSDK } from '@deuna/react-native-sdk';
import { ExpoWebBrowserAdapter } from '@deuna/react-native-in-app-browser';
const deunaSDK = DeunaSDK.initialize({
publicApiKey: 'YOUR_PUBLIC_API_KEY',
environment: 'sandbox',
inAppBrowserAdapter: new ExpoWebBrowserAdapter(),
});オプションB: 使用 react-native-inappbrowser-reborn (Webpack / カスタム)
Expoモジュールと互換性のないWebpackまたはカスタムバンドラーを使用する場合は、以下を使用します: react-native-inappbrowser-reborn:
npm install react-native-inappbrowser-reborn
# or
yarn add react-native-inappbrowser-rebornアダプターを実装:
import { Linking } from 'react-native';
import InAppBrowser from 'react-native-inappbrowser-reborn';
import { InAppBrowserAdapter, DeunaSDK } from '@deuna/react-native-sdk';
class InAppBrowserRebornAdapter implements InAppBrowserAdapter {
async openUrl(url: string): Promise<void> {
try {
if (await InAppBrowser.isAvailable()) {
await InAppBrowser.open(url, {
dismissButtonStyle: 'cancel',
preferredBarTintColor: '#023047',
preferredControlTintColor: '#FFFFFF',
readerMode: false,
animated: true,
});
} else {
// Fallback to external browser
await Linking.openURL(url);
}
} catch (error) {
console.error('Error opening in-app browser:', error);
throw error;
}
}
}
const deunaSDK = DeunaSDK.initialize({
publicApiKey: 'YOUR_PUBLIC_API_KEY',
environment: 'sandbox',
inAppBrowserAdapter: new InAppBrowserRebornAdapter(),
});不正デバイスデータとフィンガープリンティング#
以下の DeunaSDK.initializeFraudProviders(...) プロバイダーをバックグラウンドでウォームアップする静的関数、および統一されたDEUNA不正ペイロードを生成する deunaSDK.generateFraudId(...) インスタンスメソッド(またはウィジェット初期化子の fraudCredentials パラメータ)。
DEUNA React Native SDKは **モジュラーでリフレクションベースのアーキテクチャ(ゼロ肥大化)**を採用しています: デフォルトではサードパーティの不正防止SDKをバンドルしません。 使用する特定のプロバイダーのみを追加してください。 プロバイダーを使用しない場合、アプリサイズのペナルティはゼロです。
サポート対象プロバイダー
| プロバイダ | 説明 | 必須パラメータ |
|---|---|---|
MERCADOPAGO | Mercado Pagoデバイス行動プロファイリング | (不要) |
RISKIFIED | Riskified Beaconビーコン | storeDomain |
CYBERSOURCE | CyberSource ThreatMetrixプロファイリング | orgId, merchantId (オプション: fpServer) |
SIGNIFYD | Signifyd ThreatMetrixプロファイリング | orgId (オプション: fpServer) |
ACCERTIFY | Accertify InMobileプロファイリング | assets/bundle内の設定ファイル (オプション: locationConsent, phoneConsent) |
KOUNT | Kount Data Collector | merchantId, clientId, dataCollectorUrl, environment |
SIFT | Sift Science デバイスプロファイリング | accountId, beaconKey |
依存関係のリンク
プロジェクト環境に対応するセットアップに従ってください (Expo または React Native CLI).
A. Expo (Config Plugin)
Expo プロジェクトで Continuous Native Generation (CNG) または EAS Buildを使用している場合、契約しているプロバイダーのみを有効にします。それらを fraudProviders 配列にリストして app.json:
{
"expo": {
"plugins": [
[
"@deuna/react-native-sdk",
{
"fraudProviders": [
"mercadopago",
"riskified"
]
}
]
]
}
}で指定します。 fraudProviders: "mercadopago", "riskified", "cybersource", "signifyd", "accertify", "kount", "sift".
を iOS プロジェクト / バンドルに配置します。 app.jsonを更新した後、ネイティブプロジェクトを再生成します:
npx expo prebuild --cleanB. React Native CLI
標準の React Native CLI プロジェクトでは、必要なプロバイダーのみのネイティブ依存関係を ホストアプリケーションファイルに追加します: Android 設定
Mercado Pago Maven リポジトリ
- : Mercado Pago を使用する場合、Mercado Libre Maven リポジトリが(または
android/build.gradle) に含まれていることを確認します。settings.gradle):
allprojects {
repositories {
google()
mavenCentral()
maven { url "https://artifacts.mercadolibre.com/repository/android-releases/" }
}
}-
ベンダー AAR 配置: Cybersource、Signifyd、または Accertify を使用する場合、ベンダー AAR をダウンロードして
android/app/libs/:- Cybersourceに配置します: AAR ファイルを
android/app/libs/cybersource/. - Signifydに配置します: AAR ファイルを
android/app/libs/signifyd/. - AccertifyAccertify 設定アセット
inmobileおよびinmobile-commonAARファイル内のandroid/app/libs/accertify/.
- Cybersourceに配置します: AAR ファイルを
-
依存関係: 必要なプロバイダーのみを内部に追加してください
android/app/build.gradleをクリックdependencies { ... }:
dependencies {
// --- Add ONLY the providers you use ---
// Mercado Pago
implementation("com.mercadolibre.android.device:sdk:4.0.1")
// Riskified
implementation("com.riskified:android-sdk:1.11.0:nogoogle@aar")
// CyberSource (AARs placed in app/libs/cybersource)
implementation(fileTree(dir: "libs/cybersource", include: ["*.aar"]))
// Signifyd (AARs placed in app/libs/signifyd)
implementation(fileTree(dir: "libs/signifyd", include: ["*.aar"]))
// Accertify (AARs placed in app/libs/accertify + required transitive dependencies)
implementation(fileTree(dir: "libs/accertify", include: ["*.aar"]))
implementation("io.insert-koin:koin-core:3.5.6")
implementation("androidx.biometric:biometric:1.1.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
// Kount
implementation("com.kount:kount-data-collector:4.1.0")
// Sift
implementation("sift-android:sift-android:0.14.0")
}- Accertify アセット:
- AndroidAccertify 設定アセット
server_keys_message_hosted.jsonおよびinmobile.propertiesを返しますandroid/app/src/main/assets/. - iOS: 追加
server_keys_message_hosted.jsonおよびInMobile.plistを Xcode プロジェクトのアプリの Copy Bundle Resources に追加 target.
- AndroidAccertify 設定アセット
iOS設定 (ios/Podfile)
内で、 target 'YourApp' do 必要なプロバイダーのサブスペックのみを追加します:
target 'YourApp' do
# Add ONLY the subspecs you need:
pod 'DeunaSDK/MercadoPago'
pod 'DeunaSDK/Riskified'
pod 'DeunaSDK/Cybersource'
pod 'DeunaSDK/Signifyd'
pod 'DeunaSDK/Kount'
pod 'DeunaSDK/Sift'
pod 'DeunaSDK/Accertify'
end次に実行:
cd ios && pod installプロバイダーの詳細と制約
RISKIFIED
- 必須:
storeDomain - 構成の例:
JSON
{ "RISKIFIED": { "storeDomain": "yourdomain.com" } }
CYBERSOURCE
- 必須:
orgId,merchantId - 任意:
fpServer(デフォルト:h.online-metrix.net) - 構成の例:
JSON
{ "CYBERSOURCE": { "orgId": "your_org_id", "merchantId": "your_merchant_id" } }
SIGNIFYD
- 必須:
orgId - 任意:
fpServer(デフォルト:imgs.signifyd.com) - 構成の例:
JSON
{ "SIGNIFYD": { "orgId": "your_org_id" } }
ACCERTIFY
- 任意:
locationConsent(デフォルト:true),phoneConsent(デフォルト:true) - 必要なファイル: 公開暗号化キーファイル
server_keys_message_hosted.jsonとエンドポイントプロパティ(inmobile.propertiesAndroidではsrc/main/assets/およびInMobile.plistiOSバンドルリソース内)は、マーチャントオンボーディング中にAccertifyから取得する必要があります。 - 推移的依存関係 (Android): Accertify AARにはKoin DI (
io.insert-koin:koin-core:3.5.6)、AndroidX Biometric (androidx.biometric:biometric:1.1.0)、およびKotlinx Serializationが必要です。org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3). - 構成の例:
JSON
{ "ACCERTIFY": { "locationConsent": true, "phoneConsent": false } }
KOUNT
- 必須:
merchantId,clientId,dataCollectorUrl,environment - 構成の例:
JSON
{ "KOUNT": { "merchantId": "your_merchant_id", "clientId": "your_client_id", "dataCollectorUrl": "https://...", "environment": "TEST" } }
SIFT
- 必須:
accountId,beaconKey - 構成の例:
JSON
{ "SIFT": { "accountId": "your_account_id", "beaconKey": "your_beacon_key" } }
MERCADOPAGO
- 必須: なし (
{}) - Android: Mercado Libre Maven リポジトリが必要です (
https://artifacts.mercadolibre.com/repository/android-releases/) および依存関係com.mercadolibre.android.device:sdk:4.0.1. - iOS: リンク先
pod 'DeunaSDK/MercadoPago'. - 構成の例:
JSON
{ "MERCADOPAGO": {} }
早期バックグラウンド初期化
なぜなら initializeFraudProviders は 静的メソッドだからです、チェックアウトウィジェットのインスタンス化や起動前にバックグラウンドで実行できます:
import { useEffect } from 'react';
import { DeunaSDK } from '@deuna/react-native-sdk';
const CartScreen = () => {
useEffect(() => {
// Pre-warm fraud SDKs as soon as the cart or store view mounts
DeunaSDK.initializeFraudProviders({
MERCADOPAGO: {},
});
}, []);
return (
// Your cart UI components
);
};実装オプション
オプション1:インスタンスメソッドによる直接呼び出し(generateFraudId)
generateFraudId は初期化済みの DeunaSDK インスタンス。自動的に設定済みの publicApiKey および environment:
import { DeunaSDK } from '@deuna/react-native-sdk';
const deunaSDK = DeunaSDK.initialize({
publicApiKey: 'YOUR_PUBLIC_API_KEY',
environment: 'production',
});
async function getFraudToken() {
const fraudId = await deunaSDK.generateFraudId({
RISKIFIED: {
storeDomain: 'yourdomain.com',
},
MERCADOPAGO: {},
});
// Returns a Base64-encoded JSON string or null
console.log('Base64 Fraud ID:', fraudId);
if (fraudId) {
const decoded = atob(fraudId);
console.log('Decoded Tokens:', JSON.parse(decoded));
}
}オプション2: fraudCredentials をウィジェットに直接渡す
DEUNA支払いウィジェットを使用する際は(initPaymentWidget, initElements, initNextAction, initVoucherWidget)、プロバイダー設定を fraudCredentials経由で直接渡してください。SDKは購入時に内部で generateFraudId を呼び出します:
await deunaSDK.initPaymentWidget({
orderToken: 'YOUR_ORDER_TOKEN',
mode: Mode.MODAL,
callbacks: {
onSuccess: (data) => console.log('Payment success:', data),
onError: (error) => console.error('Payment error:', error),
onClosed: () => console.log('Widget closed'),
},
fraudCredentials: {
RISKIFIED: {
storeDomain: 'yourdomain.com',
},
MERCADOPAGO: {},
},
});動作とランタイム特性
- ゼロ・ブラウト&クラッシュ・セーフ:JSONリクエストにプロバイダーが含まれていても、そのネイティブ依存関係がアプリに追加されていない場合、ネイティブリフレクションは未処理の例外をスローしたりクラッシュすることなく安全に無視します。
- 並列実行: 要求されたすべてのプロバイダーのプロファイリングは、バックグラウンドスレッドで同時に実行されます。
- フォールバック動作: デバイス上で有効なプロバイダーが設定されていないか利用できない場合、
generateFraudIdはnull.
コールバックとライフサイクル参照を参照してください。#
次の initPaymentWidget に解決され、Elementsの初期化子は支払いの進行状況を監視し、UIを更新し、リソースを解放するための型付きコールバックを受け入れます。
| コールバック | モーダル | 埋め込み | いつトリガーされますか? |
|---|---|---|---|
onSuccess | ✅ | ✅ | 支払いが成功しました。注文データのJSONが含まれています。常に await deunaSDK.close() を呼び出してウィジェットリソースを解放してください。 |
onError | ✅ | ✅ | ロードまたはチェックアウト処理中にエラーが発生しました。型指定された PaymentsError. |
onClosed | ✅ | ❌ | モーダルが閉じました。受信します userAction (顧客による却下)または systemAction (経由でクローズ) close()). 注:埋め込みモードではトリガーされません。 |
onPaymentProcessing | ✅ | ✅ | お客様が支払いボタンをクリックし、処理が開始されました。このイベントを使用してボタンを無効化し、進行状況インジケーターを表示します。 |
onCardBinDetected | ✅ | ✅ | カードのBINが検出またはクリアされたときにトリガーされます( null お客様が番号を削除したときに返されます)。フランチャイズ割引に使用します。 |
onInstallmentSelected | ✅ | ✅ | お客様が分割払いプランを選択したときにトリガーされます( null 一括払いのときに返されます)。 |
onDownloadFile | ✅ | ✅ | お客様がバウチャーまたは領収書のダウンロードをリクエストしたときにトリガーされます。 |
onEventDispatch | ✅ | ✅ | すべての基盤となる CheckoutEvent の発生を出力し、カスタムロギングと分析に使用します。 |
エラーの処理(onError)
エラーを検査して type 初期化の失敗と支払いの拒否を区別します:
onError: async (error) => {
switch (error.type) {
case 'INITIALIZATION_FAILED':
// Widget could not load; release controller and retry or notify user
await deunaSDK.close();
showToast('Payment system currently unavailable');
break;
case 'PAYMENT_ERROR':
// Card declined or processor rejection
showRetryScreen(error.message);
break;
default:
console.warn('Unhandled payment error:', error);
break;
}
}ファイルダウンロードの処理(onDownloadFile)
バウチャーまたは現金支払いの指示で領収書やバーコードが提供される場合:
callbacks: {
onDownloadFile: (file) => {
const { type, data } = file;
if (type === 'url') {
// Download or open external receipt URL
Linking.openURL(data);
} else if (type === 'base64') {
// Save base64 image or PDF to local file system
saveBase64ToGallery(data);
}
},
}リソースの解放(close)
次の close() このメソッドは内部のWebViewコントローラーを解放し、イベントサブスクリプションをクリアします。常に呼び出してください。 deunaSDK.close() を返します onSuccess また、埋め込みウィジェットの場合は画面アンマウントフック(useEffect クリーンアップ)で必ず呼び出してください。
公式の例とソースコード#
参照 ModalScreen.tsx, EmbeddedScreen.tsx, および WalletsScreen.tsx 完全な実行可能なフローを実現するため。