メインコンテンツへスキップ
このページで

要件#

DEUNA Android SDKを統合するには、プロジェクトが以下の要件を満たしていることを確認してください:

  • 最小SDKバージョン: minSdkVersion 24 以上(Android API 24+)
  • Android Gradle Plugin (AGP): バージョン8.5.1以上(Android 16 KBページサイズサポートに必要)
  • プログラミング言語: KotlinまたはJava
  • DEUNA認証情報: アクティブなアカウントと有効な認証情報(認証情報の取得に遅延が発生する場合は support@deuna.com に連絡)

インストール#

1. JitPackリポジトリを追加

JitPackリポジトリを dependencyResolutionManagement ブロックに追加してください: settings.gradle.kts ) に含まれていることを確認します。 settings.gradle):

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven(url = "https://jitpack.io")
    }
}

内に追加します。 dependencyResolutionManagementを使用していないプロジェクトの場合は、ルートの build.gradle:

build.gradleGROOVY
allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

にリポジトリを追加します。

  1. build.gradleと依存関係を設定 minSdk が24以上であることを確認し、DEUNA SDK依存関係を追加します:
android {
    defaultConfig {
        minSdk = 24
    }
}

dependencies {
    implementation("com.github.deuna-developers:deuna-sdk-android:2.12.7")
}

初期化#

Kotlin
import com.deuna.maven.DeunaSDK
import com.deuna.maven.shared.Environment

アプリのアーキテクチャに応じて、SDKを2つの方法で初期化できます:

グローバル共有インスタンス

アプリケーション起動時に一度だけ初期化します(例: Application.onCreate):

Kotlin
DeunaSDK.initialize(
    environment = Environment.SANDBOX, // Environment.SANDBOX or Environment.PRODUCTION
    publicApiKey = "YOUR_PUBLIC_API_KEY"
)

val deunaSDK = DeunaSDK.shared

フローまたは画面インスタンス

特定のチェックアウト画面またはViewModelのインスタンスを作成します:

Kotlin
val deunaSDK = DeunaSDK(
    environment = Environment.SANDBOX,
    publicApiKey = "YOUR_PUBLIC_API_KEY"
)

Payment Widget の起動#

Payment Widgetは、顧客に複数の支払い方法を提供します:

  • クレジットカードおよびデビットカード:Visa、Mastercard、American Express、およびコブランドカード。
  • 代替支払い方法(APM):OXXO、KueskiPay、Aplazo、Daviplata、Nequiなど。
  • デジタルウォレット: Google PayとPayPal。

ダイアログで表示

支払いウィジェットを DialogFragment, 呼び出し initPaymentWidget Activityを渡して表示するには Context:

Kotlin
import com.deuna.maven.initPaymentWidget
import com.deuna.maven.widgets.payment_widget.PaymentWidgetCallbacks
import com.deuna.maven.payments.PaymentsError

deunaSDK.initPaymentWidget(
    context = this, // Activity context
    orderToken = "YOUR_ORDER_TOKEN",
    callbacks = PaymentWidgetCallbacks().apply {
        onSuccess = { order ->
            deunaSDK.close() // Close the DialogFragment
            // YOUR CODE HERE: Handle successful payment (e.g. navigate to confirmation)
        }
        onError = { error ->
            // Error handling
            when (error.type) {
                PaymentsError.Type.INITIALIZATION_FAILED -> {
                    deunaSDK.close()
                    // YOUR CODE HERE: Handle initialization failure (e.g. show alert or fallback)
                }
                PaymentsError.Type.PAYMENT_ERROR -> {
                    // YOUR CODE HERE: Handle payment processing failure (e.g. prompt retry)
                }
                else -> {}
            }
        }
        onClosed = { action ->
            // Widget closed: action == CloseAction.USER_ACTION or CloseAction.SYSTEM_ACTION
            // YOUR CODE HERE: Handle dialog dismissal
        }
        onCardBinDetected = { metadata, refetchOrder ->
            if (metadata != null) {
                // YOUR CODE HERE: Handle card brand or BIN detection (e.g. apply discounts)
            }
        }
        onInstallmentSelected = { metadata, refetchOrder ->
            // YOUR CODE HERE: Handle installment plan selection
        }
        onPaymentProcessing = {
            // YOUR CODE HERE: Payment processing started (e.g. disable UI buttons)
        }
        onEventDispatch = { event, payload ->
            // YOUR CODE HERE: Track analytics event
        }
    },
    userToken = "YOUR_USER_TOKEN", // optional
    styleFile = "YOUR_STYLE_FILE_UUID", // optional
    language = "en" // optional: "es", "en", "pt"
)

