Langsung ke konten utama

Integrasi SDK React Native

SDK React Native Dodo Payments memungkinkan Anda untuk membangun pengalaman pembayaran yang aman di aplikasi Android dan iOS asli Anda. SDK kami menyediakan komponen UI dan layar yang dapat disesuaikan untuk mengumpulkan detail pembayaran.

Fitur

Simplified Security

Kumpulkan data pembayaran sensitif dengan aman sambil tetap mematuhi PCI

Multiple Payment Methods

Terima berbagai metode pembayaran untuk memperluas jangkauan global

Native UI

Layar dan elemen native untuk Android dan iOS
Saat ini, Apple Pay, Google Pay, Cash App, dan UPI belum didukung di SDK React Native. Kami sedang bekerja untuk menambahkan dukungan untuk metode pembayaran ini pada rilis mendatang.

Instalasi

1

Install the SDK

Instal Dodo Payments SDK menggunakan pengelola paket pilihan Anda:
npm install dodopayments-react-native-sdk
2

Platform-specific setup

Jalankan pod install di folder iOS Anda:
cd ios && pod install && npm run ios

Pengaturan Sisi Klien

1

Get Publishable Key

Dapatkan kunci publik Anda dari dasbor Dodo Payments. (Berbeda untuk mode uji dan langsung) https://app.dodopayments.com/developer/others
2

Setup Payment Provider

Bungkus aplikasi Anda dengan DodoPaymentProvider:
App.tsx
import React from 'react';
import { DodoPaymentProvider } from 'dodopayments-react-native-sdk';
import PaymentScreen from './PaymentScreen';

function App() {
  return (
    <DodoPaymentProvider publishableKey="YOUR_PUBLISHABLE_KEY">
      <PaymentScreen />
    </DodoPaymentProvider>
  );
}

export default App;
Anda perlu menghasilkan kunci API dari dasbor Dodo Payments Anda. Lihat Panduan pembuatan kunci API untuk instruksi terperinci.
3

Create payment utility function

Buat fungsi utilitas untuk mengambil parameter pembayaran dari API backend Anda:
utils/fetchPaymentParams.ts
const API_URL = 'YOUR_BACKEND_URL'; // Replace with your server URL

const fetchPaymentParams = async () => {
  const response = await fetch(`${API_URL}/create-payment`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
  });
  
  if (!response.ok) {
    throw new Error('Failed to fetch payment parameters');
  }
  
  return await response.json();
};

export default fetchPaymentParams;
Fungsi ini mengasumsikan Anda memiliki endpoint API backend yang membuat payment intent dan mengembalikan client secret. Pastikan backend Anda dikonfigurasi dengan benar untuk menangani pembuatan pembayaran. Lihat Tutorial Integrasi API kami untuk contoh pengaturan backend.
4

Implement the payment screen

Buat layar pembayaran Anda menggunakan hook useCheckout. Berikut implementasinya yang lengkap:
PaymentScreen.tsx
import React from 'react';
import { View, Text, useColorScheme } from 'react-native';
import { useCheckout, type sessionParams } from 'dodopayments-react-native-sdk';
import fetchPaymentParams from './utils/fetchPaymentParams';

const PaymentScreen = () => {
  const { initPaymentSession, presentPaymentSheet } = useCheckout();
  const [error, setError] = React.useState('');
  const [message, setMessage] = React.useState('');
  const [loading, setLoading] = React.useState(false);
  const [showSuccessScreen, setShowSuccessScreen] = React.useState(false);
  const isDarkMode = useColorScheme() === 'dark';

  const processPayment = async () => {
    setLoading(true);
    setMessage('');
    setError('');

    try {
      // 1. Get payment parameters from your backend
      const key = await fetchPaymentParams();
      
      // 2. Initialize payment session
      const paymentSheetParamsResult = await initPaymentSession({
        clientSecret: key.clientSecret,
      });
      
      // 3. Configure and present payment sheet
      const params: sessionParams = {
        ...(paymentSheetParamsResult as sessionParams),
        configuration: {
          appearance: {
            themes: isDarkMode ? 'dark' : 'light',
            primaryButton: {
              colors: {
                light: {
                  background: 'green',
                  componentBorder: 'green',
                  placeholderText: 'yellow',
                },
                dark: {
                  background: 'green',
                  componentBorder: 'green',
                  placeholderText: 'yellow',
                },
              },
              shapes: {
                borderRadius: 30,
                borderWidth: 3,
              },
            },
          },
          mode: 'test', // DEFAULTS TO TEST MODE
        },
      };

      const paymentSheetResponse = await presentPaymentSheet(params);

      // 4. Handle payment result
      switch (paymentSheetResponse?.status) {
        case 'cancelled':
          setError('Payment cancelled by user.');
          break;
        case 'succeeded':
          setMessage('');
          setShowSuccessScreen(true);
          break;
        case 'failed':
          setError('Payment failed : \n' + paymentSheetResponse?.message);
          break;
        default:
          setError(paymentSheetResponse?.message);
          setMessage('');
      }
    } catch (err) {
      setError('Failed to process payment');
    } finally {
      setLoading(false);
    }
  };

  return (
    <View>
      <Button 
        onPress={processPayment}
        disabled={loading}
        title={loading ? 'Processing...' : 'Pay Now'}
      />
      {error && <Text style={{ color: 'red' }}>{error}</Text>}
      {message && <Text style={{ color: 'green' }}>{message}</Text>}
      {showSuccessScreen && (
        <PaymentSuccessScreen
          amount={total}
          onContinue={() => setShowSuccessScreen(false)}
        />
      )}
    </View>
  );
};

