Android SDK
DEUNA Android SDKをインストールし、モーダル、埋め込み、ウォレット、バウチャー、および次アクションのフローを統合します。
このページで
要件#
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 {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}内に追加します。 dependencyResolutionManagementを使用していないプロジェクトの場合は、ルートの build.gradle:
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}にリポジトリを追加します。
- build.gradleと依存関係を設定
minSdkが24以上であることを確認し、DEUNA SDK依存関係を追加します:
android {
defaultConfig {
minSdk = 24
}
}
dependencies {
implementation("com.github.deuna-developers:deuna-sdk-android:2.12.7")
}android {
defaultConfig {
minSdk 24
}
}
dependencies {
implementation 'com.github.deuna-developers:deuna-sdk-android:2.12.7'
}初期化#
import com.deuna.maven.DeunaSDK
import com.deuna.maven.shared.Environmentアプリのアーキテクチャに応じて、SDKを2つの方法で初期化できます:
グローバル共有インスタンス
アプリケーション起動時に一度だけ初期化します(例: Application.onCreate):
DeunaSDK.initialize(
environment = Environment.SANDBOX, // Environment.SANDBOX or Environment.PRODUCTION
publicApiKey = "YOUR_PUBLIC_API_KEY"
)
val deunaSDK = DeunaSDK.sharedフローまたは画面インスタンス
特定のチェックアウト画面またはViewModelのインスタンスを作成します:
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:
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 | ダイアログ | 埋め込み | 説明 |
|---|---|---|---|---|
context | Context | ✅ | ❌ | ダイアログに必須. UIリソースとウィンドウトークンを提供するアクティビティコンテキスト。 |
orderToken | String | ✅ | ✅ | 必須。DEUNA APIで作成された注文の一意トークン。 重要: アプリ内で redirect_url を実行させたい場合は、注文作成時に onSuccess を定義しないでください。 |
callbacks | PaymentWidgetCallbacks | ✅ | ✅ | 必須. イベントリスナー (onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onEventDispatch). |
userToken | String? | ✅ | ✅ | 任意。顧客のDEUNAベアラートークン。 重要:保存済みカードを表示するには、注文作成時に渡された userToken は注文作成時の billing_address.email と一致する必要があります。 |
styleFile | String? | ✅ | ✅ | 任意。カスタムテーマブランディング(色、タイポグラフィ、ロゴ)を適用するためのDEUNA提供のUUID。 |
paymentMethods | List<Map<String, Any>>? | ✅ | ✅ | 任意. ダイレクトフォームフロー用の単一の支払い方法リスト (例: listOf(mapOf("paymentMethod" to "bnpl", "processors" to listOf("kueski")))). |
language | String? | ✅ | ✅ | 任意。言語コード("es", "en", "pt")。加盟店のデフォルト設定を上書きします。 |
behavior | WidgetBehavior? | ✅ | ✅ | 任意。フローカスタマイズ(例: WidgetBehavior(paymentMethods = mapOf("flowType" to "twoStep")) PayPal用、またはSplit Payments splitPayments. |
fraudCredentials | Map<String, Any>? | ✅ | ✅ | 任意. 不正防止プロバイダーの認証情報 (例: mapOf("RISKIFIED" to mapOf("storeDomain" to "example.com"))). |
domain | String? | ✅ | ✅ | 任意。デフォルトのベースホスト(https://pay.deuna.io). |
hidePayButton | Boolean | ❌ | ✅ | 任意. 埋め込みモードで、アプリケーションがネイティブボタンをレンダリングする場合、組み込みの支払いボタンを非表示にします。 |
利用可能な機能#
| 体験 | メソッド | 設定タイプ | 重要な入力 |
|---|---|---|---|
| 支払いウィジェット | initPaymentWidget(...) | PaymentWidgetConfiguration | context, orderToken, PaymentWidgetCallbacks |
| 支払いVault | initElements(...) | ElementsWidgetConfiguration | context, ElementsCallbacks; types 省略可能 |
| クリック・トゥ・ペイ | initElements(...) | ElementsWidgetConfiguration | types = listOf(mapOf("name" to "click_to_pay")) |
| 次のアクション | initNextAction(...) | NextActionWidgetConfiguration | context, orderToken, NextActionCallbacks |
| バウチャー | initVoucherWidget(...) | VoucherWidgetConfiguration | context, orderToken, VoucherCallbacks |
すべてのモーダルメソッドは、サポートされている場合、オプションの言語、不正防止、ドメイン入力を受け付けます。上書きしないでください。 domain DEUNAが専用ホストを割り当てない限り。
決済ウィジェットの埋め込み#
ウィジェットをアプリケーション内に埋め込んで表示するには、 Jetpack Composeを使用します。 AndroidView および DeunaWidget.
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コンテンツの高さに合わせて動的に拡大・縮小し、スクロール可能なコンテナ内への埋め込みに最適です。
- マニフェスト設定:チェックアウトActivityが
adjustResizeを返しますAndroidManifest.xml:
<activity
android:name=".CheckoutActivity"
android:windowSoftInputMode="adjustResize" />- **で設定されていることを確認してください。**Accertify 設定アセット
DeunaWidgetComposeスクロール統合setOnScrollByCallbackを垂直スクロールコンテナ内に配置し、ScrollState:
@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:
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チェックアウトアーキテクチャは、個別の支払いフォームに直接起動することをサポートしています。これは
deunaSDK.initPaymentWidget(
context = this,
orderToken = "YOUR_ORDER_TOKEN",
callbacks = callbacks,
paymentMethods = listOf(
mapOf(
"paymentMethod" to "bnpl",
"processors" to listOf("kueski")
)
)
)設定の優先順位解決
| 優先度 | ソース | 動作 |
|---|---|---|
| 1 (最高) | paymentMethods を返します .initPaymentWidget() | ダイレクトフォームフロー:指定された単一の支払い方法フォーム(例:Kueski)に直ちに開き、方法セレクターをバイパスします。 |
| 2 | include_payment_options 注文作成時 | 複数方法選択:注文作成時に指定され、かつアカウントで有効な支払い方法のみを表示します。 |
| 3 (フォールバック) | マーチャントレベル設定 (/payment-methods) | フルセレクター:SDK呼び出しと注文ペイロードの両方で省略された場合、マーチャントアカウントに設定されたすべての有効な支払い方法を表示します。 |
PayPal設定
フロータイプ (flowType)
deunaSDK.initPaymentWidget(
context = this,
orderToken = orderToken,
behavior = WidgetBehavior(
paymentMethods = mapOf(
"flowType" to "twoStep" // "twoStep" (summary first) or "singleStep" (direct)
)
)
)自動購入 (express)
顧客が以前にPayPalでクイック支払いを承認している場合、即時処理を有効にします:
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)
)
)
)メインウィジェットセレクターで顧客が選択できる複数の支払いオプションを表示したい場合は、
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)
を省略し、注文作成時に
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バックエンドで注文を更新し、ウィジェットに通知します:
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 を省略):
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)
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()
}クリック・トゥ・ペイ
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 | ダイアログ | 埋め込み | 説明 |
|---|---|---|---|---|
context | Context | ✅ | ❌ | ダイアログに必須。Activityコンテキスト。 |
callbacks | ElementsCallbacks | ✅ | ✅ | 必須. イベントリスナー (onSuccess, onError, onClosed, onEventDispatch). |
userInfo | UserInfo? | ✅ | ✅ | 顧客の firstName, lastName, および email。Click to Payに必須。 |
userToken | String? | ✅ | ✅ | 任意。DEUNAベアラートークン。指定する場合は userInfo. |
types | List<Map<String, Any>>? | ✅ | ✅ | 任意を省略します。デフォルトのCard Vaultエクスペリエンスをレンダリングするには省略します。Click to Payをレンダリングするには listOf(mapOf("name" to "click_to_pay")) を指定します。 |
orderToken | String? | ✅ | ✅ | 任意。一意の注文トークン。顧客詳細は billing_address. |
styleFile | String? | ✅ | ✅ | 任意から抽出できます。テーマカスタマイズUUID。 |
widgetExperience | ElementsWidgetExperience? | ✅ | ✅ | 任意. showSavedCardFlow (カード保存トグル)と defaultCardFlow (デフォルトとして保存トグル)。 |
domain | String? | ✅ | ✅ | 任意。ホストを上書きします(https://elements.deuna.com). |
hidePayButton | Boolean | ❌ | ✅ | 任意。埋め込み時にボタンを非表示にします。カスタムボタンには isValid および submit を使用します。 |
ネイティブ Google Pay#
Google Payボタンをレンダリングする前に、マーチャント設定とデバイス機能を確認してください。
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:
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 チャレンジまたはリダイレクトが必要であると報告した場合、同じ注文トークンを使用してください。
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支払い状態を使用します。
クーポンを開く#
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配置 | 必須パラメータ |
|---|---|---|
MERCADOPAGO | implementation("com.mercadolibre.android.device:sdk:4.0.1") | (不要 - emptyMap()) |
RISKIFIED | implementation("com.riskified:android-sdk:1.11.0:nogoogle@aar") | storeDomain |
CYBERSOURCE | app/libs/cybersource/*.aar | orgId, merchantId (オプション: fpServer) |
SIGNIFYD | app/libs/signifyd/*.aar | orgId (オプション: fpServer) |
ACCERTIFY | app/libs/accertify/*.aar + 推移的依存関係 | 設定ファイルを src/main/assets/ (オプション: locationConsent, phoneConsent) |
Accertifyアセットと推移的依存関係
- AARと依存関係Accertify 設定アセット
inmobile.aarおよびinmobile-common.aarを返しますapp/libs/accertify/、および推移的依存関係を追加:
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")
}- 設定アセット: 2つのファイルを内部に配置
app/src/main/assets/:server_keys_message_hosted.json: Accertifyが提供する公開暗号化キー。inmobile.properties: 加盟店詳細を含む設定ファイル:PROPERTIESregisterUrl=YOUR_INMOBILE_ENDPOINT_URL logUrl=YOUR_INMOBILE_ENDPOINT_URL accountGuid=YOUR_ACCOUNT_GUID serverKeysMessage=server_keys_message_hosted.json
Mercado Pagoのセットアップと早期初期化
- : Mercado Libreリポジトリを以下に追加:
settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven(url = "https://artifacts.mercadolibre.com/repository/android-releases/")
}
}- : 依存関係を以下に追加:
app/build.gradle.kts:
dependencies {
implementation("com.mercadolibre.android.device:sdk:4.0.1")
}- : フィンガープリンティングの事前ウォームアップ: Mercado Pagoはハードウェアプロファイリングを実行するために最大 3.5 秒 : を必要とします。以下を呼び出します:
initializeFraudProvidersを返しますApplication.onCreateまたはMainActivity.onCreate:
DeunaSDK.initializeFraudProviders(
context = applicationContext,
params = mapOf(
"MERCADOPAGO" to emptyMap<String, Any>()
),
onSuccess = {
// Fingerprint collected and ready in background
},
onError = { error ->
// Handle initialization error
}
): 経由での直接呼び出し generateFraudId
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は購入時に内部で識別子を生成します:
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 初期化の失敗と支払いの拒否を区別します:
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のライフサイクル処理に関する情報。