パラメータリファレンス

パラメータTypeダイアログ埋め込み説明
contextContext✅❌ダイアログに必須. UIリソースとウィンドウトークンを提供するアクティビティコンテキスト。
orderTokenString✅✅必須。DEUNA APIで作成された注文の一意トークン。

重要: アプリ内で redirect_url を実行させたい場合は、注文作成時に onSuccess を定義しないでください。
callbacksPaymentWidgetCallbacks✅✅必須. イベントリスナー (onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onEventDispatch).
userTokenString?✅✅任意。顧客のDEUNAベアラートークン。

重要:保存済みカードを表示するには、注文作成時に渡された userToken は注文作成時の billing_address.email と一致する必要があります。
styleFileString?✅✅任意。カスタムテーマブランディング(色、タイポグラフィ、ロゴ)を適用するためのDEUNA提供のUUID。
paymentMethodsList<Map<String, Any>>?✅✅任意. ダイレクトフォームフロー用の単一の支払い方法リスト (例: listOf(mapOf("paymentMethod" to "bnpl", "processors" to listOf("kueski")))).
languageString?✅✅任意。言語コード("es", "en", "pt")。加盟店のデフォルト設定を上書きします。
behaviorWidgetBehavior?✅✅任意。フローカスタマイズ(例: WidgetBehavior(paymentMethods = mapOf("flowType" to "twoStep")) PayPal用、またはSplit Payments splitPayments.
fraudCredentialsMap<String, Any>?✅✅任意. 不正防止プロバイダーの認証情報 (例: mapOf("RISKIFIED" to mapOf("storeDomain" to "example.com"))).
domainString?✅✅任意。デフォルトのベースホスト(https://pay.deuna.io).
hidePayButtonBoolean❌✅任意. 埋め込みモードで、アプリケーションがネイティブボタンをレンダリングする場合、組み込みの支払いボタンを非表示にします。

利用可能な機能#

体験メソッド設定タイプ重要な入力
支払いウィジェットinitPaymentWidget(...)PaymentWidgetConfigurationcontext, orderToken, PaymentWidgetCallbacks
支払いVaultinitElements(...)ElementsWidgetConfigurationcontext, ElementsCallbacks; types 省略可能
クリック・トゥ・ペイinitElements(...)ElementsWidgetConfigurationtypes = listOf(mapOf("name" to "click_to_pay"))
次のアクションinitNextAction(...)NextActionWidgetConfigurationcontext, orderToken, NextActionCallbacks
バウチャーinitVoucherWidget(...)VoucherWidgetConfigurationcontext, orderToken, VoucherCallbacks

すべてのモーダルメソッドは、サポートされている場合、オプションの言語、不正防止、ドメイン入力を受け付けます。上書きしないでください。 domain DEUNAが専用ホストを割り当てない限り。

決済ウィジェットの埋め込み#

ウィジェットをアプリケーション内に埋め込んで表示するには、 Jetpack Composeを使用します。 AndroidView および DeunaWidget.

Kotlin
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import com.deuna.maven.DeunaSDK
import com.deuna.maven.web_views.deuna.DeunaWidget
import com.deuna.maven.web_views.deuna.extensions.build
import com.deuna.maven.widgets.configuration.PaymentWidgetConfiguration
import com.deuna.maven.widgets.payment_widget.PaymentWidgetCallbacks

@Composable
fun EmbeddedCheckoutScreen(
    deunaSDK: DeunaSDK,
    orderToken: String,
    userToken: String? = null,
) {
    // Retain the Deuna WebView instance across recompositions
    val deunaWidget = remember { mutableStateOf<DeunaWidget?>(null) }

    Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
        Box(modifier = Modifier.fillMaxWidth().weight(1f)) {
            AndroidView(
                modifier = Modifier.fillMaxSize(),
                factory = { context ->
                    DeunaWidget(context).apply {
                        this.widgetConfiguration = PaymentWidgetConfiguration(
                            sdkInstance = deunaSDK,
                            orderToken = orderToken,
                            userToken = userToken,
                            callbacks = PaymentWidgetCallbacks().apply {
                                onSuccess = { order ->
                                    // YOUR CODE HERE: Handle successful payment
                                }
                                onError = { error ->
                                    // YOUR CODE HERE: Handle payment error
                                }
                                onEventDispatch = { event, payload ->
                                    // YOUR CODE HERE: Track analytics event
                                }
                            }
                        )
                        this.build() // Render the DEUNA widget
                        deunaWidget.value = this
                    }
                }
            )
        }
    }

    // Explicitly clean up WebView resources when composable leaves composition
    DisposableEffect(Unit) {
        onDispose {
            deunaWidget.value?.destroy()
        }
    }
}

)を指定する必要があります。

