SDK の応答とコールバック
成功、エラー、クローズ、リサイズ、BIN、分割払い、および処理コールバックを、DEUNA SDK 全体で一貫して処理してください。
このページで
すべての DEUNA SDK は、コールバックを通じて即座の UI 結果を返します。 成功オブジェクトの正確な内容は、開かれたエクスペリエンスによって異なりますが、エラー、クローズアクション、BIN の検出、および分割払い選択には、より小さな契約を使用します。
応答の構造#
01 · widget
ローカルな結果を送信
アクティブなエクスペリエンスはコールバックを呼び出します。
02 · app
インターフェースを更新
確認、復元、ロード、またはクローズの状態を表示します。
03 · backend
注文を調整
現在の状態を取得するか、検証された Webhook を処理します。
04 · business
一度実行
処理、再試行、または権限のある状態からエスカレーション。
コールバックマトリックス#
| コールバック | リクエストペイロード | 契約条件 |
|---|---|---|
onSuccess(data) | 結果を確認 | 「Payment and Next Action」は通常、注文データを返し、「Elements」は認証情報を返します。 認証後まで、クライアントデータとして扱ってください。 |
onError(error) | 正規化されたSDKエラー | 読み取り type, metadata.code, および metadata.messageネイティブな決済エラーには、 order. |
onClosed(action, metadata?) | 終了理由も含まれることがあります | ウェブでの利用 userAction または systemAction; ネイティブ SDK は、タイピングされたクローズのアクションを公開します。 クローズは成功または失敗ではありません。 |
onEventDispatch(event, payload) | 生のライフサイクルイベント | 分析と診断のみ。ペイロードは、体験によって異なります。 |
onResize({height, width}) | ピクセル寸法 | 埋め込まれたウェブまたはReact Nativeホストのサイズ変更 |
onCardBinDetected(data) | BINの選択 | ウェブおよびReact Nativeタイプ {cardBin, cardBrand}ネイティブなコールバックはJSONを公開します。 |
onInstallmentSelected(data) | 分割払い選択 | ウェブおよびReact Nativeタイプ {cardBin, installmentPlanOptionId}ネイティブなコールバックはJSONを公開します。 |
onPaymentProcessing() | ペイロードなし | 支払い処理中、重複送信をロックします。 |
WebおよびReact Nativeタイプ#
公開コールバックの形状JavaScript
type ClosedAction = 'userAction' | 'systemAction';
type SdkError = {
type: string;
metadata: {
code: string;
message: string;
};
};
type CardBinDetected = {
cardBin: string;
cardBrand: string;
};
type InstallmentSelected = {
cardBin: string;
installmentPlanOptionId: string;
};
type Dimensions = {
height: number;
width: number;
};エラーをカテゴリ別に処理し、同時にプロバイダーまたはエクスペリエンス側のコードをサポート診断に使用します。
JavaScript
const callbacks = {
onSuccess: async (data) => {
setCheckoutState('verifying');
const verifiedOrder = await fetch(`/api/orders/${merchantOrderId}`).then(r => r.json());
renderFromAuthoritativeState(verifiedOrder);
},
onError: ({type, metadata}) => {
logSafeDiagnostic({type, code: metadata.code});
showRecoveryMessage(type, metadata.code);
},
onClosed: (action, metadata) => {
restorePaymentMethods();
if (metadata) logSafeDiagnostic({action, code: metadata.code});
},
};ネイティブなエラータイプ#
iOSおよびAndroid SDKは、支払いエラーを以下のように正規化します。 PaymentsError ~ type(オプション) metadata(オプション) order snapshot.
| カテゴリ | Android | iOS | 意味 |
|---|---|---|---|
| 接続性 | NO_INTERNET_CONNECTION | noInternetConnection | デバイスがサービスに到達できません。 |
| トークン | INVALID_ORDER_TOKEN | invalidOrderToken | トークンが空またはエクスペリエンスに対して無効です。 |
| 初期化 | INITIALIZATION_FAILED | initializationFailed | ウィジェットの準備または表示に失敗しました。 |
| 取得 | ORDER_COULD_NOT_BE_RETRIEVED, ORDER_NOT_FOUND | orderCouldNotBeRetrieved, orderNotFound | 注文の検索に失敗しました。再試行する前にバックエンドで再調整してください。 |
| 決済 | PAYMENT_ERROR | paymentError | 支払いエクスペリエンスでエラーが発生しました。メタデータを読み取ります。 |
| ナビゲーション | — | errorWhileLoadingTheURL | iOSでウィジェットのURLを読み込めませんでした。 |
| Cliente | — | userError | iOSで顧客向けのエラーカテゴリを受信しました。 |
| フォールバック | UNKNOWN_ERROR | unknownError | 安全な診断を保持し、一般的な復旧パスを表示します。 |
AndroidKotlin
callbacks.onError = { error ->
val code = error.metadata?.code ?: "UNKNOWN_ERROR"
logger.warn("DEUNA SDK error", mapOf("type" to error.type.name, "code" to code))
renderRecovery(error.type)
}iOSSwift
callbacks.onError = { error in
let code = error.metadata?.code ?? "UNKNOWN_ERROR"
logger.warning("DEUNA SDK error: \(error.type) / \(code)")
renderRecovery(error.type)
}成功はエクスペリエンス固有#
| 体験 | 何 onSuccess を表す | 次のステップ |
|---|---|---|
| 支払いウィジェット | ウィジェットが購入プロセスを完了し、注文形式のデータを返します。 | 注文をバックエンドで再調整してから履行してください。 |
| 次のアクション | 必要な顧客アクションが完了し、注文形式のデータを返します。 | 同じ注文を再取得し、別のものを作成しないでください。 |
| 要素/支払いVault | クレデンシャルまたはウォレットフローが完了しました。 | 必要なクレデンシャルまたは結果のみをバックエンドフローに送信します。 |
| バウチャー | クーポン表示またはそのサポートされているアクションが完了しました。 | 指示を表示し、その後、信頼できる非同期の支払いステータスを待ちます。 |
注文モデルはSDKコールバックの仕組みとは独立して進化します。現在のバックエンドのスキーマを使用するために、 APIエンドポイントを参照してください。 クライアントのペイロードから、任意にフィールドをコピーするのではなく。
埋め込みサイズの調整#
JavaScript
const host = document.querySelector('#deuna-widget');
await DeunaSDK.initPaymentWidget({
orderToken,
mode: 'target',
target: '#deuna-widget',
callbacks: {
onResize: ({height}) => {
host.style.height = `${Math.ceil(height)}px`;
},
onSuccess: verifyOrder,
onError: showRecovery,
},
});iframeのロード中に、ホストに安定した最小の高さを与え、その後、 onResize 更新します。小さな画面では、固定されたピクセル幅を避け、ホストがビューポート全体を埋めるようにします。
安全な取り扱いチェックリスト#
- コールバック関数をイデムポテンツに保ちます。ライフサイクル信号は、ナビゲーションまたは再試行中に発生する可能性があります。
- 重複送信を
onPaymentProcessingおよびsubmit()が処理中の間に無効にします。 - 許可リストから人間が読み取り可能なコピーを表示します。デフォルトでは、生のプロバイダーメッセージを公開しないでください。
- ログ
type、安全なエラーコード、SDKバージョン、環境、および商人の関連ID—クレデンシャルまたはカードデータではありません。 - モダルの閉じ時にフォーカスを復元し、アクセス可能なライブ領域を通じてエラーを通知します。
- 曖昧なクローズ、タイムアウト、またはネットワーク中断後に現在の注文の状態を確認します。
公開ソース契約#
コールバックの形状は、現在の Webコールバックインターフェース, React Nativeコールバックインターフェース, iOSコールバックベース, および Android共有コールバック。アプリケーションでインストールされているバージョンを使用し、リポジトリの main ブランチが、ピン留設定されたリリースよりも新しい場合は、