Emel Pelbagai Bahasa Daripada Webhook Stripe
Menskalakan SaaS secara global mempunyai perangkap tersembunyi. Kami menemui satu dalam webhook Stripe kami.
Sistem kami menghantar pengesahan pembelian, pembaharuan, dan notis kegagalan dalam bahasa Jepun kepada pengguna berbahasa Inggeris. Pepijat ini wujud selama berbulan-bulan kerana ia tidak menimbulkan masalah yang ketara.
Kami menyelesaikannya dengan membuat inferens bahasa daripada mata wang.
Kami melihat tiga pilihan reka bentuk:
- Pilihan A: Simpan bahasa dalam pangkalan data. Ini memerlukan migrasi dan pengisian semula (backfill) untuk pengguna lama.
- Pilihan B: Ambil daripada API Stripe. Ini menambah panggilan API tambahan dan ramai pelanggan tidak menetapkan lokasi (locale) pilihan.
- Pilihan C: Gunakan mata wang dalam payload webhook. Ini adalah percuma, tidak memerlukan perubahan pangkalan data, dan berfungsi untuk pengguna sedia ada dengan serta-merta.
Kami memilih Pilihan C. Mata wang adalah isyarat tetap pada masa pembelian. Jika pengguna membayar dalam USD, mereka mendapat bahasa Inggeris. Jika mereka membayar dalam JPY, mereka mendapat bahasa Jepun.
Logiknya mudah:
function lang_from_currency(string $currency): string {
$en_currencies = ['usd'];
return in_array(strtolower($currency), $en_currencies, true) ? 'en' : 'ja';
}
Ini berfungsi untuk keempat-empat acara utama Stripe:
- checkout.session.completed
- invoice.payment_succeeded
- invoice.payment_failed
- customer.subscription.updated
Kami juga menemui satu perangkap teknikal dengan PHP.
Menggunakan mb_language('Japanese') mengekod subjek dalam ISO-2022-JP. Jika anda menghantar baris subjek bahasa Inggeris dengan tetapan ini, Gmail dan Outlook akan melihatnya sebagai pengekodan yang pelik. Ini meningkatkan skor spam anda.
Penyelesaiannya adalah dengan menukar pengekodan berdasarkan bahasa:
mb_language($lang === 'en' ? 'uni' : 'Japanese');
Menggunakan 'uni' akan menggunakan UTF-8 Base64. Ini memastikan emel anda tidak masuk ke dalam folder spam.
Tiga pengajaran daripada penyelesaian ini:
- Gunakan payload acara. Jika data sudah ada dalam webhook, jangan usik pangkalan data anda. Ia mengurangkan risiko dan penyelenggaraan.
- Perhatikan pengekodan anda. Jika anda menyokong pelbagai bahasa, pastikan pengekodan baris subjek sepadan dengan kandungan untuk mengelakkan penapis spam.
- Audit nilai yang dikodkan secara keras (hardcoded). Apabila anda berkembang ke peringkat antarabangsa, semak jika fungsi pemberitahuan anda mempunyai tetapan bahasa yang dikodkan secara keras.
Reka bentuk tanpa keadaan (stateless) menjadikan sistem anda lebih mudah diselenggara dan lebih sukar untuk rosak.
