Perpustakaan PHP untuk e-commerce: bekerja dengan ATOL dan Payture, parsing kode GS1 dan tugas lainnya

Hai, nama saya Pavel Savelyev, saya adalah kepala departemen otomatisasi proses bisnis di Lamoda. Kami bekerja dengan tugas yang sangat berbeda, dan mencoba memilih alat yang paling nyaman untuk masing-masing. Karenanya, kami menggunakan berbagai bahasa - di sistem kami, Anda dapat menemukan Java, Go, dan Kotlin kecil untuk android. Pada saat yang sama, sebagian besar pengembangan dilakukan dalam PHP, lebih dari dua lusin layanan ditulis di atasnya yang mengotomatiskan tidak hanya bekerja dengan pesanan, tetapi juga proses operasional dari jaringan pengiriman yang luas, call center di tiga negara dan studio foto kita sendiri, serta menyediakan semua ini dalam bentuk layanan kepada mitra B2B kami. Layanan ini didukung dan dikembangkan oleh 5 tim pengembangan departemen kami.

gambar

Ketika layanan itu sendiri dan infrastruktur di sekitarnya berkembang, tugas serupa lebih sering muncul dalam sistem ini, seperti masuk ke CLS (Centralized Logging System) yang umum, menguji penyimpanan file, mengumpulkan metrik untuk Prometheus dan yang lainnya. Kami mencoba membakukan cara-cara untuk menyelesaikan masalah seperti itu dan menggunakan komponen umum untuk sistem yang berbeda.

Ketika salah satu tim dihadapkan dengan adaptasi atau integrasi layanan / alat baru yang mungkin menjadi hal umum bagi semua orang, kami memulai pengembangan perpustakaan di tim ini. Dan kemudian komponen selesai disiapkan untuk digunakan kembali di masa depan dan diletakkan di domain publik.

Jadi, proses seperti itu terjadi secara teratur bersama kami, kami membuat pedoman yang memungkinkan kami untuk melakukannya dengan sangat mudah - saya akan mencoba melaporkannya di salah satu konferensi berikutnya.

Lebih dari dua lusin perpustakaan PHP kami telah tersedia untuk umum di GitHub. Dan kami berencana untuk menyebar lebih jauh. Mengapa Ya, kami menginvestasikan banyak sumber daya dan (saya ingin percaya) melakukannya dengan baik. Dan kami dengan licik berharap bahwa pengembang lain akan menggunakan perpustakaan kami, membantu mereka menyelesaikan dan mengembangkan lebih lanjut, daripada menghabiskan waktu menulis analog mereka dari awal. Dalam artikel ini saya ingin secara singkat berbicara tentang tujuh perpustakaan yang dirancang untuk menyelesaikan masalah umum untuk tugas-tugas e-commerce - saya akan senang jika mereka berguna bagi Anda, dan saya akan lebih senang untuk mengembangkannya bersama-sama :)

1. Fiskalisasi online: klien untuk ATOL Online


Seperti perusahaan Rusia lainnya, kami berkewajiban untuk sepenuhnya mematuhi persyaratan FZ-54, salah satunya adalah fiskalisasi online. Semua pesanan prabayar di lamoda.ru selalu difinalisasi : mereka menghasilkan cek online yang dikirim ke pelanggan. Layanan fiskalisasi kami bekerja dengan API dengan sistem ATOL Online, dan perpustakaan pertama dalam daftar kami adalah klien lengkap untuk layanan ini. Selain perpustakaan itu sendiri, kami juga memposting bundel , yang dengannya Anda dapat dengan mudah menghubungkannya ke proyek apa pun berdasarkan kerangka kerja Symfony. Pustaka itu sendiri dapat tertanam dalam kerangka PHP lain: Laravel, Yii, dll. - cukup tuliskan "wrapper" untuk pustaka.

2. Pembayaran prabayar: interaksi dengan Pembayaran


