MAISON CODE .
/ Currency · Caching · Edge · Global · Architecture

متعدد العملات: الهندسة المعمارية للتجارة بلا حدود

كيفية تقديم 150 عملة دون كسر ذاكرة التخزين المؤقت لـ CDN الخاصة بك. دليل عميق للتدويل (i18n)، ورياضيات النقطة العائمة، وتوجيه الحافة.

AB
Alex B.
متعدد العملات: الهندسة المعمارية للتجارة بلا حدود

لم يعد البيع عالميًا إحدى ميزات “المؤسسات”. يمكن لطفل في مرآب في بروكلين بيع القمصان للمستخدمين في طوكيو. لكن عرض “السعر: 25.00 دولارًا” لمستخدم ياباني يمثل نقطة خلاف. عليهم أن يقوموا بالحسابات الذهنية (25 * 150 = ¥3750؟). في اللحظة التي تقدم فيها عملات متعددة، فإنك تقدم واحدة من أصعب المشكلات في هندسة الويب: التخزين المؤقت المراعي للسياق.

في Maison Code Paris، نقوم ببناء تصميمات عالمية أولى. نحن لا نعتبر العملة بمثابة تبديل لواجهة المستخدم؛ نحن نعتبره بُعدًا أساسيًا لحالة التطبيق، ويمكن القول إنه لا يقل أهمية عن عنوان URL نفسه.

لماذا تتحدث Maison Code عن هذا

في Maison Code Paris، نعمل كضمير معمari لعملائنا. غالبًا ما نرث حزمًا “حديثة” تم بناؤها دون فهم أساسي للحجم.

نناقش هذا الموضوع لأنه يمثل نقطة تحول حاسمة في النضج الهندسي. التنفيذ الصحيح يميز MVP الهش عن منصة مؤسسية مرنة يمكنها التعامل مع حركة مرور الجمعة السوداء.

مفارقة التخزين المؤقت

في تطبيق الويب القياسي، يقوم CDN (Cloudflare/Fastly) بتخزين HTML للصفحة الرئيسية مؤقتًا.

  1. يزور المستخدم “أ” (الولايات المتحدة الأمريكية) “example.com”.
  2. يعرض الخادم HTML: السعر: 100 دولار.
  3. يقوم CDN بتخزين HTML هذا مؤقتًا.
  4. يزور المستخدم “ب” (فرنسا) موقع “example.com” بعد دقيقة واحدة.
  5. يقدم CDN HTML المخزن مؤقتًا: السعر: 100 دولار.

هذه كارثة. يرى المستخدم ب الدولارات. يضيفون إلى سلة التسوق، وربما يتحول الخروج إلى اليورو لاحقًا، أو ربما يغادرون لأنهم لا يريدون دفع رسوم التحويل. لإصلاح ذلك، نحتاج إلى أن يعرف الخادم من الذي يطلب ذلك. ولكن إذا كان الخادم يعرف، فلا يمكن لشبكة CDN تقديم ملف ثابت فقط.

الإستراتيجية 1: المجلد الفرعي (المعيار الذهبي)

الحل الفني الأقوى هو جعل العملة واضحة في عنوان URL.

  • example.com/en-us -> يخدم الدولار الأمريكي.
  • example.com/fr-fr -> يخدم اليورو.
  • example.com/jp-jp -> يخدم الين الياباني.

** لماذا هذا الفوز **:

  1. ** كفاءة ذاكرة التخزين المؤقت **: /fr-fr هو عنوان URL فريد. يمكننا تخزينها بقوة على الحافة. يحصل كل مستخدم فرنسي على نتيجة لذاكرة التخزين المؤقت.
  2. SEO: يعرف Googlebot بالضبط العملة التي تتطابق مع المنطقة. يمكنك تعيين علامات “hreflang” بسهولة.
  3. الوضوح: يعرف المستخدم مكان وجوده.

التنفيذ في الريمكس/الهيدروجين:

// التطبيق/الطرق/($locale)._index.jsx
تصدير محمل دالة غير متزامنة ({طلب، سياق، معلمات }) {
  const { locale } = params; // "الاب-الاب"
  عملة ثابتة = getCurrencyFromLocale(locale); // "يورو"
  
  // قم بالتمرير إلى Shopify API
  منتجات ثابتة = انتظار context.storefront.query(PRODUCTS_QUERY, {
    المتغيرات: { البلد: getCountryCode(currency) }
  });
  
  إرجاع json({ المنتجات });
}

الإستراتيجية 2: رأس التغيير (الحل الديناميكي)

إذا يجب عليك الحفاظ على عنوان URL نظيفًا (example.com للجميع)، فيجب عليك توجيه CDN للتخزين المؤقت لإصدارات متعددة من نفس عنوان URL. نحن نستخدم رأس “Vary”.

تختلف: CF-IPCountry

