메인 콘텐츠로 건너뛰기

전제 조건

Dodo Payments를 모바일 앱에 통합하기 전에 다음을 확인하세요:
  • Dodo Payments 계정: API 액세스가 있는 활성 상인 계정
  • API 자격 증명: 대시보드에서 API 키 및 웹훅 비밀 키
  • 모바일 앱 프로젝트: Android, iOS, React Native 또는 Flutter 애플리케이션
  • 백엔드 서버: 체크아웃 세션 생성을 안전하게 처리하기 위해

통합 워크플로우

모바일 통합은 백엔드가 API 호출을 처리하고 모바일 앱이 사용자 경험을 관리하는 안전한 4단계 프로세스를 따릅니다.
1

백엔드: 체크아웃 세션 생성

체크아웃 세션 API 문서

Node.js, Python 등을 사용하여 백엔드에서 체크아웃 세션을 생성하는 방법을 알아보세요. 전용 체크아웃 세션 API 문서에서 완전한 예제와 매개변수 참조를 확인하세요.
보안: 체크아웃 세션은 모바일 앱이 아닌 백엔드 서버에서 생성해야 합니다. 이는 API 키를 보호하고 적절한 검증을 보장합니다.
2

모바일: 체크아웃 URL 가져오기

모바일 앱이 백엔드에 호출하여 체크아웃 URL을 가져옵니다:
func getCheckoutURL(productId: String, customerEmail: String, customerName: String) async throws -> String {
    let url = URL(string: "https://your-backend.com/api/create-checkout-session")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let requestData: [String: Any] = [
        "productId": productId,
        "customerEmail": customerEmail,
        "customerName": customerName
    ]
    request.httpBody = try JSONSerialization.data(withJSONObject: requestData)
    
    let (data, _) = try await URLSession.shared.data(for: request)
    let response = try JSONDecoder().decode(CheckoutResponse.self, from: data)
    return response.checkout_url
}
보안: 모바일 앱은 Dodo Payments API와 직접 통신하지 않고 백엔드와만 통신합니다.
3

모바일: 브라우저에서 체크아웃 열기

4

백엔드: 결제 완료 처리

웹훅 및 리디렉션 URL을 통해 결제 상태를 확인합니다.

플랫폼별 통합

아래에서 모바일 플랫폼을 선택하여 완전한 구현 예제를 확인하세요:

Android 통합

Chrome 커스텀 탭 구현

// Add Chrome Custom Tabs dependency to build.gradle
implementation 'androidx.browser:browser:1.5.0'

// In your Activity
class PaymentActivity : AppCompatActivity() {
    private var customTabsSession: CustomTabsSession? = null
    private var customTabsClient: CustomTabsClient? = null
    private var customTabsServiceConnection: CustomTabsServiceConnection? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Initialize Custom Tabs
        customTabsServiceConnection = object : CustomTabsServiceConnection() {
            override fun onCustomTabsServiceConnected(name: ComponentName, client: CustomTabsClient) {
                customTabsClient = client
                customTabsClient?.warmup(0L)
                customTabsSession = customTabsClient?.newSession(object : CustomTabsCallback() {
                    override fun onNavigationEvent(navigationEvent: Int, extras: Bundle?) {
                        // Handle navigation events
                    }
                })
            }
            override fun onServiceDisconnected(name: ComponentName) {
                customTabsClient = null
            }
        }
        CustomTabsClient.bindCustomTabsService(
            this,
            "com.android.chrome",
            customTabsServiceConnection!!
        )
        // Get checkout URL from backend and launch
        lifecycleScope.launch {
            try {
                val checkoutURL = getCheckoutURL("prod_123", "[email protected]", "Customer Name")
                val customTabsIntent = CustomTabsIntent.Builder(customTabsSession)
                    .build()
                customTabsIntent.launchUrl(this@PaymentActivity, Uri.parse(checkoutURL))
            } catch (e: Exception) {
                // Handle error
                Log.e("PaymentActivity", "Failed to get checkout URL", e)
            }
        }
    }
}

모범 사례

  • 보안: 앱 코드에 API 키를 저장하지 마세요. 안전한 저장소와 SSL 핀닝을 사용하세요.
  • 사용자 경험: 로딩 표시기를 표시하고, 오류를 우아하게 처리하며, 명확한 메시지를 제공하세요.
  • 테스트: 테스트 카드를 사용하고, 네트워크 오류를 시뮬레이션하며, 다양한 장치에서 테스트하세요.

문제 해결

일반적인 문제

  • WebView가 결제 링크를 열지 않음: 결제 링크가 유효하고 HTTPS를 사용하는지 확인하세요.
  • 콜백을 수신하지 않음: 반환 URL 및 웹훅 구성을 확인하세요.
  • API 키 오류: API 키가 올바르고 필요한 권한이 있는지 확인하세요.

추가 리소스

질문이나 지원이 필요하면 [email protected]에 문의하세요.