自動リサイズとキーボード処理 autoResizeConfig = AutoResizeConfig(initialHeightDp = 100)を渡すと、ウィジェットは自動リサイズモードに切り替わります。WebViewコンテンツの高さに合わせて動的に拡大・縮小し、スクロール可能なコンテナ内への埋め込みに最適です。

  1. マニフェスト設定:チェックアウトActivityが adjustResize を返します AndroidManifest.xml:
AndroidManifest.xmlXML
<activity
    android:name=".CheckoutActivity"
    android:windowSoftInputMode="adjustResize" />
  1. **で設定されていることを確認してください。**Accertify 設定アセット DeunaWidget Composeスクロール統合 setOnScrollByCallback を垂直スクロールコンテナ内に配置し、 ScrollState:
Kotlin
@Composable
fun ScrollableCheckoutScreen(
    deunaSDK: DeunaSDK,
    widgetConfig: PaymentWidgetConfiguration,
) {
    val scrollState = rememberScrollState()
    val coroutineScope = rememberCoroutineScope()

    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(scrollState)
    ) {
        // Content above widget...

        AndroidView(
            modifier = Modifier.fillMaxWidth(),
            factory = { context ->
                DeunaWidget(context).apply {
                    this.widgetConfiguration = widgetConfig
                    this.build()
                }
            },
            update = { widget ->
                // Wire the SDK scroll request to Compose ScrollState
                widget.setOnScrollByCallback { amountPx ->
                    coroutineScope.launch {
                        scrollState.animateScrollBy(amountPx)
                    }
                }
            }
        )

        // Content below widget...
    }
}

をComposeのhidePayButton)