هذا يخبر Cloudflare: “الرجاء تخزين نسخة منفصلة من هذه الصفحة لكل رمز بلد فريد.”

  • المستخدم (الولايات المتحدة) -> يبحث CDN عن “الصفحة الرئيسية + الولايات المتحدة”. Miss.جلب من الخادم. مخابئ.
  • المستخدم (بالفرنسية) -> يبحث CDN عن “الصفحة الرئيسية + FR”. Miss.جلب من الخادم. مخابئ.
  • المستخدم (الولايات المتحدة) -> يبحث CDN عن “الصفحة الرئيسية + الولايات المتحدة”. يضرب.

الجانب السلبي: تجزئة ذاكرة التخزين المؤقت. إذا كنت تدعم 200 دولة، فإنك تقوم بتقسيم نسبة نتائج ذاكرة التخزين المؤقت بشكل فعال على 200. ويتحمل خادمك الأصلي المزيد من التحميل.

الإستراتيجية 3: الرسم من جانب العميل (الهجين)

بالنسبة إلى الصفحات عالية الأداء والمخزنة مؤقتًا بشكل صارم، نقوم أحيانًا بتخزين الهيكل العظمي العام مؤقتًا. لا يحتوي HTML الذي تم إرجاعه على أي سعر أو عنصر نائب. بعد ذلك، يقوم useEffect على العميل بجلب السعر المحلي.

