Apa yang Ditemukan Audit Sistem Pembayaran Kami Sendiri
Dua temuan kritis, dan tidak satu pun ada di tempat yang akan kami periksa. Laporan terbuka tentang kesalahan yang kini sudah diperbaiki.

Pada Agustus 2026 kami meninjau sistem pembayaran kami dari dasar. Bukan karena sesuatu terjadi, tapi karena sistem itu baru saja live dan kami ingin tahu apa yang terlewat.
Ternyata cukup banyak yang terlewat. Artikel ini menyebutkan temuan-temuannya. Semua yang dijelaskan di sini sudah diperbaiki, dan sebagian besar memang sudah ada di changelog publik.
Kesalahan pemodelan yang menjadi asal kedua temuan kritis
Saat seseorang membeli Premium dari kami, sebuah catatan pelanggan dibuat di penyedia pembayaran kami. Kami menyimpan catatan itu berdasarkan ID server, karena toh Premium jatuh ke sebuah server.
Justru itulah model yang salah, dan itulah akar dari dua temuan paling serius.
Sebuah catatan pelanggan milik seorang pembeli. Catatan itu membawa metode pembayarannya, riwayat tagihannya, dan, begitu seseorang membayar untuk dua server, beberapa langganan. Menyimpannya berdasarkan ID server berarti beberapa orang menunjuk ke baris yang sama.
Temuan 1: Data pelanggan orang lain bisa ditimpa tanpa membayar
Pembelian terbuka untuk anggota mana pun di sebuah server, dan fungsi yang mengambil atau membuat catatan pelanggan berjalan sebelum pembayaran. Fungsi itu menemukan baris berdasarkan ID server lalu diam-diam menulis ulang baris itu untuk calon pembeli baru, termasuk alamat email mereka di penyedia pembayaran.
Dalam praktiknya artinya begini: satu klik di server tempat seseorang pernah membeli sudah cukup. Setelah itu, tagihan untuk setiap langganan pembeli asli tersebut akan dikirim ke alamat email orang asing itu. Tanpa pembayaran, tanpa konfirmasi.
Diperbaiki dengan memeriksa, sebelum catatan dipakai ulang, apakah catatan itu benar-benar milik akun ini. Kalau tidak cocok, catatan terpisah dibuat dan catatan yang lain tidak disentuh.
Temuan 2: Portal tagihan membuka langganan orang lain
Kesalahan pemodelan yang sama, satu tingkat lebih jauh. Pemeriksaan kepemilikan berlaku untuk langganan server, tapi sesi portal dibuka untuk catatan pelanggan, yang secara desain bisa membawa beberapa server.
Jadi siapa pun yang membeli secara sah di satu server bisa melihat dan mengelola langganan yang dibawa catatan yang sama untuk server lain.
Diperbaiki dengan menentukan catatan pelanggan dari pembelian yang spesifik, bukan dari baris server.
Dua temuan saat kode bertentangan dengan syarat kami sendiri
Inilah kategori yang paling mengganggu kami, karena sifatnya bukan teknis.
Daftar hitam mengambil waktu yang sudah dibayar. Syarat layanan kami menyatakan bahwa langganan berakhir pada akhir periode yang sedang berjalan. Tapi saat memblokir sebuah server, kode meminta pembatalan seketika: tanpa pengembalian dana, dan tanpa layanan sejak saat itu untuk periode yang sudah dibayar. Kode melakukan sesuatu yang berbeda dari yang kami janjikan secara tertulis. Kini periode yang sudah dibayar dibiarkan berjalan sampai habis.
Pelepasan hak penarikan tidak bisa dibuktikan. Sebelum membeli, kamu harus mengonfirmasi bahwa layanan dimulai seketika. Konfirmasi itu hanya hidup di browser, tidak pernah ikut dikirim, dan tidak pernah disimpan di mana pun. Beban pembuktian ada pada kami, dan kami sama sekali tidak punya bukti. Kini persetujuan itu menjadi kolom wajib di rute checkout, disimpan dengan stempel waktu dan teks berversi, dan teks itu sendiri diberi versi: teks yang sudah ada tidak pernah diedit, selalu dibuat versi baru, karena kalau tidak, catatan lama tidak bisa lagi direproduksi.
Putaran kedua lebih buruk daripada yang pertama
Setelah 21 temuan pertama, kami melihat lagi beberapa minggu kemudian. Itu keputusan yang tepat, karena temuan paling serius baru muncul saat itu.
Pengembalian dana di server B menghapus lisensi lifetime berbayar milik server A. Notifikasi pengembalian dana dan chargeback hanya menyebutkan sebuah pembayaran, bukan sebuah server. Kami menelusurinya lewat catatan pelanggan. Karena di putaran pertama kami sudah dengan benar menetapkan bahwa sebuah catatan milik seorang pembeli di beberapa server, penelusuran itu tidak lagi bermakna tunggal. Seseorang yang membayar untuk dua server dan menerima pengembalian dana untuk salah satunya bisa kehilangan lisensi lifetime server yang lain.
Penelusuran kini berjalan lewat empat langkah yang pasti, dan apa pun yang tidak bisa ditelusuri secara jelas akan dilaporkan, bukan ditebak.
Chargeback yang dimenangkan tidak memulihkan apa pun. Saat terjadi chargeback, kode menghapus baris pembelian, satu-satunya bukti bahwa server ini pernah punya lisensi lifetime. Memenangkan kasusnya belakangan tidak bisa membatalkan hal itu. Kini barisnya ditandai, bukan dihapus.
Penyimpanan data menghapus server yang berbayar. Saat bot keluar dari sebuah server, datanya dihapus setelah 30 hari. Pembersihan itu tidak pernah bertanya apakah ada langganan yang masih berjalan.
Apa yang kami ambil darinya
Bug-nya tidak ada di kode pembayaran. Tidak satu pun temuan kritis menyangkut jumlah, mata uang, atau perhitungan. Semuanya ada di model di belakangnya: siapa pemilik catatan pelanggan, siapa pemilik pembayaran, siapa pemilik server. Siapa pun yang mengaudit sistem pembayaran dengan melihat jumlah uang justru memalingkan pandangan dari bagian yang berbahaya.
Audit butuh putaran kedua. Temuan paling serius adalah akibat langsung dari perbaikan di putaran pertama. Itu bukan kebetulan: mengoreksi sebuah model membatalkan asumsi yang masih berlaku di tempat lain.
"Syarat kami bilang begitu" adalah kalimat yang bisa diperiksa. Dua temuan adalah perbedaan antara apa yang kami janjikan secara tertulis dan apa yang dilakukan kode. Itu bisa dibaca, dan tidak ada yang melakukannya, karena kelihatannya seperti urusan hukum, bukan teknik.
Syarat pembelian lengkap ada di syarat layanan kami, hak penarikan di penarikan.
Artikel lainnya
Hukum di Dalam Kode Kami
Tombol pembatalan yang harus bekerja tanpa login. Formulir yang tidak boleh menolakmu. Kenapa kewajiban hukum bagi kami adalah arsitektur, bukan teks standar.
Di balik layarMengapa Hampir Semua di AlphaCloud Tetap Gratis
Sebagian besar bot Discord mengunci fitur paling bergunanya di balik langganan. Kami sengaja tidak melakukannya, dan itu tidak semurah hati kedengarannya.
Di balik layarMengawasi 4.000 Server Discord: Grafana, PostHog, dan Apa yang Mereka Tunjukkan kepada Kami
Sebuah loop yang diam-diam menghasilkan separuh trafik kami, tiga juta request sia-sia per hari, dan serangan yang selesai dalam satu menit. Apa yang dilihat pemantauan kami, dan apa yang sengaja tidak dilihatnya.