Mercado Pagoをウィジェット経由で有効化
前提条件#
Mercado Pago Walletの支払い導入前に、以下の点を確認してください。
- Mercado Pagoを有効化 DEUNAのAdminパネルで。
- 生成された注文トークン。
- プロジェクトに DEUNA SDK を統合してください。
- レビューを実施しました 支払いウィジェットのドキュメント ご自身のプラットフォーム向けに。
支払い方法の設定#
以下の情報を表示する 決済ウィジェット Mercado Pagoの設定を paymentMethods parameter.
JSON
[
{
"paymentMethod": "wallet",
"processors": [ "mercadopago_wallet" ]
}
]Web上の支払いウィジェット#
JavaScript
DeunaSDK.initPaymentWidget({
orderToken: 'YOUR_ORDER_TOKEN',
paymentMethods: [
{
paymentMethod: 'wallet',
processors: ['mercadopago_wallet'],
},
],
callbacks: { ... },
});iOS用の支払いウィジェット#
Modal (PageSheet)Swift
deunaSDK.initPaymentWidget(
orderToken: "<DEUNA_ORDER_TOKEN>",
callbacks: PaymentWidgetCallbacks(
onSuccess: { order in
// Close the DEUNA widget
self.deunaSDK.close {
// Handle successful payment:
// - Navigate to confirmation screen
// - Show success message
// - Update order status
}
},
onError: { error in
if error.type == .paymentError {
// Handle payment errors:
// - Show error message
// - Allow retry
// - Log analytics
}
}
),
paymentMethods: [
[
"paymentMethod": "wallet",
"processors": ["mercadopago_wallet"]
]
]
)Embedded (Swift UI)Swift
import DeunaSDK
import SwiftUI
struct PaymentView: View {
let deunaSDK: DeunaSDK
var body: some View {
VStack {
DeunaWidget(
deunaSDK: deunaSDK,
configuration: PaymentWidgetConfiguration(
orderToken: "YOUR_ORDER_TOKEN",
callbacks: PaymentWidgetCallbacks(
onSuccess: { order in
deunaSDK.dispose {
// Handle post-payment flow
}
},
onError: { error in
if error.type == .paymentError {
// Implement error handling
}
}
),
paymentMethods: [
[
"paymentMethod": "wallet",
"processors": ["mercadopago_wallet"]
]
]
)
)
}
}
}Android用の支払いウィジェット#
セキュリティ上の理由から、 Mercado Pago は、その支払いURLをロードする必要がある カスタムタブ WebViewではなく
重要なことは、ある カスタムタブ はオープン状態です。 設定の更新を避ける あなたの UI または 操作の実行 例えば、ナビゲーションやダイアログの表示など。これらの操作は、 予期せぬ動作,を含む アプリがクラッシュする.
したがって、これらの操作は、ユーザーが「カスタム」タブを閉じた後にのみ実行する必要があります。 ユーザーが「カスタム」タブを閉じたことを検出するには、 「カスタム」タブが閉じます、以下のコードをMainActivityに実装してください MainActivity:
Kotlin
class MainActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
/**
* Register for activity result callbacks,
* needed to wait until the custom chrome tab is closed
*/
ExternalUrlHelper.registerForActivityResult(this)
}
}現在、決済ウィジェットを表示します
Modal (DialogFragment)Kotlin
deunaSDK.initPaymentWidget(
orderToken = "<DEUNA_ORDER_TOKEN>",
callbacks = PaymentWidgetCallbacks().apply {
onSuccess = { order ->
// Close the DEUNA widget
this.deunaSDK.close {
// Handle successful payment:
// - Navigate to confirmation screen
// - Show success message
// - Update order status
}
}
onError = { error ->
if (error.type == PaymentErrorType.PAYMENT_ERROR) {
// Handle payment errors:
// - Show error message
// - Allow retry
// - Log analytics
}
}
},
paymentMethods = listOf(
mapOf(
"paymentMethod" to "wallet",
"processors" to listOf("mercadopago_wallet")
)
)
)Jetpack ComposeKotlin
@Composable
fun YourScreen(
deunaSDK: DeunaSDK,
orderToken: String,
userToken: String,
) {
// Maintains the Deuna WebView instance across recompositions
val deunaWidget = remember { mutableStateOf<DeunaWidget?>(null) }
Column(modifier = Modifier.padding(16.dp)) {
// Container for the embedded payment widget
// MUST specify dimensions (e.g., .height(400.dp) or .weight(1f) in parent Column)
Box(
modifier = yourModifier
) {
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { context ->
DeunaWidget(context).apply {
this.widgetConfiguration = PaymentWidgetConfiguration(
sdkInstance = deunaSDK,
orderToken = orderToken,
userToken = userToken,
paymentMethods = listOf(
mapOf(
"paymentMethod" to "wallet",
"processors" to listOf("mercadopago_wallet")
)
),
callbacks = PaymentWidgetCallbacks().apply {
onSuccess = { data ->
deunaWidget.value?.waitUntilExternalUrlIsClosed {
// Handle post-payment flow
}
}
onError = { error ->
// Handle error
}
},
)
this.build() // Render the DEUNA widget
// Store reference for later submission
deunaWidget.value = this
}
}
)
}
Spacer(modifier = Modifier.height(16.dp))
}
// Critical: Clean up DeunaWidget resources when composable leaves composition
DisposableEffect(Unit) {
onDispose {
deunaWidget.value?.destroy()
Log.d("DeunaWidget", "WebView resources cleaned up")
}
}
}支払いウィジェット - React Native#
JavaScript
import React from 'react';
import { View, Button } from 'react-native';
import { DeunaSDK, DeunaWidget } from '@deuna/react-native-sdk';
// Initialize SDK
const deunaSDK = DeunaSDK.initialize({
publicApiKey: 'YOUR_PUBLIC_API_KEY',
environment: 'sandbox', // or "production"
});
const PaymentScreen = () => {
const launchPayment = () => {
deunaSDK.initPaymentWidget({
orderToken: 'YOUR_ORDER_TOKEN',
paymentMethods: [
{
paymentMethod: 'wallet',
processors: ['mercadopago_wallet'],
},
],
callbacks: {
onSuccess: async (order) => {
await deunaSDK.close();
// Handle successful payment
console.log('Payment successful:', order);
},
onError: async (error) => {
// Handle payment errors
console.error('Payment error:', error);
if (...) {
// Always await the close operation
await deunaSDK.close();
// Handle UI updates
console.log('Payment widget closed due to error.');
}
},
},
});
};
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<DeunaWidget instance={deunaSDK} />
<Button title="Mercado Pagoでの支払い" onPress={launchPayment} />
</View>
);
};