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

Keamanan Sederhana

Kumpulkan data pembayaran sensitif dengan aman sambil tetap mematuhi PCI

Berbagai Metode Pembayaran

Terima berbagai metode pembayaran untuk memperluas jangkauan global

UI Native

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

Instalasi

1

Instal SDK

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

Pengaturan spesifik platform

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

Pengaturan Sisi Klien

1

Dapatkan Kunci Publik

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

Siapkan Penyedia Pembayaran

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 generasi kunci API kami untuk instruksi rinci.
3

Buat fungsi utilitas pembayaran

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 niat pembayaran dan mengembalikan rahasia klien. Pastikan backend Anda dikonfigurasi dengan benar untuk menangani pembuatan pembayaran. Lihat Tutorial Integrasi API kami untuk contoh pengaturan backend.
4

Implementasikan layar pembayaran

Buat layar pembayaran Anda menggunakan hook useCheckout. Berikut adalah implementasi 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
required
Rahasia klien dari niat pembayaran Anda, diperoleh dari API pembayaran satu kali atau langganan.
mode
string
required
Mode sesi pembayaran (uji atau langsung).
configuration.appearance
object
Opsi kustomisasi untuk penampilan lembar pembayaran
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 memodifikasi warna, font, dan lainnya melalui parameter penampilan saat memanggil initPaymentSession().

Kustomisasi Warna

Setiap kategori warna menentukan warna satu atau lebih komponen di UI. Misalnya, primary mendefinisikan warna tombol Bayar.
Kategori WarnaPenggunaan
primaryWarna utama untuk tombol Bayar dan item yang dipilih
backgroundWarna latar belakang halaman pembayaran
componentBackgroundWarna latar belakang untuk input, tab, dan komponen lainnya
componentBorderWarna batas eksternal untuk input, tab, dan komponen lainnya
componentDividerWarna batas internal (batas 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 untuk 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
  • Rahasia klien tidak valid: Verifikasi backend menghasilkan niat pembayaran yang valid
  • Ketergantungan peer yang hilang: Instal semua ketergantungan yang diperlukan
  • Pengaturan spesifik platform: Selesaikan langkah konfigurasi iOS dan Android
  • Kesalahan API: Periksa Referensi Kode Kesalahan kami untuk penanganan kesalahan yang rinci
  • Aktifkan logging debug dalam pengembangan
  • Periksa permintaan jaringan ke backend Anda
  • Verifikasi kunci API dikonfigurasi dengan benar
  • Uji di kedua platform iOS dan Android
  • Tinjau FAQ Teknis kami untuk masalah umum
  • Gunakan Mode Uji vs Langsung dengan tepat

Metode Pembayaran Uji

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