Multilingual Emails From Stripe Webhooks

SaaS को वैश्विक स्तर पर स्केल करने में कुछ छिपे हुए खतरे होते हैं। हमें अपने Stripe webhooks में एक ऐसा ही खतरा मिला।

हमारा सिस्टम अंग्रेजी बोलने वाले उपयोगकर्ताओं को खरीदारी की पुष्टि (purchase confirmations), रिन्यूअल और विफलता के नोटिस जापानी भाषा में भेज रहा था। यह बग महीनों तक बना रहा क्योंकि यह चुपचाप काम कर रहा था।

हमने मुद्रा (currency) से भाषा का अनुमान लगाकर इसे हल किया।

हमने तीन डिज़ाइन विकल्पों पर विचार किया:

  • विकल्प A: डेटाबेस में भाषा स्टोर करें। इसके लिए पुराने उपयोगकर्ताओं के लिए migrations और backfills की आवश्यकता होगी।
  • विकल्प B: Stripe API से जानकारी लें। इससे अतिरिक्त API calls बढ़ जाते हैं और कई ग्राहक अपनी पसंदीदा locale सेट नहीं करते हैं।
  • विकल्प C: Webhook payload में मौजूद currency का उपयोग करें। यह मुफ़्त है, इसके लिए डेटाबेस में कोई बदलाव नहीं चाहिए, और यह मौजूदा उपयोगकर्ताओं के लिए तुरंत काम करता है।

हमने विकल्प C को चुना। खरीदारी के समय currency एक निश्चित संकेत (fixed signal) होती है। यदि कोई उपयोगकर्ता USD में भुगतान करता है, तो उसे अंग्रेजी मिलेगी। यदि वे JPY में भुगतान करते हैं, तो उन्हें जापानी मिलेगी।

लॉजिक सरल है:

function lang_from_currency(string $currency): string { $en_currencies = ['usd']; return in_array(strtolower($currency), $en_currencies, true) ? 'en' : 'ja'; }

यह Stripe के इन चारों प्रमुख events के लिए काम करता है:

  • checkout.session.completed
  • invoice.payment_succeeded
  • invoice.payment_failed
  • customer.subscription.updated

हमें PHP के साथ एक तकनीकी समस्या (technical trap) भी मिली।

mb_language('Japanese') का उपयोग करने से subjects ISO-2022-JP में encode हो जाते हैं। यदि आप इस सेटिंग के साथ अंग्रेजी subject line भेजते हैं, तो Gmail और Outlook इसे अजीब encoding के रूप में देखते हैं। इससे आपका spam score बढ़ जाता है।

इसका समाधान भाषा के आधार पर encoding बदलना है:

mb_language($lang === 'en' ? 'uni' : 'Japanese');

'uni' का उपयोग करने से UTF-8 Base64 का उपयोग होता है। इससे आपके ईमेल spam folder में जाने से बच जाते हैं।

इस सुधार से तीन सबक:

  • Event payload का उपयोग करें। यदि डेटा पहले से ही webhook में है, तो अपने database को न छुएं। इससे जोखिम और maintenance कम होती है।
  • अपनी encoding पर ध्यान दें। यदि आप कई भाषाओं का समर्थन करते हैं, तो spam filters से बचने के लिए सुनिश्चित करें कि आपकी subject line encoding कंटेंट से मेल खाती हो।
  • Hardcoded values की जांच करें। जब आप अंतरराष्ट्रीय स्तर पर विस्तार करते हैं, तो जांच लें कि आपके notification functions में भाषा की सेटिंग्स hardcoded तो नहीं हैं।

एक stateless design आपके सिस्टम को बनाए रखने में आसान और खराब होने से बचाने में अधिक सक्षम बनाता है।

Source: https://dev.to/susumun/multilingual-emails-from-a-stripe-webhook-inferring-language-from-currency-i99