Lewati ke konten utama

Integrasi Aplikasi Web

Markdown

Halaman ini menjelaskan cara kerja journey Unico dan model integrasi yang tersedia untuk menyematkannya ke dalam sebuah aplikasi.

Sebuah journey adalah rangkaian langkah yang dilalui pengguna untuk menyelesaikan verifikasi identitas. Misalnya: mengambil foto dokumen dan melakukan pengambilan wajah (Deteksi Kehidupan).

Unico menangani seluruh pengalaman tersebut. Upaya integrasi sangat minimal: journey dibuat melalui CreateProcess, pengguna diarahkan ke sana, dan pada akhirnya hasilnya diterima. Semua yang terjadi di antaranya (layar, instruksi, validasi) sudah siap dan dikelola oleh Unico.

Dua model integrasi​

Setiap klien memiliki kebutuhan yang berbeda. Unico menawarkan dua model untuk mengarahkan pengguna ke journey.

ModelCocok untuk
SDK JourneysAplikasi web yang membutuhkan pengalaman terintegrasi dan mulus, menjaga pengguna tetap dalam lingkungan yang sama
Akses langsungAlur web di mana journey dapat berlangsung di luar halaman utama, atau aplikasi yang sudah menyematkan WebView. Aplikasi native sebaiknya menggunakan SDK platform
Aplikasi native

Jika aplikasi Anda adalah aplikasi mobile native, kami menyarankan untuk menggunakan SDK untuk platform tempat aplikasi tersebut dibangun (Android, iOS, atau Flutter) alih-alih integrasi web.

Journey berlangsung di dalam aplikasi itu sendiri, tanpa mengeluarkan pengguna dari konteksnya. SDK Journeys dipasang di aplikasi dan digunakan untuk membuka journey saat diperlukan.

Ini adalah jalur yang direkomendasikan untuk pengalaman yang lebih terintegrasi dan mulus, menjaga pengguna tetap berada di lingkungan yang sama sepanjang proses, yang cenderung mengurangi friksi dan pengabaian di sepanjang alur.

Unico menyediakan pustaka JavaScript yang kompatibel dengan browser modern, yang memungkinkan journey diintegrasikan ke hampir semua aplikasi hanya dengan beberapa baris kode.

Kompatibilitas​

Pustaka ini dirancang agar dapat menyatu dengan proyek apa pun tanpa friksi, terlepas dari stack yang digunakan:

  • Aplikasi web apa pun. Didistribusikan dalam format UMD, pustaka ini berfungsi saat diimpor melalui bundler modern (seperti webpack atau Vite). Kompatibel dengan framework apa pun (React, Angular, Vue) atau dengan JavaScript murni.
  • Browser modern. Pustaka ini sudah menyertakan polyfill yang diperlukan untuk fitur seperti Promises dan async/await, sehingga memperluas kompatibilitas juga ke versi browser yang lebih lama.
  • API web standar. Journey berjalan di atas kemampuan native browser, tanpa bergantung pada plugin atau pustaka eksternal dalam proyek.

Cara kerja SDK secara internal​

Saat sebuah journey dibuka, SDK menyisipkan sebuah iFrame ke dalam halaman dan mengambil kendali atas seluruh pengalaman visual sejak saat itu. Layar, skrip, dan aset setiap langkah berjalan di dalam iFrame ini, sejak saat pengguna mulai hingga proses selesai.

Keputusan arsitektur ini disengaja: isolasi iFrame memastikan journey Unico tidak mengganggu gaya maupun perilaku aplikasi. Tidak ada skrip yang bocor ke konteks eksternal, tidak ada aturan CSS yang berbenturan dengan gaya aplikasi. Hasilnya adalah pengalaman yang konsisten bagi pengguna akhir dan dampak yang minimal pada produk klien.

Karena Unico bertanggung jawab untuk membuat dan mengelola iFrame, peningkatan pada journey (baik dari sisi performa, pengalaman, maupun validasi) dikirimkan secara otomatis kepada semua pengguna, tanpa perlu perubahan apa pun pada aplikasi yang terintegrasi. Integrasi akan selalu berjalan dengan optimasi terbaik yang tersedia, tanpa perlu mengikuti atau bereaksi terhadap setiap pembaruan platform.

Memulai​

Langkah 1: Pemasangan

