Mulai dengan komponen Connect yang disematkan
Pelajari cara menyematkan fungsionalitas dashboard ke situs web Anda.
Gunakan komponen tersemat Connect untuk menambahkan fungsionalitas dashboard akun terhubung ke situs web Anda. Pustaka ini dan API pendukungnya memungkinkan Anda memberikan akses ke produk Stripe secara langsung di dashboard dan aplikasi seluler.
Siapkan StripeConnectSisi klienSisi server
Stripe menggunakan AccountSession untuk mengekspresikan maksud Anda guna mendelegasikan akses API ke akun terhubung Anda.
AccountSessions API mengembalikan client secret yang memungkinkan komponen tersemat mengakses sumber daya akun terhubung seolah-olah Anda yang melakukan panggilan API untuk mereka.
Buat AccountSession Server
Aplikasi Anda harus memprakarsai permintaan ke server untuk memperoleh sesi akun. Saat ini, hanya Onboarding akun yang didukung. Anda dapat membuat endpoint baru pada server yang mengembalikan client secret ke aplikasi:
Buat Account Session API
Create Account Session API menentukan akses komponen dan fitur untuk komponen tersemat Connect. Stripe memberlakukan parameter ini untuk setiap komponen yang sesuai dengan sesi akun. Jika aplikasi Anda mendukung beberapa peran pengguna, pastikan komponen dan fitur yang diaktifkan untuk sesi akun tersebut sesuai dengan peran pengguna saat ini. Misalnya, Anda dapat mengaktifkan manajemen pengembalian dana hanya untuk administrator situs Anda, tetapi tidak untuk pengguna lain. Untuk memastikan akses peran pengguna diberlakukan, Anda harus memetakan peran pengguna situs ke komponen sesi akun.
Instal StripeConnect SDK Client
Stripe iOS SDK adalah sumber terbuka, yang didokumentasikan lengkap, dan kompatibel dengan aplikasi yang mendukung iOS 15 ke atas.
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.
Siapkan otorisasi kamera Sisi client
Stripe Connect iOS SDK memerlukan akses ke kamera perangkat untuk mengambil dokumen identitas. Untuk mengaktifkan aplikasi Anda guna meminta izin kamera:
- Buka Info.plist proyek Anda di Xcode.
- Tambahkan kunci
NSCameraUsageDescription
. - Tambahkan nilai string yang menjelaskan kepada pengguna mengapa aplikasi Anda memerlukan izin kamera, sesuatu seperti:
Aplikasi ini menggunakan kamera untuk mengambil gambar dokumen identitas Anda.
Lihat dokumentasi Apple untuk mempelajari selengkapnya tentang meminta otorisasi kamera.
Inisialisasikan EmbeddedComponentManager Client
Atur kunci yang dapat dipublikasikan menggunakan StripeAPI.
dan buat instance EmbeddedComponentManager dengan penutupan yang mengambil client secret dengan memanggil endpoint baru yang Anda buat pada server. Untuk membuat komponen, panggil metode buat yang sesuai pada instance EmbeddedComponentManager
yang Anda buat di atas. Ini mengembalikan pengontrol yang dapat Anda gunakan untuk menyajikannya di aplikasi.
@_spi(PrivateBetaConnect) import StripeConnect import UIKit class MyViewController: UIViewController { let errorView: UIView func fetchClientSecret() async -> String? { let url = URL(string: "https://{{YOUR_SERVER}}/account_session")! var request = URLRequest(url: url) request.httpMethod = "POST" do { // Fetch the AccountSession client secret let (data, _) = try await URLSession.shared.data(for: request) let json = try JSONSerialization.jsonObject(with: data) as? [String : Any] errorView.isHidden = true return json?["client_secret"] as? String } catch let error { // Handle errors on the client side here print("An error occurred: \(error)") errorView.isHidden = false return nil } } override func viewDidLoad() { super.viewDidLoad() // This is your test publishable API key. STPAPIClient.shared.publishableKey = "{{PUBLISHABLE_KEY}}", let embeddedComponentManager = EmbeddedComponentManager( fetchClientSecret: fetchClientSecret ) let controller = embeddedComponentManager.createAccountOnboardingController() controller.present(from: self) } }
Configure the Embedded Component ManagerSisi client
Sesuaikan tampilan komponen tersemat Connect
Toolkit Figma UI komponen tersemat berisi setiap komponen, pola umum, dan contoh aplikasi. Anda dapat menggunakannya untuk memvisualisasikan serta mendesain UI yang disematkan pada situs web Anda.
Kami menawarkan serangkaian opsi untuk menyesuaikan tampilan dan cara kerja komponen tersemat Connect. Penyesuaian ini memengaruhi tombol, ikon, dan aksen lainnya di sistem desain kami.
Popup yang diperlukan
Beberapa perilaku dalam komponen tersemat, seperti autentikasi pengguna, harus disajikan di WebView yang diautentikasi. Anda tidak dapat menyesuaikan komponen tersemat untuk menghilangkan Tampilan Web tersebut.
Anda dapat mengatur opsi ini menggunakan EmbeddedComponentManager.Appearance ketika melakukan inisialisasi EmbeddedComponentManager
.
func fetchClientSecret() async -> String? { let url = URL(string: "https://{{YOUR_SERVER}}/account_session")! var request = URLRequest(url: url) request.httpMethod = "POST" do { let (data, _) = try await URLSession.shared.data(for: request) let json = try JSONSerialization.jsonObject(with: data) as? [String : Any] return json?["client_secret"] as? String } catch { return nil } } // Specify custom fonts var customFonts: [CustomFontSource] = [] let myFont = UIFont(name: "My Font", size: 16)! let fontUrl = Bundle.main.url(forResource: "my-font-2", withExtension: "woff")! do { let customFontSource = try CustomFontSource(font: myFont, fileUrl: fontUrl) customFonts.append(customFontSource) } catch { print("Error loading custom font: \(error)") } // Customize appearance var appearance = EmbeddedComponentManager.Appearance() appearance.typography.fontfont.base = myFont appearance.typography.fontSizeBase = 16 // Unscaled font size appearance.colors.primary = UIColor { traitCollection in if traitCollection.userInterfaceStyle == .dark { UIColor(red: 0.455, green: 0.424, blue: 1.000, alpha: 1.0) } else { UIColor(red: 0.404, green: 0.365, blue: 1.000, alpha: 1.0) } } STPAPIClient.shared.publishableKey = "{{PUBLISHABLE_KEY}}", let embeddedComponentManager = EmbeddedComponentManager( appearance: appearance, fonts: customFonts, fetchClientSecret: fetchClientSecret )
Warna tampilan yang menggunakan penyedia dinamis secara otomatis diterapkan ke komponen tersemat Connect bila UITraitCollection diperbarui, termasuk Mode Gelap dan kontras aksesibilitas. Penampilan default tidak menyertakan warna mode gelap, jadi Anda harus menentukan penampilan dengan warna dinamis ke EmbeddedComponentManager
untuk mendukung mode gelap di aplikasi.
Ketika menentukan ukuran font, gunakan ukuran font yang tidak diubah skalanya dan ditampilkan untuk kelas ukuran default perangkat. Komponen tersemat secara otomatis menskalakan ukuran font berdasarkan UITraitCollection.
Lihat daftar lengkap opsi penampilan di iOS.
Gunakan font custom
Jika menggunakan font custom di aplikasi (misalnya, dari file .
atau .
yang disematkan di biner aplikasi), Anda harus menentukan file font di CustomFontSource yang diteruskan ke argumen fonts
ketika melakukan inisialisasi EmbeddedComponentManager
. Hal ini memberi komponen tersemat Connect akses ke file font untuk merender font dengan benar.
Font yang ditentukan di appearance
harus menggunakan font sistem yang didukung ataupun CustomFontSource yang diteruskan ke EmbeddedComponentManager
pada inisialisasi untuk dirender dengan benar.
Perbarui komponen tersemat Connect setelah inisialisasi
Panggil metode update
untuk mengubah tampilan komponen tersemat setelah inisialisasi:
var appearance = EmbeddedComponentManager.Appearance() appearance.colors.primary = UIColor.red manager.update(appearance: appearance)
Autentikasi
Kami menawarkan seperangkat API untuk mengelola sesi akun dan kredensial pengguna di komponen tersemat Connect.
Muat ulang client secret
Pada sesi yang berjalan lama, sesi dari client secret yang semula diberikan mungkin kedaluwarsa. Bila kedaluwarsa, kami secara otomatis menggunakan fetchClientSecret
untuk mengambil client secret baru dan memuat ulang sesi. Anda tidak perlu meneruskan parameter tambahan.
func fetchClientSecret() async -> String? { var request = URLRequest(url: URL(string: "https://{{YOUR_SERVER}}/account_session")!) request.httpMethod = "POST" do { let (data, _) = try await URLSession.shared.data(for: request) let json = try JSONSerialization.jsonObject(with: data) as? [String : Any] return json?["client_secret"] as? String } catch let error { return nil } } STPAPIClient.shared.publishableKey = "{{PUBLISHABLE_KEY}}", let embeddedComponentManager = EmbeddedComponentManager( fetchClientSecret: fetchClientSecret )
Pelokalan
Komponen tersemat Connect mendukung lokal berikut:
Bahasa | Kode lokal |
---|---|
Bahasa Bulgaria (Bulgaria) | bg-BG |
Bahasa Tionghoa (Disederhanakan) | zh-Hans |
Bahasa Tionghoa (Tradisional - Hong Kong) | zh-Hant-HK |
Bahasa Tionghoa (Tradisional - Taiwan) | zh-Hant-TW |
Bahasa Kroasia (Kroasia) | hr-HR |
Bahasa Ceko (Cheska) | cs-CZ |
Bahasa Denmark (Denmark) | da-DK |
Bahasa Belanda (Belanda) | nl-NL |
Bahasa Inggris (Australia) | en-AU |
Bahasa Inggris (India) | en-IN |
Bahasa Inggris (Irlandia) | en-IE |
Bahasa Inggris (Selandia Baru) | en-NZ |
Bahasa Inggris (Singapura) | en-SG |
Bahasa Inggris (Kerajaan Inggris) | en-GB |
Bahasa Inggris (Amerika Serikat) | en-US |
Bahasa Estonia (Estonia) | et-EE |
Bahasa Filipina (Filipina) | fil-PH |
Bahasa Finlandia (Finlandia) | fi-FI |
Bahasa Prancis (Kanada) | fr-CA |
Bahasa Prancis (Prancis) | fr-FR |
Bahasa Jerman (Jerman) | de-DE |
Bahasa Yunani (Yunani) | el-GR |
Bahasa Hungaria (Hungaria) | hu-HU |
Bahasa Indonesia (Indonesia) | id-ID |
Bahasa Italia (Italia) | it-IT |
Bahasa Jepang (Jepang) | ja-JP |
Bahasa Korea (Korea Selatan) | ko-KR |
Bahasa Latvia (Latvia) | lv-LV |
Bahasa Lituania (Lituania) | lt-LT |
Bahasa Melayu (Malaysia) | ms-MY |
Bahasa Malta (Malta) | mt-MT |
Bahasa Bokmål Norwegia (Norwegia) | nb-NO |
Bahasa Polandia (Polandia) | pl-PL |
Portugis (Brasil) | pt-BR |
Bahasa Portugis (Portugal) | pt-PT |
Bahasa Rumania (Rumania) | ro-RO |
Bahasa Slowakia (Slowakia) | sk-SK |
Bahasa Slovenia (Slovenia) | sl-SI |
Bahasa Spanyol (Argentina) | es-AR |
Bahasa Spanyol (Brasil) | es-BR |
Spanyol (Amerika Latin) | es-419 |
Bahasa Spanyol (Meksiko) | es-MX |
Bahasa Spanyol (Spanyol) | es-ES |
Bahasa Swedia (Swedia) | sv-SE |
Bahasa Thailand (Thailand) | th-TH |
Bahasa Turki (Türkiye) | tr-TR |
Bahasa Vietnam (Vietnam) | vi-VN |
Autentikasi pengguna di komponen tersemat Connect
Komponen tersemat Connect biasanya tidak memerlukan autentikasi pengguna. Dalam sejumlah skenario, komponen tersemat Connect mengharuskan akun terhubung masuk dengan akun Stripe sebelum mengakses komponen untuk menyediakan fungsionalitas yang diperlukan (misalnya, menulis informasi ke badan hukum akun dalam kasus komponen onboarding akun). Komponen lain mungkin memerlukan autentikasi dalam komponen setelah komponen tersebut ditampilkan di awal.
Autentikasi diperlukan untuk akun terhubung di mana Stripe bertanggung jawab untuk mengumpulkan informasi terbaru bila persyaratan berubah. Untuk akun terhubung tempat Anda bertanggung jawab mengumpulkan informasi terbaru bila persyaratan jatuh tempo atau berubah, seperti akun Custom, autentikasi Stripe dikontrol oleh fitur Sesi Akun disable_stripe_user_authentication. Kami merekomendasikan pengimplementasian 2FA atau tindakan keamanan yang setara sebagai praktik terbaik. Untuk konfigurasi akun yang mendukung fitur ini, seperti Custom, Anda bertanggung jawab atas akun terhubung jika akun tersebut tidak dapat membayar kembali saldo negatif.
Komponen yang memerlukan autentikasi
Akun terhubung akan ditampilkan Tampilan Web yang diautentikasi dalam aplikasi Anda. Akun terhubung harus melakukan autentikasi sebelum dapat melanjutkan alur kerjanya dalam Tampilan Web.
Alur autentikasi yang di-hosting Stripe menampilkan nama, warna, dan ikon brand Anda sebagaimana diatur di pengaturan Connect serta tidak menggunakan tampilan dan font custom dari Manajer Komponen Tersemat sampai autentikasi selesai.
Komponen berikut mengharuskan akun terhubung melakukan autentikasi dalam skenario tertentu:
Tangani kesalahan pemuatan
Jika komponen tidak dimuat, Anda dapat bereaksi terhadap kegagalan dengan mengimplementasikan metode delegasi didFailLoadWithError
komponen. Tergantung penyebab kegagalan, metode didFailLoadWithError
mungkin dipanggil beberapa kali. Logika yang dipicu oleh didFailLoadWithError
harus idempoten.
// All components emit load errors. This example uses AccountOnboarding. // All components support didFailLoadWithError. class MyViewController: UIViewController, AccountOnboardingControllerDelegate { func openAccountOnboarding() { let accountOnboardingController = embeddedComponentManager.createAccountOnboardingController(); accountOnboardingController.delegate = self accountOnboardingController.present(from: self) } // MARK: - AccountOnboardingControllerDelegate func accountOnboarding(_ accountOnboarding: AccountOnboardingController, didFailLoadWithError error: Error) { print("Account onboarding failed to load with error '\(error)'") } }