Stripe Webhook থেকে বহুভাষিক ইমেল
একটি SaaS বিশ্বব্যাপী স্কেল করার ক্ষেত্রে কিছু লুকানো ফাঁদ থাকে। আমরা আমাদের Stripe webhook-এ একটি ফাঁদ খুঁজে পেয়েছি।
আমাদের সিস্টেম ইংরেজিভাষী ব্যবহারকারীদের কাছে জাপানি ভাষায় ক্রয়ের নিশ্চিতকরণ, রিনিউয়াল এবং ব্যর্থতার নোটিশ পাঠাচ্ছিল। এই বাগটি মাসের পর মাস টিকে ছিল কারণ এটি খুব একটা ধরা পড়েনি।
আমরা কারেন্সি (currency) থেকে ভাষা অনুমান করার মাধ্যমে এটি সমাধান করেছি।
আমরা তিনটি ডিজাইনের বিকল্প বিবেচনা করেছি:
- অপশন A: ডাটাবেসে ভাষা সংরক্ষণ করা। এর জন্য মাইগ্রেশন এবং পুরনো ব্যবহারকারীদের জন্য ব্যাকফিল (backfill) প্রয়োজন।
- অপশন B: Stripe API থেকে তথ্য নেওয়া। এটি অতিরিক্ত API কল তৈরি করে এবং অনেক গ্রাহক তাদের পছন্দের লোকাল (locale) সেট করে না।
- অপশন C: webhook payload-এ থাকা কারেন্সি ব্যবহার করা। এটি সম্পূর্ণ ফ্রি, ডাটাবেসে কোনো পরিবর্তনের প্রয়োজন হয় না এবং বিদ্যমান ব্যবহারকারীদের জন্য তাৎক্ষণিকভাবে কাজ করে।
আমরা অপশন 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') ব্যবহার করলে সাবজেক্টগুলো ISO-2022-JP-তে এনকোড হয়। আপনি যদি এই সেটিং ব্যবহার করে ইংরেজি সাবজেক্ট লাইন পাঠান, তবে Gmail এবং Outlook এটিকে অদ্ভুত এনকোডিং হিসেবে গণ্য করবে। এতে আপনার স্প্যাম স্কোর বেড়ে যায়।
সমাধান হলো ভাষার ওপর ভিত্তি করে এনকোডিং পরিবর্তন করা:
mb_language($lang === 'en' ? 'uni' : 'Japanese');
'uni' ব্যবহার করলে UTF-8 Base64 ব্যবহার করা হয়। এটি আপনার ইমেলগুলোকে স্প্যাম ফোল্ডার থেকে দূরে রাখে।
এই সমাধান থেকে তিনটি শিক্ষা:
- ইভেন্ট পেলোড (event payload) ব্যবহার করুন। যদি ডেটা ইতিমধ্যে webhook-এ থাকে, তবে ডাটাবেসে কোনো পরিবর্তন করবেন না। এটি ঝুঁকি এবং রক্ষণাবেক্ষণ কমায়।
- এনকোডিংয়ের দিকে খেয়াল রাখুন। আপনি যদি একাধিক ভাষা সমর্থন করেন, তবে স্প্যাম ফিল্টার এড়াতে নিশ্চিত করুন যে আপনার সাবজেক্ট লাইনের এনকোডিং কন্টেন্টের সাথে মিল রয়েছে।
- হার্ডকোডেড (hardcoded) ভ্যালুগুলো অডিট করুন। যখন আপনি আন্তর্জাতিক পর্যায়ে যাবেন, তখন পরীক্ষা করে দেখুন আপনার নোটিফিকেশন ফাংশনগুলোতে কোনো হার্ডকোডেড ল্যাঙ্গুয়েজ সেটিংস আছে কি না।
একটি স্টেটলেস (stateless) ডিজাইন আপনার সিস্টেমকে রক্ষণাবেক্ষণ করা সহজ এবং ভেঙে ফেলা কঠিন করে তোলে।