Paket unico-journey-sdk digunakan bersama antara journey pembayaran IDPay dan journey verifikasi identitas. Untuk kasus penggunaan identitas, impor kelas ByUnicoSDK seperti yang ditunjukkan pada langkah-langkah di bawah.

npm install unico-journey-sdk
Sebelumnya idpay-b2b-sdk

Paket ini sebelumnya diterbitkan sebagai idpay-b2b-sdk. Ini adalah SDK yang sama dengan nama baru dan tetap mengikuti garis versi yang sama. Hanya 2.3.0 dan yang lebih baru yang tersedia dengan nama baru — lihat Catatan Rilis untuk riwayat lengkapnya.

Cara yang direkomendasikan untuk memasang SDK Journeys adalah melalui pengelola dependensi seperti npm atau yarn, dari paket yang tersedia di npm registry. Selain menyederhanakan pemasangan dan pengelolaan dependensi, pendekatan ini memberikan kontrol yang jelas atas versi yang digunakan dan memudahkan pembaruan setiap kali versi baru dirilis.

SDK mengikuti Semantic Versioning (SemVer), yang berarti pembaruan patch dan minor tidak memperkenalkan perubahan yang merusak. Aman untuk mengonfigurasi proyek agar menerima pembaruan ini secara otomatis. Perubahan yang mungkin memerlukan penyesuaian pada integrasi disediakan untuk versi major dan selalu disertai panduan migrasi.

Selalu perbarui SDK

Tetap menggunakan versi terbaru sangat penting karena dua alasan. Yang pertama adalah keamanan: patch keamanan dirilis setiap kali kerentanan ditemukan atau ketika ada peluang untuk memperkuat protokol komunikasi. Menjalankan versi yang usang berarti melewatkan perbaikan ini dan mengekspos alur pada risiko yang tidak perlu. Yang kedua adalah stabilitas: perbaikan bug didistribusikan dengan cara yang sama, dan versi lama mungkin menunjukkan perilaku yang sudah diperbaiki pada rilis yang lebih baru.

Sebelum memulai, daftarkan domain Anda ke tim dukungan Unico. Semua domain harus menggunakan HTTPS.

Langkah 2: Panggil init(options)

Menginisialisasi SDK dan memuat lebih awal skrip yang diperlukan agar journey berfungsi dengan benar, menciptakan pengalaman yang lebih mulus bagi pengguna akhir. Panggil ini sedini mungkin dalam alur.

ParameterWajibDeskripsi
tokenYaToken proses yang dikembalikan oleh API Create Process
envTidakSetel ke 'uat' hanya untuk lingkungan pengujian
import { ByUnicoSDK } from 'unico-journey-sdk';

ByUnicoSDK.init({
token,
// env: 'uat' // hanya untuk lingkungan pengujian
});
Langkah 3: Panggil open(options)

Menampilkan iFrame dan memulai journey untuk pengguna. Sejak titik ini, semuanya terjadi secara otomatis di dalam iFrame, tanpa perlu mengelola langkah perantara apa pun.

ParameterWajibDeskripsi
transactionIdYaID proses yang dikembalikan oleh API Create Process
tokenYaToken proses yang dikembalikan oleh API Create Process
onFinishYaCallback yang dijalankan saat journey berakhir atau ditutup
onWidgetVisibilityChangeTidakCallback yang dijalankan saat status visibilitas widget berubah

Interaksi berikutnya dengan aplikasi terjadi saat journey berakhir, baik karena pengguna menyelesaikannya maupun menutupnya. Pada saat itu, SDK memanggil callback onFinish, yang diteruskan sebagai parameter pada open. Dari sana, aplikasi dapat memanggil API getProcess untuk memeriksa hasilnya, atau menunggu notifikasi Webhook jika pendekatan asinkron lebih disukai.

Selain memeriksa hasilnya, disarankan untuk menggunakan onFinish guna menangani status front-end aplikasi:

  • Hindari perulangan. Mencegah pembuatan ulang proses yang langsung dan tidak perlu jika pengguna memicu alur lagi tepat setelah journey berakhir.
  • Pengelolaan alur. Pastikan pengguna diarahkan ke langkah berikutnya dalam aplikasi, menghindari terjebak di layar tanpa jalan keluar setelah journey ditutup.
peringatan