に接続します。 hidePayButton = true カスタム支払いボタン( isValid および submit:

Kotlin
PaymentWidgetConfiguration(
    sdkInstance = deunaSDK,
    orderToken = orderToken,
    hidePayButton = true,
    callbacks = callbacks
)

// When the user taps your custom native pay button:
deunaWidget.value?.isValid { isValid ->
    if (isValid) {
        deunaWidget.value?.submit { result ->
            // result.status: "success" | "error"
            // result.message: Detailed message
        }
    }
}
メソッド説明戻り値
deunaWidget.isValid { valid -> ... }アクティブな支払いフォームのユーザー入力を検証します。Boolean
deunaWidget.submit { result -> ... }ウィジェットボタンをクリックするのと同等の支払いを送信します。SubmitResult (status: "success" または status: "error")

支払い方法のフィルタリングと設定#

ダイレクトフォームフロー (paymentMethods)

アプリがウィジェット外に独自のネイティブボタンをレンダリングする場合、 フォームフロー.

を渡し、 paymentMethods を使用してプログラムで送信を処理します。 は配列として型付けされていますが、内部のチェックアウトエンジンは現在 DEUNAチェックアウトアーキテクチャは、個別の支払いフォームに直接起動することをサポートしています。これは

Kotlin
deunaSDK.initPaymentWidget(
    context = this,
    orderToken = "YOUR_ORDER_TOKEN",
    callbacks = callbacks,
    paymentMethods = listOf(
        mapOf(
            "paymentMethod" to "bnpl",
            "processors" to listOf("kueski")
        )
    )
)

設定の優先順位解決

優先度ソース動作
1 (最高)paymentMethods を返します .initPaymentWidget()ダイレクトフォームフロー:指定された単一の支払い方法フォーム(例:Kueski)に直ちに開き、方法セレクターをバイパスします。
2include_payment_options 注文作成時複数方法選択:注文作成時に指定され、かつアカウントで有効な支払い方法のみを表示します。
3 (フォールバック)マーチャントレベル設定 (/payment-methods)フルセレクター:SDK呼び出しと注文ペイロードの両方で省略された場合、マーチャントアカウントに設定されたすべての有効な支払い方法を表示します。

PayPal設定

フロータイプ (flowType)

Kotlin
deunaSDK.initPaymentWidget(
    context = this,
    orderToken = orderToken,
    behavior = WidgetBehavior(
        paymentMethods = mapOf(
            "flowType" to "twoStep" // "twoStep" (summary first) or "singleStep" (direct)
        )
    )
)

自動購入 (express)

顧客が以前にPayPalでクイック支払いを承認している場合、即時処理を有効にします:

Kotlin
deunaSDK.initPaymentWidget(
    context = this,
    orderToken = orderToken,
    callbacks = callbacks,
    paymentMethods = listOf(
        mapOf(
            "paymentMethod" to "wallet",
            "processors" to listOf("paypal_wallet"),
            "configuration" to mapOf("express" to true)
        )
    )
)

メインウィジェットセレクターで顧客が選択できる複数の支払いオプションを表示したい場合は、

Kotlin
deunaSDK.initPaymentWidget(
    context = this,
    orderToken = orderToken,
    behavior = WidgetBehavior(
        paymentMethods = mapOf(
            "creditCard" to mapOf(
                "splitPayments" to mapOf(
                    "maxCards" to 2 // Maximum number of cards allowed
                )
            )
        )
    )
)

動的スタイリングと注文更新#

外観を動的にカスタマイズ (setCustomStyle)

を省略し、注文作成時に

Kotlin
callbacks = PaymentWidgetCallbacks().apply {
    onCardBinDetected = { metadata, _ ->
        deunaSDK.setCustomStyle(
            data = mapOf(
                "theme" to mapOf(
                    "colors" to mapOf(
                        "primaryTextColor" to "#023047",
                        "buttonPrimaryFill" to "#FFB703",
                        "buttonPrimaryText" to "#000000"
                    )
                )
            )
        )
    }
}

注文合計を更新 (refetchOrder)

でオプションをフィルタリングするか、DEUNAマーチャントポータルで支払い方法を設定します。 onCardBinDetectedバックエンドで注文を更新し、ウィジェットに通知します:

Kotlin
callbacks = PaymentWidgetCallbacks().apply {
    onCardBinDetected = { metadata, _ ->
        val cardBrand = metadata?.get("cardBrand") as? String
        if (cardBrand == "Mastercard") {
            // 1. Notify backend to apply promo
            applyDiscountOnBackend(orderId, "MASTERCARD_20") {
                // 2. Refresh widget totals
                deunaSDK.refetchOrder { updatedOrder ->
                    println("Order refreshed with discount: $updatedOrder")
                }
            }
        }
    }
}

Payment Vault と Click to Pay#

Payment Vaultは、カードを安全に保存し、通常のチェックアウトを処理せずにClick to Payで支払いを行うことができるDEUNA Paymentソリューションのコンポーネントです。

ダイアログで表示

モーダルダイアログでCard Vaultを表示するには、以下を呼び出します: initElements (デフォルトのVaultの場合は types を省略):

Kotlin
import com.deuna.maven.initElements
import com.deuna.maven.shared.ElementsCallbacks
import com.deuna.maven.shared.domain.UserInfo
import com.deuna.maven.widgets.elements.ElementsWidgetExperience

deunaSDK.initElements(
    context = this,
    userToken = "<USER_TOKEN>", // optional if userInfo is provided
    userInfo = UserInfo(
        firstName = "Esteban", // optional if userToken is provided
        lastName = "Posada", // optional if userToken is provided
        email = "esteban@deuna.com" // required
    ),
    callbacks = ElementsCallbacks().apply {
        onSuccess = { response ->
            deunaSDK.close() // Close the Vault widget
            // YOUR CODE HERE: Handle card saved successfully
        }
        onError = { error ->
            deunaSDK.close() // Close the widget on error
            // YOUR CODE HERE: Handle error
        }
        onClosed = { action ->
            // Widget closed: action == CloseAction.USER_ACTION or CloseAction.SYSTEM_ACTION
            // YOUR CODE HERE: Handle widget dismissal
        }
        onEventDispatch = { type, response ->
            // YOUR CODE HERE: Listen to widget events
        }
    },
    orderToken = "YOUR_ORDER_TOKEN", // optional
    widgetExperience = ElementsWidgetExperience( // optional
        userExperience = ElementsWidgetExperience.UserExperience(
            showSavedCardFlow = true, // optional: show card saving toggle
            defaultCardFlow = true // optional: show toggle to save as default
        )
    )
)

埋め込み表示(Jetpack Compose)

Kotlin
import com.deuna.maven.widgets.configuration.ElementsWidgetConfiguration

DeunaWidget(context).apply {
    this.widgetConfiguration = ElementsWidgetConfiguration(
        sdkInstance = deunaSDK,
        orderToken = "YOUR_ORDER_TOKEN",
        userInfo = UserInfo(
            firstName = "Esteban",
            lastName = "Posada",
            email = "esteban@deuna.com"
        ),
        callbacks = ElementsCallbacks().apply {
            onSuccess = { response ->
                // Explicitly release resources or update state
                // YOUR CODE HERE: Handle card saved
            }
            onError = { error ->
                // YOUR CODE HERE: Handle error
            }
        },
        autoResizeConfig = AutoResizeConfig(initialHeightDp = 150)
    )
    this.build()
}

クリック・トゥ・ペイ

Kotlin
deunaSDK.initElements(
    context = this,
    userInfo = UserInfo( // mandatory for Click To Pay
        firstName = "Esteban",
        lastName = "Posada",
        email = "esteban@deuna.com"
    ),
    callbacks = ElementsCallbacks().apply {
        onSuccess = { data ->
            deunaSDK.close()
            // YOUR CODE HERE: Handle Click to Pay success
        }
        onError = { error ->
            deunaSDK.close()
            // YOUR CODE HERE: Handle error
        }
        onClosed = { action ->
            // YOUR CODE HERE: Handle widget dismissal
        }
    },
    types = listOf(
        mapOf("name" to "click_to_pay")
    )
)

パラメータリファレンス

パラメータTypeダイアログ埋め込み説明
contextContext✅❌ダイアログに必須。Activityコンテキスト。
callbacksElementsCallbacks✅✅必須. イベントリスナー (onSuccess, onError, onClosed, onEventDispatch).
userInfoUserInfo?✅✅顧客の firstName, lastName, および email。Click to Payに必須。
userTokenString?✅✅任意。DEUNAベアラートークン。指定する場合は userInfo.
typesList<Map<String, Any>>?✅✅任意を省略します。デフォルトのCard Vaultエクスペリエンスをレンダリングするには省略します。Click to Payをレンダリングするには listOf(mapOf("name" to "click_to_pay")) を指定します。
orderTokenString?✅✅任意。一意の注文トークン。顧客詳細は billing_address.
styleFileString?✅✅任意から抽出できます。テーマカスタマイズUUID。
widgetExperienceElementsWidgetExperience?✅✅任意. showSavedCardFlow (カード保存トグル)と defaultCardFlow (デフォルトとして保存トグル)。
domainString?✅✅任意。ホストを上書きします(https://elements.deuna.com).
hidePayButtonBoolean❌✅任意。埋め込み時にボタンを非表示にします。カスタムボタンには isValid および submit を使用します。

ネイティブ Google Pay#

Google Payボタンをレンダリングする前に、マーチャント設定とデバイス機能を確認してください。

Kotlin
import com.deuna.maven.wallets.GetWalletsAvailableParams
import com.deuna.maven.wallets.WalletProvider
import com.deuna.maven.wallets.getWalletsAvailable

val userInfo = UserInfo(email = "ada@example.com")
val params = GetWalletsAvailableParams(
    orderToken = "YOUR_ORDER_TOKEN",
    userInfo = userInfo
)

deunaSDK.getWalletsAvailable(
    context = this,
    params = params
) { wallets, error ->
    if (error != null) {
        // YOUR CODE HERE: Handle wallet availability check error
        return@getWalletsAvailable
    }

    // Check if Google Pay is available on this device and merchant account
    val isGooglePayAvailable = WalletProvider.GOOGLE_PAY in wallets
    // YOUR CODE HERE: Update Google Pay button visibility in UI
}

利用可能性の確認が成功した後、ボタンアクションからGoogle Payを起動します: initElements:

Kotlin
deunaSDK.initElements(
    context = this,
    userInfo = userInfo,
    callbacks = ElementsCallbacks().apply {
        onSuccess = { data ->
            // YOUR CODE HERE: Handle Google Pay authorization success
        }
        onError = { error ->
            // YOUR CODE HERE: Handle Google Pay error
        }
        onClosed = { action ->
            // YOUR CODE HERE: Handle Google Pay sheet dismissal
        }
    },
    types = listOf(
        mapOf("name" to "GOOGLE_PAY")
    ),
    orderToken = "YOUR_ORDER_TOKEN"
)

参照 Google Pay マーチャント登録とテスト設定用。

保留中の操作を続行#

DEUNA が支払いに対してサポートされている 3DS チャレンジまたはリダイレクトが必要であると報告した場合、同じ注文トークンを使用してください。

Kotlin
import com.deuna.maven.widgets.next_action.NextActionCallbacks

deunaSDK.initNextAction(
    context = this,
    orderToken = "YOUR_ORDER_TOKEN",
    callbacks = NextActionCallbacks().apply {
        onSuccess = { order ->
            deunaSDK.close()
            // YOUR CODE HERE: Handle 3DS or action completion
        }
        onError = { error ->
            deunaSDK.close()
            // YOUR CODE HERE: Handle error
        }
        onClosed = { action ->
            // YOUR CODE HERE: Handle modal dismissal
        }
    }
)

SDKは、サポートされている外部URLを開き、アクティブなウィジェットに戻ります。インターフェースにはコールバックの状態を使用し、履行には最終的なDEUNA支払い状態を使用します。

クーポンを開く#

Kotlin
import com.deuna.maven.widgets.voucher.VoucherCallbacks

deunaSDK.initVoucherWidget(
    context = this,
    orderToken = "YOUR_ORDER_TOKEN",
    callbacks = VoucherCallbacks().apply {
        onSuccess = { order ->
            // YOUR CODE HERE: Handle voucher instructions display
        }
        onError = { error ->
            // YOUR CODE HERE: Handle error
        }
        onClosed = { action ->
            // YOUR CODE HERE: Handle widget dismissal
        }
    }
)

不正デバイスデータとフィンガープリンティング#

DEUNA Android SDKは モジュラーアーキテクチャを採用しています: デフォルトではサードパーティの不正防止SDKをバンドルしません。 使用する特定のプロバイダーのみを追加してください。

対応プロバイダー

プロバイダGradle依存関係 / AAR配置必須パラメータ
MERCADOPAGOimplementation("com.mercadolibre.android.device:sdk:4.0.1")(不要 - emptyMap())
RISKIFIEDimplementation("com.riskified:android-sdk:1.11.0:nogoogle@aar")storeDomain
CYBERSOURCEapp/libs/cybersource/*.aarorgId, merchantId (オプション: fpServer)
SIGNIFYDapp/libs/signifyd/*.aarorgId (オプション: fpServer)
ACCERTIFYapp/libs/accertify/*.aar + 推移的依存関係設定ファイルを src/main/assets/ (オプション: locationConsent, phoneConsent)

Accertifyアセットと推移的依存関係

  1. AARと依存関係Accertify 設定アセット inmobile.aar および inmobile-common.aar を返します app/libs/accertify/、および推移的依存関係を追加:
<|DSML|function_callsGROOVY
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")
}
  1. 設定アセット: 2つのファイルを内部に配置 app/src/main/assets/:
    • server_keys_message_hosted.json: Accertifyが提供する公開暗号化キー。
    • inmobile.properties: 加盟店詳細を含む設定ファイル:
      PROPERTIES
      registerUrl=YOUR_INMOBILE_ENDPOINT_URL
      logUrl=YOUR_INMOBILE_ENDPOINT_URL
      accountGuid=YOUR_ACCOUNT_GUID
      serverKeysMessage=server_keys_message_hosted.json

Mercado Pagoのセットアップと早期初期化

  1. : Mercado Libreリポジトリを以下に追加: settings.gradle.kts:
settings.gradle.ktsKotlin
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven(url = "https://artifacts.mercadolibre.com/repository/android-releases/")
    }
}
  1. : 依存関係を以下に追加: app/build.gradle.kts:
app/build.gradle.ktsKotlin
dependencies {
    implementation("com.mercadolibre.android.device:sdk:4.0.1")
}
  1. : フィンガープリンティングの事前ウォームアップ: Mercado Pagoはハードウェアプロファイリングを実行するために最大 3.5 秒 : を必要とします。以下を呼び出します: initializeFraudProviders を返します Application.onCreate または MainActivity.onCreate:
Kotlin
DeunaSDK.initializeFraudProviders(
    context = applicationContext,
    params = mapOf(
        "MERCADOPAGO" to emptyMap<String, Any>()
    ),
    onSuccess = {
        // Fingerprint collected and ready in background
    },
    onError = { error ->
        // Handle initialization error
    }
)

: 経由での直接呼び出し generateFraudId

Kotlin
deunaSDK.generateFraudId(
    context = this,
    params = mapOf(
        "RISKIFIED" to mapOf(
            "storeDomain" to "yourdomain.com"
        ),
        "ACCERTIFY" to mapOf(
            "locationConsent" to true,
            "phoneConsent" to false
        ),
        "MERCADOPAGO" to emptyMap()
    )
) { fraudId ->
    // fraudId is a Base64-encoded JSON string, or null if failed
    if (fraudId != null) {
        println("Base64 Fraud ID: $fraudId")
    }
}

: を渡す fraudCredentials をウィジェットに直接渡す

: DEUNAウィジェットを使用する場合、認証情報を直接以下を介して渡します: fraudCredentials: SDKは購入時に内部で識別子を生成します:

Kotlin
PaymentWidgetConfiguration(
    sdkInstance = deunaSDK,
    orderToken = "YOUR_ORDER_TOKEN",
    callbacks = callbacks,
    fraudCredentials = mapOf(
        "RISKIFIED" to mapOf(
            "storeDomain" to "yourdomain.com"
        ),
        "MERCADOPAGO" to emptyMap()
    )
)

: 動作に関する注意点

  • ゼロ・ブラウト&クラッシュ・セーフ: プロバイダーがパラメータに含まれていても、そのネイティブ依存関係がリンクされていない場合、SDKはクラッシュせずに安全にスキップします。
  • : 並列実行: 要求されたすべてのプロバイダーのプロファイリングは、バックグラウンドスレッドで同時に実行されます。
  • フォールバック動作: デバイス上で有効なプロバイダーが設定されていないか利用できない場合、 generateFraudId は null.

コールバックとライフサイクル参照を参照してください。#

コールバック / メソッドダイアログ埋め込み説明
onSuccess✅✅支払いまたはカード保管操作が正常に完了しました。注文または認証情報ペイロードを受け取ります。呼び出し deunaSDK.close() (ダイアログ)または destroy() (埋め込み)。
onError✅✅初期化または支払い処理中にエラーが発生しました。型指定された PaymentsError または ElementsError.
onClosed✅❌ダイアログが閉じられました。受け取る CloseAction.USER_ACTION (手動で閉じられた)または CloseAction.SYSTEM_ACTION (経由でクローズ) close()).
onPaymentProcessing✅✅顧客が支払いをタップし、支払い処理が開始されたときにトリガーされます。ボタンを無効化し、進行状況インジケーターを表示するために使用します。
onCardBinDetected✅✅カードBINが検出またはクリアされたときにトリガーされます(null お客様が番号を削除したときに返されます)。フランチャイズ割引に使用します。
onInstallmentSelected✅✅顧客が分割払いを選択したときにトリガーされます(null 一括払いのときに返されます)。
onEventDispatch✅✅すべての基盤となる CheckoutEvent または ElementsEvent データペイロード付きの発生。
close()✅❌外部URLタブが完了した後、アクティブなモーダルダイアログを閉じます。
destroy()❌✅コンポーザブルがアンマウントされるときにWebViewリソースをクリーンアップします。

エラーの処理(onError)

検査 error.type 初期化の失敗と支払いの拒否を区別します:

Kotlin
onError = { error ->
    when (error.type) {
        PaymentsError.Type.INITIALIZATION_FAILED -> {
            // Widget failed to load; close dialog and notify user
            deunaSDK.close()
        }
        PaymentsError.Type.PAYMENT_ERROR -> {
            // Transaction declined or processor error; prompt retry
        }
        else -> {}
    }
}

公式の例とソースコード#

例の ExploreViewModel.kt 構成ファクトリと EmbeddedScreen.kt WebViewのライフサイクル処理に関する情報。

このセクションで