سعر الدالة({baseAmount }) {
  const { العملة، السعر } = useCurrencyContext();
  
  if (!rate) return <Skeleton />;
  
  إرجاع <span>{formatMoney(baseAmount *rate,currency)</span>;
}

تحذير: يؤدي هذا إلى إزاحة التخطيط (CLS) و”وميض محتوى غير مسعر”. إنه شعور رخيص. استخدم فقط كملاذ أخير.

هندسة أسواق Shopify

في نظام Shopify البيئي، نستخدم Contextual Storefront API. أنت لا تحسب أسعار الصرف بنفسك. أنت تسمح للواجهة الخلفية لـ Shopify بالتعامل معها. لماذا؟ لأن Shopify يسمح للتجار بتعيين أسعار الصرف الثابتة أو تعديلات الأسعار لكل سوق. ربما يكون سعر القميص 20 دولارًا في الولايات المتحدة، ولكن 25 يورو في أوروبا (لتغطية ضريبة القيمة المضافة والشحن)، وليس مجرد تحويل مباشر بقيمة 20 دولارًا * 0.92.

# التوجيه السحري: @inContext
استعلام GetProduct($handle: String!, $country: CountryCode!) 
  @inContext(البلد: $country) {
  المنتج (المقبض: مقبض $) {
    نطاق السعر {
      الحد الأدنى للسعر {
        المبلغ
        currencyCode # يُرجع العملة المحلية تلقائيًا
      }
    }
  }
}

من خلال تمرير رمز البلد، نقوم بتفريغ تعقيد منطق التسعير إلى محرك المنصة.

الرياضيات المالية: كوابيس النقطة العائمة

لا تستخدم أبدًا أرقام JavaScript القياسية مقابل المال. 0.1 + 0.2 === 0.30000000000000004

إذا كنت تقوم ببناء عربة مخصصة، فسوف تخسر سنتًا عند كل طلب عاشر. أكثر من مليون طلب، أي 10000 دولار مفقودة بسبب أخطاء الفاصلة العائمة. القاعدة: قم بتخزين الأموال في السنت (الأعداد الصحيحة).

  • 10.00 دولار -> 1000
  • 19.99 يورو -> 1999

استخدم مكتبات مثل Dinero.js أو Currency.js لجميع العمليات الحسابية من جانب العميل.

استيراد Dinero من "dinero.js"؛

السعر الثابت = Dinero({ المبلغ: 5000، العملة: 'EUR' }); // 50.00 يورو
ضريبة ثابتة = السعر. النسبة المئوية (20)؛ // ضريبة القيمة المضافة
إجمالي التكلفة = السعر. إضافة (ضريبة)؛

التسعير النفسي والتقريب

التحويل الخوارزمي قبيح.

  • 100.00 دولار * 0.92 = 92.00 يورو.
  • لكن مبلغ 92.00 يورو يبدو “عشوائيًا”.
  • من المحتمل أن يكون السعر النفسي 95.00 يورو أو 89.00 يورو.

نقوم بتنفيذ استراتيجيات التقريب على طبقة التطبيق (إذا لم تتم معالجتها بواسطة الواجهة الخلفية).

وظيفة roundToCharmPrice (الكمية: الرقم): الرقم {
    // 92.34 -> 95.00
    // 98.10 -> 99.00
    const HeavyPart = Math.floor(amount);
    const lastDigit = HeavyPart % 10;
    
    إذا قام (lastDigit < 5) بإرجاع الجزء الثقيل - lastDigit + 5؛ // التقريب إلى 5
    إرجاع الجزء الثقيل - lastDigit + 9؛ // التقريب إلى 9
}

ملاحظة: عادةً، ننصح العملاء بتعيين هذه العناصر بشكل صريح في Shopify Markets، ولكن وجود منطق احتياطي مفيد للتجميع الديناميكي.

تحسين محركات البحث: البيانات الوصفية للمال

يفشل Google في فهرسة أسعارك إذا كانت ديناميكية (يتم حقنها باستخدام JS). إذا كنت تستخدم الإستراتيجية 1 (المجلدات الفرعية)، فإن البيانات المنظمة القياسية JSON-LD تعمل بشكل مثالي.

<script type="application/ld+json">
{
  "@context": "https://schema.org/"،
  "@النوع": "المنتج"،
  "الاسم": "ساعة فاخرة"،
  "العروض": {
    "@type": "عرض"،
    "priceCurrency": "EUR"،
    "السعر": "5000.00"
  }
}
</script>

تأكد من تطابق هذه الكتلة مع المحتوى المرئي. إذا كان JSON-LD يشير إلى EUR وكان النص المرئي يشير إلى USD (بسبب التبديل من جانب العميل)، فسيقوم Google Merchant Center بحظر حسابك بسبب “عدم تطابق السعر”.

13. مخاطر استرداد العملة

يشتري المستخدم بمبلغ 100 يورو (110 دولارات). الاسبوع القادم سينهار الدولار 100 يورو أصبحت الآن 120 دولارًا. طلبات المستخدم استرداد. هل تسترد 100 يورو (العميل سعيد، تخسر 10 دولارات)؟ أو هل يمكنك استرداد 110 دولارات تم تحويلها إلى يورو (92 يورو) (العميل غاضب)؟ الإجابة القانونية: استرداد مبلغ العملة الأصلية (100 يورو). الإجابة المالية: أنت تتحمل مخاطر العملات الأجنبية. نحن نبني منطق “احتياطيات الاسترداد” في دفتر الأستاذ لمراعاة هذا التقلب باعتباره “COGS - خسارة العملات الأجنبية”.

14. التحوط وإدارة الخزانة

إذا قمت ببيع مبلغ 10 ملايين دولار باليورو، فأنت تمتلك الكثير من اليورو. إذا انهار اليورو، فإنك تخسر المال قبل أن تتمكن من الدفع لمصنعك الأمريكي. هذا هو المكان الذي يأتي فيه التحوط الآلي. نحن نتكامل مع Wise Business API أو Airwallex. عندما يكون الرصيد > 10,000 يورو، يتم التحويل تلقائيًا إلى الدولار الأمريكي. تعمل استراتيجية “التحوط الجزئي” هذه على تقليل التعرض لأحداث الاقتصاد الكلي.

15. رفض بوابة الدفع (عدم تطابق العملة)

يسمح لك Stripe بالشحن بأي عملة. لكن بعض البنوك المحلية (على سبيل المثال، في البرازيل أو الهند) ترفض المعاملات “بالعملة الأجنبية” حتى لو كانت البطاقة تدعمها. الإصلاح: عمليات إعادة المحاولة الذكية. إذا فشلت عملية تحصيل الرسوم باستخدام do_not_honor، فأعد المحاولة فورًا باستخدام عملة إصدار البطاقة (إذا كان من الممكن اكتشافها عبر BIN). “لقد حاولت تحصيل 100 دولار. فشلت. أعد محاولة تحصيل 92 يورو. نجحت.” يؤدي هذا إلى تحسين معدلات الترخيص بنسبة 4%.

16. الدفع عند التسليم (COD) والعملة

في الشرق الأوسط (دول مجلس التعاون الخليجي)، 60% من الطلبات هي COD. الساعي يجمع النقدية. البريد السريع لا يقبل الدولار الأمريكي. إنهم يقبلون فقط AED/SAR. إذا قمت بعرض الدولار الأمريكي عند الخروج، فسوف يصل حامل البريد ويطلب مبلغًا مختلفًا (سعر الصرف في اليوم). القاعدة: إذا تم تحديد الدفع عند الاستلام، يجب عليك تثبيت السعر بالعملة المحلية عند الخروج وطباعته على البيان المادي. يؤدي التناقض هنا إلى “رفض التسليم”.

17. الاستنتاج

العملات المتعددة ليست “مكونًا إضافيًا”. إنه قرار معماري أساسي يتعلق بالتوجيه والتخزين المؤقت وتصميم قاعدة البيانات وتحسين محركات البحث. في Maison Code، نؤمن بأن التجارة بلا حدود الحقيقية غير مرئية. يصل المستخدم ويرى عملته ويدفع بالطريقة المحلية ويستلم البضائع. التعقيد هو عبئنا، وليس عبئهم.


هل ستتجه نحو العالمية؟

إذا كنت تواجه صعوبة في التعامل مع رؤوس Vary أو ذاكرات التخزين المؤقت المعطلة. قم بتوظيف مهندسينا.