Callback onFinish menandakan bahwa pengguna telah menyelesaikan journey, tetapi tidak menjamin persetujuan. Proses bisa saja berakhir dengan kegagalan pada salah satu aturan validasi Unico. Memeriksa melalui getProcess atau menerima notifikasi Webhook bukanlah opsional: keduanya adalah satu-satunya sumber hasil yang sebenarnya, dan perilaku aplikasi harus didasarkan padanya. onFinish tidak boleh digunakan secara terpisah untuk menentukan apakah pengguna disetujui.

Callback onFinish menerima sebuah objek yang menjelaskan bagaimana journey berakhir:

FieldTipeDeskripsi
typestringBagaimana journey berakhir: 'FINISH' (selesai) atau 'CLOSE' (pengguna menutup sebelum selesai)
transactionobject | undefinedAda saat type bernilai 'FINISH'; undefined saat type bernilai 'CLOSE'
transaction.idstringPengidentifikasi proses (sama dengan transactionId yang diberikan)
transaction.​redirectUrlstringURL untuk mengarahkan pengguna setelah journey

Menangani callback onWidgetVisibilityChange bersifat opsional dan mungkin tidak relevan untuk kasus penggunaan Anda. Callback ini dipanggil setiap kali status visibilitas widget berubah, dan hanya berguna dalam skenario tertentu: beberapa journey menampilkan latar belakang transparan, sehingga halaman aplikasi tetap terlihat di belakang pengalaman. Aplikasi yang menampilkan modal kustom selama alur verifikasi (misalnya, sebagai bagian dari orkestrasi di antara beberapa penyedia KYC) mungkin akhirnya menampilkan modal tersebut di belakang widget Unico, sehingga menurunkan kualitas pengalaman visual. Dalam hal ini, callback memungkinkan aplikasi untuk menyembunyikan elemen visual tambahan apa pun selama journey Unico aktif, dan memulihkannya setelah selesai. Jika aplikasi Anda tidak memiliki UI yang dapat menutupi widget, Anda dapat dengan aman menghilangkannya.

ByUnicoSDK.open({
transactionId: '9bc22bac-1e64-49a5-94d6-9e4f8ec9a1bf',
token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
onFinish: ({ transaction, type }) => {
if (type === 'FINISH') {
// Journey selesai (transaction = { id, redirectUrl }): lanjutkan alur Anda di sini.
}
// type === 'CLOSE' → pengguna menutup sebelum selesai;
},
// Opsional: hanya diperlukan jika aplikasi Anda menampilkan UI yang dapat menutupi widget.
onWidgetVisibilityChange: (visible) => {
// sembunyikan atau pulihkan modal Anda berdasarkan visibilitas widget
},
});

// Untuk menutup SDK secara eksplisit kapan saja:
ByUnicoSDK.close();

Diagram urutan di bawah ini menunjukkan cara menggunakan SDK dan hasil API untuk mengonfigurasi iFrame:

Aplikasi referensi​

Bahasa / FrameworkDeskripsiRepository
Node.js (Express)Aplikasi referensi dalam Node.js yang mengimplementasikan alur user journey secara lengkap dengan Journeys SDKGitHub — reference-apps/web

Keamanan​

Keamanan dalam model ini dibangun secara berlapis, dimulai dari protokol komunikasi antara SDK dan aplikasi yang berjalan di dalam iFrame.

Saat journey dimuat, kedua belah pihak melakukan handshake untuk membangun komunikasi. Dalam proses ini, aplikasi Unico memvalidasi asal pesan injeksi data yang diterima melalui postMessage terhadap daftar tertutup domain yang diizinkan, yang disegmentasi berdasarkan lingkungan (UAT dan PROD). Pesan dari asal yang tidak disetujui langsung dibuang, sehingga mencegah journey disematkan pada halaman yang tidak sah dan menghilangkan permukaan serangan untuk kerentanan seperti clickjacking.

Selain validasi asal, alur hanya berlanjut dengan token transaksi yang valid: JWT sekali pakai yang diterbitkan dan ditandatangani oleh backend Unico. Ini memastikan bahwa bahkan asal yang sah pun tidak dapat beroperasi dengan token yang kedaluwarsa, digunakan ulang, atau dipalsukan.

