Stripe Webhooks मधून बहुभाषिक ईमेल
SaaS जागतिक स्तरावर विस्तारताना काही छुपे अडथळे येतात. आम्हाला आमच्या Stripe webhooks मध्ये असाच एक अडथळा आढळला.
आमची प्रणाली इंग्रजी बोलणाऱ्या वापरकर्त्यांना खरेदीची पुष्टी (purchase confirmations), नूतनीकरण (renewals) आणि अयशस्वी सूचना (failure notices) जपानी भाषेत पाठवत होती. हा बग कित्येक महिने अस्तित्वात होता कारण तो फारसा लक्ष वेधून घेत नव्हता.
आम्ही चलनावरून (currency) भाषा ओळखून ही समस्या सोडवली.
आम्ही तीन डिझाइन पर्यायांचा विचार केला:
- पर्याय A: डेटाबेसमध्ये भाषा साठवणे. यासाठी जुन्या वापरकर्त्यांसाठी migrations आणि backfills आवश्यक आहेत.
- पर्याय B: Stripe API मधून माहिती घेणे. यामुळे अतिरिक्त API calls वाढतात आणि अनेक ग्राहक आपली पसंतीची भाषा (preferred locale) सेट करत नाहीत.
- पर्याय C: webhook payload मधील चलनाचा (currency) वापर करणे. हे मोफत आहे, यासाठी डेटाबेसमध्ये कोणताही बदल करण्याची गरज नाही आणि ते सध्याच्या वापरकर्त्यांसाठी त्वरित काम करते.
आम्ही पर्याय C निवडला. खरेदीच्या वेळी चलन हा एक निश्चित संकेत असतो. जर वापरकर्त्याने USD मध्ये पैसे दिले, तर त्यांना इंग्रजी मिळेल. जर त्यांनी JPY मध्ये पैसे दिले, तर त्यांना जपानी मिळेल.
याचे लॉजिक सोपे आहे:
function lang_from_currency(string $currency): string {
$en_currencies = ['usd'];
return in_array(strtolower($currency), $en_currencies, true) ? 'en' : 'ja';
}
हे Stripe च्या चार मुख्य इव्हेंट्ससाठी काम करते:
- checkout.session.completed
- invoice.payment_succeeded
- invoice.payment_failed
- customer.subscription.updated
आम्हाला PHP मध्ये एक तांत्रिक अडथळा देखील आढळला.
mb_language('Japanese') वापरल्यामुळे विषय (subjects) ISO-2022-JP मध्ये एन्कोड होतात. जर तुम्ही या सेटिंगसह इंग्रजी विषय पाठवला, तर Gmail आणि Outlook ला ते विचित्र एन्कोडिंग वाटते. यामुळे तुमचा स्पॅम स्कोअर (spam score) वाढतो.
याचे निराकरण म्हणजे भाषेनुसार एन्कोडिंग बदलणे:
mb_language($lang === 'en' ? 'uni' : 'Japanese');
'uni' वापरल्यामुळे UTF-8 Base64 वापरले जाते. यामुळे तुमचे ईमेल स्पॅम फोल्डरमध्ये जाण्यापासून वाचतात.
या निराकरणातून तीन धडे:
- इव्हेंट payload चा वापर करा. जर डेटा आधीच webhook मध्ये उपलब्ध असेल, तर तुमच्या डेटाबेसमध्ये बदल करू नका. यामुळे जोखीम आणि देखभाल (maintenance) कमी होते.
- तुमच्या एन्कोडिंगकडे लक्ष द्या. जर तुम्ही अनेक भाषांना सपोर्ट करत असाल, तर स्पॅम फिल्टर टाळण्यासाठी तुमच्या विषयाचे (subject line) एन्कोडिंग मजकुराशी जुळते की नाही याची खात्री करा.
- हार्डकोड केलेल्या (hardcoded) व्हॅल्यूज तपासा. जेव्हा तुम्ही जागतिक स्तरावर विस्तारता, तेव्हा तुमच्या नोटिफिकेशन फंक्शन्समध्ये भाषा सेटिंग्स हार्डकोड केल्या आहेत का, हे तपासा.
'Stateless design' मुळे तुमची प्रणाली देखभाल करण्यास सोपी आणि बिघडण्यास कठीण बनते.