Untuk memproses pembayaran prabayar, kami secara aktif berinteraksi dengan layanan Pembayaran. Layanan ini memiliki beberapa antarmuka perangkat lunak. Kami menggunakan opsi Payture InPay dan telah menulis klien API kami sendiri untuk itu. Perpustakaan memungkinkan Anda untuk memanipulasi beberapa terminal, mendukung logging PSR-3 standar. Mungkin juga untuk menggunakan klien Guzzle yang sudah dikonfigurasi sebelumnya - ini membuatnya mudah untuk mengatur pengujian menggunakan Guzzle Mock Handler .

Bundel perpustakaan kami menyediakan konfigurasi semantik terminal dan memungkinkan Anda untuk mengonfigurasi pengaturan klien dengan nyaman (sejauh ini hanya timeout) untuk berbagai operasi API.

3. Pelabelan produk: parser kode Datamatrix GS1


Salah satu proyek terpenting 2019 di perusahaan kami adalah dukungan untuk pelabelan barang negara. Sebagai bagian dari proyek ini, kode unik khusus akan diterapkan ke semua produk dari kategori tertentu - dalam format Datamatrix GS1. Kode-kode ini akan memungkinkan setiap pembeli untuk memverifikasi keaslian barang, asal dan sejarahnya. Agar sistem internal Lamoda dapat bekerja dengan barcode ini, kami telah mengembangkan pustaka untuk penguraian kode GS1 yang benar.
Dalam waktu dekat, kami juga berencana untuk mengeluarkan kode sumber klien yang dikembangkan untuk berinteraksi dengan Sistem Informasi Penandaan dan Penelusuran (IP MP).

4. Manajemen layanan mikro: middleware untuk bus tim Tactician


Kami memiliki lebih dari seratus layanan microser yang melakukan banyak operasi terpisah: mereka memeriksa status pembayaran atau file baru dalam penyimpanan, mengirim perintah kontrol ke kasir, mengunduh dan memproses foto dari layanan eksternal. Hampir semua operasi ini dilakukan di latar belakang, dan pola bus perintah sangat baik untuk mengelolanya. Untuk mengimplementasikan bus dalam sistem PHP, kami memilih solusi yang sudah jadi - perpustakaan Tactician terbuka.

Namun, muncul masalah: tim latar belakang kami sering berinteraksi dengan layanan eksternal, yang memiliki batasan jumlah operasi dalam n detik. Dan Tactician tidak memiliki kemampuan untuk mengontrol jumlah perintah yang dapat dieksekusi di jendela waktu tertentu. Oleh karena itu, kami mengembangkan pustaka middleware tambahan - Tactician limit rate . Dengan bantuannya, Anda dapat menambahkan lapisan pemrosesan baru yang melacak jumlah perintah yang dijalankan di bus sesuai dengan strategi pembatasan tingkat yang dipilih. Strategi yang dapat dicolokkan, strategi dari perpustakaan kecil tersedia di luar kotak .

Juga di domain publik adalah bundel Symfony kami ke perpustakaan.

5. Mengumpulkan dan merender metrik untuk Prometheus


Layanan microser kami menghasilkan metrik teknis dan bisnis, yang kemudian dikumpulkan melalui Operator Prometheus dari seluruh kluster k8s. Untuk mengelola semua ini, kami menulis perpustakaan yang memproses metrik khusus sesuai dengan skenario "kumpulkan-simpan-tampilkan". Pada saat yang sama, perpustakaan mendukung mode operasi di mana salah satu item skrip dapat dihilangkan untuk meningkatkan efisiensi. Misalnya, untuk metrik yang dapat dihitung cepat, skenario "kumpulkan-tunjukkan" yang disederhanakan dapat dijalankan. Dan bekerja dengan metrik bisnis yang lambat dapat sebagian diterjemahkan ke latar belakang, sambil memecahnya menjadi dua tahap: "kumpulkan-simpan" + "kumpulkan (dari penyimpanan) - tunjukkan".