Setelah handshake, token disuntikkan ke dalam iFrame dan tidak ada lagi informasi sensitif yang mengalir di antara kedua belah pihak. Seluruh komunikasi selebihnya hanya berfungsi untuk kontrol antarmuka (membuka, menutup, dan transisi layar), sehingga mencegah data proses disadap atau bocor selama journey.

Isolasi iFrame juga melindungi integritas skrip Unico saat runtime. Karena kode berjalan dalam konteks yang terpisah dari halaman, kode tersebut tidak dapat diakses atau dimodifikasi oleh skrip eksternal, sehingga memastikan journey berjalan persis seperti yang dibangun, tanpa gangguan.

Berdasarkan desain, CSP tidak diterapkan dalam model integrasi ini. Domain yang diizinkan merupakan bagian dari konfigurasi keamanan setiap klien, dan pengungkapannya secara publik di header dapat memudahkan pemetaan infrastruktur oleh pihak yang berniat jahat. Karena identifikasi klien baru terjadi pada saat init, tidak mungkin menyuntikkan domain-domain ini secara dinamis ke dalam header sebelum titik tersebut, sehingga membuat CSP tidak dapat diterapkan tanpa mengorbankan privasi ini. Semua jaminan keamanan disediakan oleh protokol handshake yang dijelaskan di atas.

Pemecahan masalah khusus SDK​

Bagian ini membahas masalah paling umum yang dijumpai selama integrasi serta cara yang disarankan untuk menyelidikinya.

Perilaku tak terduga atau alur terputus​

Periksa apakah ada skrip aplikasi yang memanipulasi iFrame secara langsung di DOM. SDK membuat dan mengelola iFrame di body halaman, dan setiap modifikasi eksternal (baik pada cakupan, posisi, maupun atribut) dapat mengganggu siklus hidup journey dan menyebabkan perilaku yang tak terduga.

Pengalaman visual berbeda dari yang diharapkan​

Periksa apakah ada stylesheet global aplikasi yang menimpa properti di dalam iFrame. SDK membuat iFrame dan semua elemen internalnya dengan ID dinamis dan kelas berawalan unico, yang secara signifikan mengurangi risiko konflik melalui selektor ID atau kelas. Meski demikian, aturan CSS dengan cakupan luas (seperti selektor tag) dapat menjangkau elemen di dalam iFrame dan mengubah pengalaman visual yang disajikan kepada pengguna.

Berkas pustaka SDK dimodifikasi secara langsung​

Periksa apakah ada berkas pustaka yang dimodifikasi di luar pengelola dependensi. Pustaka harus dikelola secara eksklusif melalui npm atau yarn, tanpa pengeditan langsung pada berkas yang terpasang. Modifikasi manual dapat menghasilkan perilaku tidak normal yang sulit direproduksi dan membuat dukungan dari tim Unico tidak dapat membantu.

Jangan biarkan DevTools terbuka selama pengujian pengambilan​

Unico menggunakan beberapa mekanisme untuk mengamankan journey-nya, salah satunya mendeteksi DevTools yang terbuka sebagai potensi sinyal penipuan dan memblokir pengiriman. Tutup DevTools sebelum menjalankan pengujian pengambilan menyeluruh (end-to-end).

Integrasi yang tidak didukung

Model yang dijelaskan dalam dokumentasi ini (akses langsung dan SDK Journeys) adalah satu-satunya pendekatan integrasi yang secara resmi didukung oleh Unico. Integrasi yang menyimpang dari standar ini dapat menyebabkan perilaku tak terduga, kegagalan alur keamanan, dan gangguan journey, serta tidak akan dicakup oleh dukungan Unico.

Beberapa contoh pendekatan yang tidak didukung:

  • Menyematkan SDK di dalam WebView pada aplikasi mobile. Dalam kasus ini, pendekatan yang benar adalah menggunakan model akses langsung, dengan membuka tautan journey langsung di WebView, tanpa melibatkan SDK Journeys.
  • Memuat iFrame secara langsung melalui tag HTML <iframe>, tanpa melalui SDK Journeys. iFrame adalah detail implementasi internal SDK dan tidak boleh diinstansiasi secara manual. Pendekatan yang benar adalah menggunakan SDK Journeys, yang mengelola siklus hidup iFrame secara aman dan sesuai standar yang diharapkan.

Jika ada keraguan apakah suatu pendekatan berada dalam standar yang didukung, konsultasikan dokumentasi atau hubungi dukungan sebelum melanjutkan implementasi.