export default PaymentScreen;
Untuk contoh lengkap dengan styling, penanganan kesalahan, dan opsi kustomisasi, lihat repositori demo kami:

Opsi Konfigurasi

Parameter Sesi

clientSecret
string
wajib
Client secret dari payment intent Anda, diperoleh dari API One time payment atau subscription.
mode
string
wajib
Mode sesi pembayaran (uji atau langsung).
configuration.appearance
object
Opsi kustomisasi untuk tampilan payment sheet
configuration.appearance.themes
string
Mode tema: 'light' atau 'dark'

Kustomisasi Penampilan

Anda dapat menyesuaikan React Native Unified Checkout agar sesuai dengan desain aplikasi Anda dengan mengubah warna, font, dan lainnya melalui parameter appearance saat memanggil initPaymentSession().

Kustomisasi Warna

Setiap kategori warna menentukan warna satu atau lebih komponen di UI. Misalnya, primary menentukan warna tombol Pay.
Kategori WarnaPenggunaan
primaryWarna utama untuk tombol Pay dan item yang dipilih
backgroundWarna latar belakang halaman pembayaran
componentBackgroundWarna latar belakang untuk input, tab, dan komponen lainnya
componentBorderWarna border eksternal untuk input, tab, dan komponen lainnya
componentDividerWarna border internal (border bersama) untuk komponen
primaryTextWarna teks header
secondaryTextWarna teks label untuk bidang input
componentTextWarna teks input (misalnya nomor kartu, kode pos)
placeholderTextWarna teks placeholder untuk bidang input
iconWarna ikon (misalnya tombol tutup)
errorWarna untuk pesan kesalahan dan tindakan destruktif
Contoh konfigurasi dengan dukungan mode terang dan gelap:
const appearance = {
  colors: {
    light: {
      primary: '#F8F8F2',
      background: '#ffffff',
      componentBackground: '#E6DB74',
      componentBorder: '#FD971F',
      componentDivider: '#FD971F',
      primaryText: '#F8F8F2',
      secondaryText: '#75715E',
      componentText: '#AE81FF',
      placeholderText: '#E69F66',
      icon: '#F92672',
      error: '#FF0000',
    },
    dark: {
      primary: '#00ff0099',
      background: '#ff0000',
      componentBackground: '#ff0080',
      componentBorder: '#62ff08',
      componentDivider: '#d6de00',
      primaryText: '#5181fc',
      secondaryText: '#ff7b00',
      componentText: '#00ffff',
      placeholderText: '#00ffff',
      icon: '#f0f0f0',
      error: '#0f0f0f',
    },
  },
};

Kustomisasi Bentuk

Anda dapat menyesuaikan radius batas, lebar batas, dan bayangan yang digunakan di seluruh antarmuka pembayaran:
const appearance = {
  shapes: {
    borderRadius: 10, // Border radius for input fields, tabs, and components
    borderWidth: 1,   // Border width for components
  },
};

Kustomisasi Spesifik Komponen

Anda dapat menyesuaikan komponen UI tertentu seperti tombol utama (tombol Bayar). Pengaturan ini memiliki prioritas lebih tinggi daripada pengaturan penampilan global:
const appearance = {
  primaryButton: {
    colors: {
      background: '#000000',
      text: '#ffffff',
      border: '#ff00ff',
    },
    shapes: {
      borderRadius: 10,
      borderWidth: 1.5,
    },
  },
};
Untuk menerapkan kustomisasi ini, sertakan dalam konfigurasi sesi pembayaran Anda:
const params: sessionParams = {
  ...paymentSheetParams,
  configuration: {
    appearance: {
      themes: isDarkMode ? 'dark' : 'light',
      ...appearance, // Include your custom appearance settings
    },
  },
};

Penanganan Kesalahan

Tangani berbagai status pembayaran dalam fungsi checkout Anda:
const handlePaymentResult = (paymentSheetResponse) => {
  switch (paymentSheetResponse?.status) {
    case 'cancelled':
      // User cancelled the payment
      console.log('Payment cancelled by user');
      break;
    case 'succeeded':
      // Payment completed successfully
      console.log('Payment succeeded');
      // Navigate to success screen or update UI
      break;
    case 'failed':
      // Payment failed
      console.log('Payment failed:', paymentSheetResponse?.message);
      // Show error message to user
      break;
    default:
      console.log('Unknown payment status:', paymentSheetResponse?.status);
  }
};
  • Masalah konektivitas jaringan: Pastikan koneksi internet stabil
  • Client secret tidak valid: Pastikan backend menghasilkan payment intent yang sah
  • Ketergantungan peer yang hilang: Instal semua dependensi yang dibutuhkan
  • Pengaturan khusus platform: Selesaikan langkah konfigurasi iOS dan Android
  • Kesalahan API: Periksa Referensi Kode Error untuk penanganan kesalahan lebih lanjut
  • Aktifkan logging debug saat pengembangan
  • Periksa permintaan jaringan ke backend Anda
  • Verifikasi kunci API dikonfigurasi dengan benar
  • Uji pada platform iOS dan Android
  • Tinjau FAQ Teknis kami untuk masalah umum
  • Gunakan Mode Uji vs Mode Langsung secara tepat

Metode Pembayaran Uji

Gunakan nomor kartu uji saat pengembangan untuk memverifikasi integrasi tanpa memproses pembayaran nyata. Pelajari lebih lanjut tentang proses pengujian dan lingkungan uji yang tersedia.