Client-Side Implementation
SEPA Direct Debit is available to eligible merchants using a custom client-side integration. It is only available in Android v4.13+, iOS v5.11+, and JavaScript v3 SDK. It's not currently available in Drop-in.
If you meet the criteria, Contact us to enable SEPA Direct Debit in your Sandbox or Production account.
Get the SDK
Add the following in your app-level build.gradle:
- Kotlin
- Groovy
dependencies {
    implementation("com.braintreepayments.api:sepa-direct-debit:5.8.0")
}Collect information
Once your component is ready, collect the required bank account information from the customer.
Bank information:
- accountHolderName (the name of the account owner)
- iban (International Bank Account Number)
Customer information:
- billingAddress
- customerId (customer id in the merchant's system)
Invoking the SEPA Direct Debit flow
    Construct a SEPADirectDebitClient,
    SEPADirectDebitLauncher and a
    SEPADirectDebitRequest. Call
    SEPADirectDebitClient.createPaymentAuthRequest() to launch the
    SEPA Direct Debit flow and call
    SEPADirectDebitLauncher.launch(). Finally, handle the result
    and call SEPADirectDebitClient.tokenize() and handle its
    result.
  
- Kotlin
class MyActivity : AppCompatActivity() {
    private lateinit var sepaDirectDebitLauncher: SEPADirectDebitLauncher
    private lateinit var sepaDirectDebitClient: SEPADirectDebitClient
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        sepaDirectDebitLauncher = SEPADirectDebitLauncher()
        sepaDirectDebitClient = SEPADirectDebitClient(
            context = this,
            authorization = "TOKENIZATION_KEY or CLIENT_TOKEN",
            returnUrlScheme = "RETURN_URL_SCHEME"
        )
    }
    // ALL OTHER ACTIVITY LAUNCH MODES
    override fun onResume() {
        super.onResume()
        handleReturnToApp(intent)
    }
    // ONLY REQUIRED IF YOUR ACTIVITY LAUNCH MODE IS SINGLE_TOP
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleReturnToApp(intent)
    }
    private fun handleReturnToApp(intent: Intent) {
        // fetch stored SEPADirectDebitPendingRequest.Started
        val pendingRequest: String = fetchPendingRequestFromPersistantStore()
        when (val paymentAuthResult = sepaDirectDebitLauncher.handleReturnToApp(
            pendingRequest = SEPADirectDebitPendingRequest.Started(pendingRequest),
            intent = intent
        )) {
            is SEPADirectDebitPaymentAuthResult.Success -> {
                completeSepaFlow(paymentAuthResult)
                // clear stored pending request
            }
            is SEPADirectDebitPaymentAuthResult.NoResult -> {
                // user returned to app without completing the flow, handle accordingly
            }
            is SEPADirectDebitPaymentAuthResult.Failure -> {
                // handle error case
            }
        }
    }
    private fun completeSepaFlow(paymentAuthResult: SEPADirectDebitPaymentAuthResult.Success) {
        sepaDirectDebitClient.tokenize(paymentAuthResult) { result ->
            when (result) {
                is SEPADirectDebitResult.Success -> {
                    // send result.nonce.string to server and create a transaction
                }
                is SEPADirectDebitResult.Failure -> { /* handle result.error */ }
                is SEPADirectDebitResult.Cancel -> { /* handle user canceled */ }
            }
        }
    }
    private fun startSEPADirectDebit() {
        val billingAddress = PostalAddress(
            recipientName = "John Doe",
            streetAddress = "123 Main St",
            countryCodeAlpha2 = "NL",
            locality = "Amsterdam",
            postalCode = "1072 AE",
        )
        val request = SEPADirectDebitRequest(
            accountHolderName = "John Doe",
            customerId = "1234",
            iban = "FR7618106000321234566666608",
            mandateType = SEPADirectDebitMandateType.ONE_OFF,
            billingAddress = billingAddress,
        )
        sepaDirectDebitClient.createPaymentAuthRequest(request) { paymentAuthRequest ->
            when (paymentAuthRequest) {
                is SEPADirectDebitPaymentAuthRequest.ReadyToLaunch -> {
                    val pendingRequest = sepaDirectDebitLauncher.launch(this, paymentAuthRequest)
                    when (pendingRequest) {
                        is SEPADirectDebitPendingRequest.Started -> {
                            // store pendingRequest
                        }
                        is SEPADirectDebitPendingRequest.Failure -> {
                            // handle error
                        }
                    }
                }
                is SEPADirectDebitPaymentAuthRequest.LaunchNotRequired -> {
                    // send paymentAuthRequest.nonce.string to server and create a transaction
                }
                is SEPADirectDebitPaymentAuthRequest.Failure -> {
                    // handle error
                }
            }
        }
    }
}Next Page: Server-side →