
Lima bulan lalu, kami menerbitkan modul NPM untuk bekerja dengan versi baru Yandex.Kassa, yang dirilis pada Oktober 2017. Modul kami masuk ke dalam dokumentasi resmi dan telah diunduh lebih dari 1.300 kali.

Di Habré, bersama dengan rekan-rekan dari Yandex, kami sudah
berbicara tentang pengalaman membuat modul, tetapi pengalaman kami yang kami peroleh ketika menghadapi integrasi sistem pembayaran untuk pelanggan Rusia masih tertinggal.
Oleh karena itu, hari ini kami ingin memberi tahu bagaimana untuk salah satu klien domestik kami, kami beralih dari mengintegrasikan sistem pembayaran luar negeri yang kami kenal ke rekan-rekan Rusia, kesulitan apa yang kami temui dan bagaimana mereka dipecahkan.
Bagaimana mereka bekerja dengan sistem pembayaran
Sebelumnya, kami hanya bekerja dengan sistem pembayaran pelanggan asing. Kami memiliki pengalaman berintegrasi dengan Authorize.net, Paypal, Braintree, Stripe, Payoneer, Wirecard, dan Svea.
Dengan sistem pembayaran ini, mudah untuk berinteraksi dan mengimplementasikan berbagai fungsi. Misalnya, ketika kami bekerja pada layanan pengiriman di Eropa, kami mengintegrasikan beberapa sistem pembayaran ke dalam proyek dan menulis sebuah algoritma - ini menerapkan logika kompleks dari operasi moneter. Ketika pengguna memesan layanan, sistem mentransfer uang dari akun pelanggan ke akun layanan, dan algoritma melakukan transaksi: menghitung ulang pembayaran jika terjadi masalah pengiriman, mengkonversikannya ke mata uang, melakukan pengembalian uang dan penjadwalan ulang pembayaran, menghapus persentase untuk menggunakan layanan.
Perwakilan sistem pembayaran terbaik memungkinkan Anda memulai pengembangan di kotak pasir bahkan tanpa registrasi. Banyak yang memiliki dokumentasi yang sangat baik, dan hampir semua membantu menyelesaikan masalah tanpa partisipasi aktif dari dukungan. Pengembang dapat mengelola hak dan akses dari akun pribadi. Sistem pembayaran memiliki SDK untuk platform paling populer, yang sekarang menjadi standar tidak tertulis.
Untuk mengintegrasikan sistem pembayaran, pengembang perlu:
- Daftar di situs dan dapatkan akses ke kotak pasir.
- Unduh SDK dan sambungkan. Masukkan panggilan ke fungsi sistem pembayaran di tempat yang tepat dari aplikasi.
- Uji semua skenario dan pastikan semuanya berfungsi dengan benar.
- Terlibat dalam tugas-tugas lain sementara pelanggan menyelesaikan masalah keuangan dan hukum.
- Pada waktu yang tepat, alihkan penerimaan pembayaran ke mode "memerangi".
Apa yang telah berubah?
Setahun yang lalu, kami mulai bekerja di pasar domestik. Salah satu proyek pertama
adalah aplikasi Sellsay . Ini membantu pengguna mengembangkan keterampilan dalam negosiasi, dan juga merupakan platform untuk bantuan profesional timbal balik.
Aplikasi ini memiliki banyak fitur selain fungsi standar: otorisasi dan pendaftaran, pembuatan dan pengeditan proyek. Melalui layanan ini Anda dapat menghubungi
kepada pelatih bisnis. Jika Anda memiliki pengetahuan yang diperlukan, Anda bisa mendapatkan sertifikat dan menjadi pelatih independen, berpartisipasi dalam acara dan pelatihan
dari pencipta aplikasi, dapatkan uang.
Agar dapat membayar dalam layanan, perlu untuk mengintegrasikan sistem pembayaran - sistem di mana Anda dapat membayar dalam rubel dan dolar, mentransfer jangka waktu pembayaran dan membuat pengembalian uang, menyimpan kartu, dan tidak memasukkan data saat melakukan pembelian berulang, menggunakan Apple dan Android Pay. Untuk mengimplementasikan ini, kami memilih sistem Braintree.
Dan kemudian kami membuat kesalahan besar. Kami menyetujui dan menerapkan fungsi dasar bekerja dengan sistem pembayaran, tetapi tidak memperhitungkan satu detail penting. Kami mengetahuinya dua minggu sebelum rilis, ketika mereka sedang mempersiapkan proyek untuk peluncuran. Kami tidak memperhitungkan bahwa Braintree tidak bekerja dengan perusahaan-perusahaan dari Rusia. Untuk mendaftarkan perusahaan di negara bukan pilihan. Kami masih memiliki satu jalan keluar: untuk mengganti sistem pembayaran sesegera mungkin.
Yandex.Kassa: bekerja dengan versi pertama API
Setelah menganalisis sistem, kami memilih Yandex.Cash: layanan memungkinkan kami untuk menerapkan hampir semua fungsi, cocok untuk klien dengan harga dan menyelesaikan masalah 54-FZ saat menghubungkan meja kas online.
Beberapa saat kemudian, kami menyadari bahwa visi kami tentang integrasi pada dasarnya berbeda dari visi Yandex.Kassa dan layanan keamanannya. Seluruh tahap integrasi lebih dikenang dengan kontrak, formulir, dan panggilan telepon tanpa akhir, bukan dengan menulis kode.
Jadi, untuk mendapatkan kunci uji, Anda harus memberikan tautan ke aplikasi di Apple Store atau Google Play. Dari mana kami mendapatkan tautan jika penerimaan pembayaran merupakan prasyarat untuk menerbitkan aplikasi? Kami berhasil memecahkan masalah ini, tetapi kemudian ada situasi di mana perlu untuk mengimplementasikan dan mempublikasikan fungsi untuk aktivasi oleh manajer.
Ya, hampir semua permintaan diselesaikan dengan komunikasi dengan manajer pribadi. Tetapi jika pertanyaan di akun pribadi Anda sampai ke manajer pribadi Anda, maka ketika Anda menelepon, ada kemungkinan besar untuk mendapatkan manajer acak dan gratis di telepon dan mendapatkan jawaban yang sepenuhnya acak. Setelah beberapa saat - hubungi manajer lain dan dapatkan jawaban sebaliknya untuk pertanyaan yang sama.
Kerugian lain: Yandex mendukung API multi-generasi. Bahkan Yandex.Kassi memiliki beberapa subsistem yang menggunakan dokumentasi berbeda, otentikasi, dan sebagainya. Akibatnya, Anda harus mengimplementasikan API yang tidak terkait secara bersamaan. Misalnya, Anda menerima pembayaran, dan untuk pembatalan Anda harus memulai dari awal lagi: aplikasi, kontrak, panggilan, studi, dan integrasi API.
Minggu-minggu terakhir sebelum peluncuran berubah menjadi neraka. Untuk memulai proyek tepat waktu, kami harus memperkuat tim dan bekerja lembur, dan Yandex.Cash, sementara itu, tidak melewatkan kesempatan untuk membuat kami gugup.
Perbandingan Yandex.Kassa dengan Stripe
Dalam komunitas pengembang, Stripe adalah pemimpin dalam kemudahan integrasi dan bekerja dengan sistem pembayaran. Mereka adalah yang pertama merawat para programmer dan membuat sistem pembayaran senyaman dan sefleksibel mungkin. Ini memungkinkan pengembang tidak hanya menarik napas lega, tetapi juga mempercepat dan mengurangi biaya proses integrasi.
Anda dapat menemukan banyak kesamaan antara Yandex.Kassa dan Stripe. Misalnya, kedua sistem dibangun di atas prinsip seperti REST, gunakan kode respons HTTP, dukungan CORS (dan respons datang dalam JSON), keduanya mendukung idempotensi. Ada "kotak pasir" - salinan lengkap dari toko nyata, dan transisi antara mode hanyalah penggantian kunci: tidak perlu mengubah API atau URL.
Tetapi pada saat yang sama, mereka sangat berbeda, dan untuk menunjukkan bagaimana sistem ini memiliki pendekatan yang berbeda, kami akan mempertimbangkan implementasi beberapa tahapan menggunakan contoh nyata.
Karena bagian server diimplementasikan pada Node.js pada proyek ini, saya akan memberikan contoh untuk itu.
Kami terhubung ke proyek .
Stripe:
var stripe = require('stripe')('sk_test_...');
Yandex. Kas:
, ;
Permintaan detail kartuStripe:
Hubungkan perpustakaan klien dengan cara yang sama dan minta token dengan tampilan formulir untuk memasukkan kartu.
var stripe = Stripe('pk_test_6pRNASCoBOKtIshFeQd4XMUh'); var elements = stripe.elements();
Di server
stripe.charges.create({ amount: 2000, currency: "usd", source: "token from previous step",
Yandex. Kas:
: , . : <a href="https://money.yandex.ru/eshop.xml?shopId=12345&scid=1234566&sum=3000&customerNumber=73">https://money.yandex.ru/eshop.xml?shopId=12345&scid=1234566&sum=3000&customerNumber=73</a>
Sebenarnya, harus ada formulir pembayaran di situs. Ketika pengguna mengklik "Bayar", formulir ini dikirim ke alamat di atas dan melewati parameter menggunakan metode POST. Tetapi kami memiliki aplikasi seluler, jadi saya harus meninggalkan formulir dan membentuk tautan di sisi server dengan pembukaan di WebView.
Tautan ini diberikan kepada klien untuk memasukkan detail kartu dan mengkonfirmasi pembayaran. Namun di sini kami dihadapkan dengan kejutan lain: pada akhir 2017, Yandex.Kassa tidak mendukung desain responsif. Berbagai manipulasi dengan pengaturan tidak membuahkan hasil.
Desain tidak beradaptasi untuk aplikasi selulerTernyata untuk mengubah tampilan halaman pembayaran ke mode adaptif, Anda harus meninggalkan permintaan di akun pribadi Anda. Kami harus menghubungi dukungan teknis lagi.
Hore, desain yang disesuaikan untuk ponsel di tahun 2017!
Tetapi hanya untuk pembayaran dengan kartu kreditPeriksa fakta pembayaranStripe:
Pembayaran diperiksa selama proses pembayaran dan jika terjadi kesalahan, fungsi API akan mengembalikan pengecualian yang sesuai.
Yandex. Kas:
Pengguna melakukan pembayaran di sisi Yandex.Cash, tetapi aplikasi pengguna belum tahu tentang fakta pembayaran. Karenanya, Yandex.Kassa harus memberi tahu server bahwa pembayaran telah dilakukan. Untuk melakukan ini, pengembang harus membuat WebHook dan mengonfigurasi Yandex.Cash, sehingga dapat menggunakan alamat dari WebHook untuk menyampaikan fakta pembayaran.
Pemberitahuan pembayaran server terjadi dalam 2 tahap:
- Periksa opsi pembayaran. Server kami memeriksa semuanya, mengizinkan atau menolak pemotongan dana, misalnya, memeriksa saldo barang, atau kebenaran harga.
- Pemenuhan pembayaran. Yandex.Kassa memberi tahu server kami bahwa uang telah didebit dan pembayaran berhasil. Pada titik ini, perlu untuk memperbaiki fakta pembayaran dalam database.
Tapi di sini kejutan menunggu kita:
- Untuk mengubah alamat, Anda perlu mengirim permintaan ke manajer dan menunggu lagi.
- Diperlukan untuk mengimplementasikan algoritma khusus untuk memeriksa validitas data dari Yandex.Kassa.
- Server harus mengembalikan XML yang dibuat khusus. Kami dapat menemukan modul yang siap pakai untuk menghasilkan jawaban yang benar.
Batalkan pembayaranStripe:
stripe.refunds.create({ charge: "ch_1BTuEo2eZvKYlo2CSGqKz76n" }, function(err, refund) {
Yandex. Kas:
X.509 MWS. ., ..
Seperti yang Anda duga, koordinasi dan koneksi membutuhkan waktu. Dengan lancar melampaui batas tenggat waktu.
Simpan kartuStripe:
stripe.customers.create({ email: "paying.user@example.com", source: "src_18eYalAHEMiOZZp1l9ZTjSU0", }, function(err, customer) {
Yandex. Kas:
Kami menjelaskan aturan untuk membatalkan penyimpanan kartu dan menerapkan kemampuan untuk menghapus. Kemudian kami mengirim aplikasi untuk ditinjau ke layanan keamanan Yandex.Kassa dan menunggu jawaban.
Jika jawabannya ya, menjadi mungkin untuk menyimpan kartu setelah pembayaran berhasil dan melakukan pembayaran berulang menggunakan protokol MWS.
Contoh permintaan dari dokumentasi:
POST https:
Seperti yang Anda lihat dari contoh, Stripe lebih cocok untuk pengembang dan memiliki beragam fungsi dan kemampuan. Tapi ada satu TETAPI besar: Stripe, seperti Braintree, tidak bekerja di Rusia, meskipun dapat menerima pembayaran dari berbagai negara. Pemilik akun di Stripe harus merupakan penduduk negara yang dapat diaksesnya - Rusia tidak termasuk di antara mereka.
Apa akibatnya
Bahkan dengan mempertimbangkan fakta bahwa kami harus melakukan banyak pekerjaan tambahan dan berkomunikasi dengan dukungan, kami tidak hanya berhasil menyelesaikan hampir semua tepat waktu, tetapi juga melakukan pekerjaan tambahan. Seminggu sebelum rilis, versi baru API Yandex.Kassi dirilis dan kami membuat modul NPM dan menulis ulang kode.
Ketika kami menemukan versi baru API, kami sangat terkejut: pengembang jelas melihat analog asing dan menerapkan praktik terbaik. Beberapa masalah dari versi sebelumnya telah diselesaikan. Dokumentasi untuk API baru tidak memiliki SDK untuk Node.js. Kami berencana untuk bekerja di pasar Rusia lebih lanjut, dan kami akan membutuhkan alat semacam itu. Karena itu, kami memutuskan untuk membuat modul NPM, yang dapat diintegrasikan siapa pun secara mandiri ke dalam proyek mereka.