Integrasi ini memerlukan endpoint di server Anda yang berinteraksi dengan Stripe API. Gunakan pustaka resmi untuk akses ke Stripe API dari server Anda:
plugins {id("com.android.application")}
android {...}
dependencies {// ...// Stripe Android SDKimplementation("com.stripe:stripe-android:21.17.0")// Include the financial connections SDK to support US bank account as a payment methodimplementation("com.stripe:financial-connections:21.17.0")}
Catatan
Untuk detail mengenai rilis SDK terbaru dan versi sebelumnya, lihat halaman Rilis di GitHub. Untuk menerima notifikasi bila rilis baru diterbitkan, lihat rilis untuk repositori.
Lihat pengaturan metode pembayaran dan aktifkan metode pembayaran yang ingin Anda dukung. Anda membutuhkan setidaknya satu metode pembayaran yang diaktifkan untuk membuat PaymentIntent.
Secara default, Stripe mengaktifkan kartu dan metode pembayaran umum lainnya yang dapat membantu menjangkau lebih banyak pelanggan, tetapi sebaiknya aktifkan metode pembayaran tambahan yang relevan untuk bisnis dan pelanggan Anda. Lihat Dukungan metode pembayaran untuk dukungan produk dan metode pembayaran, dan halaman skema biaya kami untuk mengetahui biayanya.
PaymentIntent: Stripe menggunakannya untuk mewakili maksud Anda menagih pembayaran dari pelanggan, yang melacak upaya charge dan perubahan status pembayaran selama proses.
(Opsional) Pelanggan: Untuk menyiapkan metode pembayaran bagi pembayaran mendatang, Anda harus melampirkannya ke Pelanggan. Buat objek Pelanggan saat pelanggan membuat akun pada bisnis Anda. Jika pelanggan melakukan pembayaran sebagai tamu, Anda dapat membuat objek Pelanggan sebelum pembayaran dan mengaitkannya dengan representasi internal Anda sendiri dari akun pelanggan nanti.
(Opsional) Kunci Efemeral Pelanggan: Informasi mengenai objek Pelanggan bersifat sensitif, dan tidak dapat diambil langsung dari aplikasi. Kunci Efemeral memberikan akses sementara SDK kepada Pelanggan.
Catatan
Jika belum pernah menyimpan kartu ke Pelanggan dan tidak mengizinkan Pelanggan yang kembali untuk menggunakan kembali kartu yang disimpan, Anda dapat menghilangkan objek Pelanggan dan Kunci Efemeral Pelanggan dari integrasi.
Karena alasan keamanan, aplikasi Anda tidak dapat membuat objek ini. Sebagai gantinya, tambahkan endpoint di server Anda yang:
Mengambil Pelanggan, atau membuat yang baru.
Membuat Kunci Efemeral untuk Pelanggan.
Membuat PaymentIntent dengan amount, currency, dan customer. Secara opsional, Anda juga dapat menyertakan parameter automatic_payment_methods. Stripe mengaktifkan fungsinya secara default di versi terbaru API.
Metode pembayaran yang ditampilkan kepada pelanggan selama proses checkout juga disertakan dalam PaymentIntent. Anda dapat mengizinkan Stripe menarik metode pembayaran dari pengaturan Dashboard atau Anda dapat mencantumkannya secara manual. Terlepas dari opsi yang Anda pilih, ketahui mata uang yang diteruskan di PaymentIntent memfilter metode pembayaran yang ditampilkan kepada pelanggan. Misalnya, jika Anda meneruskan eur pada PaymentIntent dan mengaktifkan OXXO di Dashboard, OXXO tidak akan ditampilkan kepada pelanggan karena OXXO tidak mendukung pembayaran eur.
Kecuali jika integrasi Anda memerlukan opsi berbasis kode untuk menawarkan metode pembayaran, Stripe merekomendasikan opsi otomatis. Hal ini karena Stripe mengevaluasi mata uang, pembatasan metode pembayaran, dan parameter lainnya untuk menentukan daftar metode pembayaran yang didukung. Metode pembayaran yang meningkatkan konversi serta yang paling relevan dengan mata uang dan lokasi pelanggan akan diprioritaskan.
Catatan
Coba implementasi yang sedang berjalan dari endpoint ini pada Glitch.
Anda dapat mengelola metode pembayaran dari Dashboard. Stripe menangani pengembalian metode pembayaran yang memenuhi syarat berdasarkan faktor-faktor seperti jumlah transaksi, mata uang, dan alur pembayaran. PaymentIntent dibuat menggunakan metode pembayaran yang Anda konfigurasikan di Dashboard. Jika tidak ingin menggunakan Dashboard atau jika ingin menentukan metode pembayaran secara manual, Anda dapat mencantumkannya menggunakan atribut payment_method_types.
: \ -X"POST"\ -d"customer"="{{CUSTOMER_ID}}"\ -d"amount"=1099\ -d"currency"="eur"\# In the latest version of the API, specifying the `automatic_payment_methods` parameter# is optional because Stripe enables its functionality by default. -d"automatic_payment_methods[enabled]"=true \
Sebelum menampilkan Payment Element seluler, halaman checkout Anda harus:
Tampilkan produk yang sedang dibeli dan jumlah totalnya
Kumpulkan informasi pengiriman yang diperlukan menggunakan Address Element
Sertakan tombol checkout untuk menyajikan UI Stripe
Initialize a PaymentSheet instance inside onCreate of your checkout Activity, passing a method to handle the result.
import androidx.compose.runtime.Composable
import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.PaymentSheetResult
import com.stripe.android.paymentsheet.rememberPaymentSheet
@ComposablefunApp(){val paymentSheet = PaymentSheet.Builder(::onPaymentSheetResult).build()}privatefunonPaymentSheetResult(paymentSheetResult: PaymentSheetResult){// implemented in the next steps}
Selanjutnya, ambil client secret Intent Payment, rahasia Kunci Efemeral, identifikasi Pelanggan, dan kunci yang dapat diterbitkan dari endpoint yang Anda buat di langkah sebelumnya. Atur kunci yang dapat diterbitkan menggunakan PaymentConfiguration dan simpan yang lainnya untuk digunakan saat Anda menyajikan PaymentSheet.
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
// Add the following lines to build.gradle to use this example's networking library:// implementation 'com.github.kittinunf.fuel:fuel:2.3.1'// implementation 'com.github.kittinunf.fuel:fuel-json:2.3.1'import com.github.kittinunf.fuel.httpPost
import com.github.kittinunf.fuel.json.responseJson
import com.stripe.android.PaymentConfiguration
import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.PaymentSheetResult
import com.stripe.android.paymentsheet.rememberPaymentSheet
import com.github.kittinunf.result.Result
@ComposablefunApp(){val paymentSheet = PaymentSheet.Builder(::onPaymentSheetResult).build()val context = LocalContext.current
var customerConfig by remember { mutableStateOf<PaymentSheet.CustomerConfiguration?>(null)}var paymentIntentClientSecret by remember { mutableStateOf<String?>(null)}LaunchedEffect(context){"Your backend endpoint/payment-sheet".httpPost().responseJson{ _, _, result ->if(result is Result.Success){val responseJson = result.get().obj()
paymentIntentClientSecret = responseJson.getString("paymentIntent")
customerConfig = PaymentSheet.CustomerConfiguration(
id = responseJson.getString("customer"),
ephemeralKeySecret = responseJson.getString("ephemeralKey"))val publishableKey = responseJson.getString("publishableKey")
PaymentConfiguration.init(context, publishableKey)}}}}privatefunonPaymentSheetResult(paymentSheetResult: PaymentSheetResult){// implemented in the next steps}
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
// Add the following lines to build.gradle to use this example's networking library:// implementation 'com.github.kittinunf.fuel:fuel:2.3.1'// implementation 'com.github.kittinunf.fuel:fuel-json:2.3.1'import com.github.kittinunf.fuel.httpPost
import com.github.kittinunf.fuel.json.responseJson
import com.stripe.android.PaymentConfiguration
import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.PaymentSheetResult
import com.stripe.android.paymentsheet.rememberPaymentSheet
import com.github.kittinunf.result.Result
@OptIn(ExperimentalCustomerSessionApi::class)@ComposablefunApp(){val paymentSheet = PaymentSheet.Builder(::onPaymentSheetResult).build()val context = LocalContext.current
var customerConfig by remember { mutableStateOf<PaymentSheet.CustomerConfiguration?>(null)}var paymentIntentClientSecret by remember { mutableStateOf<String?>(null)}LaunchedEffect(context){"Your backend endpoint/payment-sheet".httpPost().responseJson{ _, _, result ->if(result is Result.Success){val responseJson = result.get().obj()
paymentIntentClientSecret = responseJson.getString("paymentIntent")
customerConfig = PaymentSheet.CustomerConfiguration(
id = responseJson.getString("customer"),
ephemeralKeySecret = responseJson.getString("ephemeralKey"))val publishableKey = responseJson.getString("publishableKey")
PaymentConfiguration.init(context, publishableKey)}}}Button(
onClick ={val currentConfig = customerConfig
val currentClientSecret = paymentIntentClientSecret
if(currentConfig !=null&& currentClientSecret !=null){presentPaymentSheet(paymentSheet, currentConfig, currentClientSecret)}}){Text("Checkout")}}privatefunpresentPaymentSheet(
paymentSheet: PaymentSheet,
customerConfig: PaymentSheet.CustomerConfiguration,
paymentIntentClientSecret: String
){
paymentSheet.presentWithPaymentIntent(
paymentIntentClientSecret,
PaymentSheet.Configuration.Builder(merchantDisplayName ="My merchant name").customer(customerConfig)// Set `allowsDelayedPaymentMethods` to true if your business handles// delayed notification payment methods like US bank accounts..allowsDelayedPaymentMethods(true).build())}privatefunonPaymentSheetResult(paymentSheetResult: PaymentSheetResult){when(paymentSheetResult){is PaymentSheetResult.Canceled ->{print("Canceled")}is PaymentSheetResult.Failed ->{print("Error: ${paymentSheetResult.error}")}is PaymentSheetResult.Completed ->{// Display for example, an order confirmation screenprint("Completed")}}}
Mengatur allowsDelayedPaymentMethods ke true memungkinkan metode pembayaran pemberitahuan tertunda seperti rekening bank AS. Untuk metode pembayaran ini, status pembayaran finalnya tidak diketahui bila PaymentSheet selesai, dan berhasil atau gagal sebagai gantinya nanti. Jika Anda mendukung jenis pembayaran ini, informasikan kepada pelanggan bahwa pesanannya telah dikonfirmasi dan hanya memenuhi pesanan (misalnya, mengirim produknya) bila pembayaran berhasil.
Stripe mengirim kejadian payment_intent.succeeded ketika selesai pembayaran. Gunakan alat webhook Dashboard atau ikuti panduan webhook untuk menerima kejadian ini dan menjalankan tindakan, seperti mengirim email konfirmasi pesanan kepada pelanggan Anda, mencatat penjualan di database, atau memulai alur kerja pengiriman.
Dengarkan kejadian ini daripada menunggu callback dari client. Di client, pelanggan dapat menutup jendela browser atau keluar dari aplikasi sebelum callback mengeksekusi, dan klien jahat dapat memanipulasi respons. Penyiapan integrasi untuk mendengarkan kejadian asinkron memungkinkan Anda menyetujui berbagai tipe metode pembayaran dengan satu integrasi tunggal.
Selain menangani kejadian payment_intent.succeeded, kami merekomendasikan penanganan kejadian ini yang lain ketika menagih pembayaran dengan Payment Element:
Dikirim bila pelanggan berhasil memprakarsai pembayaran, tetapi pembayaran itu belum selesai. Kejadian ini paling umum dikirim saat pelanggan memprakarsai debit bank. Kejadian diikuti dengan kejadian payment_intent.succeeded atau payment_intent.payment_failed di masa mendatang.
Kirimi pelanggan konfirmasi pesanan yang menunjukkan bahwa pembayaran mereka menunggu penyelesaian. Untuk barang digital, Anda mungkin ingin memenuhi pesanan sebelum menunggu pembayaran selesai.