Perpustakaan memiliki tingkat abstraksi yang diperlukan baik untuk menulis generator metrik dan untuk menulis repositori. Di luar kotak ada adaptor abstrak untuk Doctrine, yang dapat dikonfigurasi pada entitas untuk menyimpan data ke database.

Sebagai format render metrik, prometheus dan telegraf httpjson saat ini didukung.

Perpustakaan dilengkapi dengan bundel Symfony, yang menyediakan konfigurasi semantik sumber metrik, repositori, dan metrik perutean. Ia juga memiliki perintah pembantu untuk men-debug dan menyimpan metrik dari sumber (misalnya, untuk menghitung metrik cron).

6. Menguji penyimpanan file: bekerja dengan sistem file yang berbeda


Untuk mengotomatiskan pengujian, kami menggunakan kerangka Codeception , yang memungkinkan kami untuk menulis tes dari berbagai tingkatan dan memiliki perpustakaan modul standar yang cukup luas. Kami menulis lebih banyak tentang pendekatan kami untuk menguji pengembangan baru-baru ini di sebuah artikel terpisah dan berbicara di konferensi PHP Rusia . Codeception memiliki modul yang siap pakai untuk berinteraksi dengan FTP dan FileSystem lokal, tetapi dalam pengujian kami ada kebutuhan untuk bekerja dengan lebih banyak sistem file. Minimal, kami juga menggunakan AWS S3 dan Webdav. Selain itu, saya ingin berinteraksi dengan semua sistem file menggunakan API yang sama (ini semua sistem file :)).

Untungnya, ada perpustakaan FlySystem terbuka yang menyediakan antarmuka perangkat lunak tunggal untuk bekerja dengan sistem file yang berbeda. Jadi kami hanya perlu menggabungkan dua alat - yang kami lakukan dengan menulis pembungkus di atas FlySystem sebagai modul Codeception-flysystem . Sekarang mendukung SFTP, S3 dan Webdav. Cukup dengan mengkonfigurasi pengaturan sekali untuk menyambung ke sistem file yang diinginkan dalam konfigurasi test yml, dan setelah itu Anda dapat bekerja dengan semua sistem file menggunakan set metode yang sama: menulis file, menyalin file, membersihkan direktori, dll. Modul ini sudah dimasukkan di halaman tambahan dan rekomendasi dari Codeception: codeception.com/addons .

7. Bekerja dengan variabel lingkungan dalam mode multi tenant


Di departemen otomatisasi proses bisnis, ada sistem yang beroperasi dalam mode multi tenant. Untuk memastikan pekerjaan mereka, perlu untuk dapat bekerja dengan variabel lingkungan - untuk menentukan variabel mana yang akan digunakan saat ini.

Perpustakaan kami menyediakan beberapa strategi untuk bekerja dengan variabel lingkungan dalam mode multi tenant. Berdasarkan parameter yang diteruskan pada tahap inisialisasi, perpustakaan menentukan variabel lingkungan mana yang harus diakses dalam permintaan saat ini.

Untuk dilanjutkan


Ini hanya bagian pertama dari perpustakaan. Kami memiliki selusin lebih di dalam - mereka menunggu dalam antrean ketika kami "menyisir" mereka sedikit dan menempatkan mereka di domain publik. Itu memotivasi saya untuk memahami bahwa perpustakaan ini mungkin berguna bagi orang lain. Saya bersukacita pada komentar dan bintang di github, dan saya berharap untuk terus mengembangkan perpustakaan dengan pengembang lain. Memang, banyak proyek e-commerce Rusia bekerja dengan ATOL dan Payture. Untuk Datamatrix, selain kode parser yang dijelaskan dalam artikel, kami juga memiliki beberapa klien yang sudah kami gunakan secara internal - perpustakaan ini adalah yang pertama dalam antrian di GitHub.

Kami mencoba untuk tidak melupakan bahasa lain - kami telah memposting perpustakaan pertama di Go (kami menulis lebih banyak tentang ini di sini di Habré ) dan kami sedang mempersiapkan yang lain. Tetap disini!

Source: https://habr.com/ru/post/id466039/


All Articles