المدفوعات
كيف تستلم صفحة إتمام الشراء الدفع، وكيف تربط Stripe، وما الذي يحدث للطلب في كل خطوة.
لحزمة الحزمة الكاملة
كيف تستلم صفحة إتمام الشراء الدفع
يقدّم المتجر طريقتين للدفع: البطاقة عبر Stripe، والدفع عند الاستلام. لا يوجد خيار PayPal في صفحة إتمام الشراء. كلتاهما تنشئ الطلب في واجهة API أولًا، بسعر تحدده واجهة API من الكتالوج الخاص بها، لا من الأسعار التي يرسلها المتصفح أبدًا.
| الطريقة | ما يحدث للطلب |
|---|---|
| البطاقة (Stripe) | يُحفظ بالحالة pending وغير مدفوع. تطلب واجهة API من Stripe عملية دفع، ويؤكد المتجر البطاقة في الصفحة نفسها. عندما يُبلغ Stripe عن الدفع عبر webhook، يصبح الطلب paid وconfirmed؛ والبطاقة المرفوضة تجعله failed. |
| الدفع عند الاستلام | يُحفظ بالحالة confirmed وغير مدفوع فورًا. تحصّل المبلغ عند التسليم وتنقل الطلب إلى المرحلة التالية في لوحة الإدارة. |
الدفع عند الاستلام هو الخيار المحدد افتراضيًا. يستطيع الضيوف إتمام الشراء ببريدهم الإلكتروني؛ ويرى العملاء المسجّلون الطلب في حساباتهم.
الشحن مجاني ابتداءً من 75 دولارًا، ويكلّف 9.99 دولار لما دون ذلك، ولا توجد ضريبة. تطبّق السلة وملخص إتمام الشراء وواجهة API القاعدة نفسها، فيكون المبلغ الذي يراه المتسوّق هو المبلغ المحصَّل. يحفظ المتجر القاعدة في storefront/src/config/shipping.ts وواجهة API في back-end/src/modules/orders/orders.service.ts: غيّرهما معًا. يحصّل Stripe المبالغ بالدولار الأمريكي.
اربط Stripe
أضف مفاتيح API الخاصة بك
من صفحة مفاتيح API في لوحة تحكم Stripe، ضع المفتاح السري في
back-end/.env. استخدم مفاتيح الاختبار (sk_test_…) إلى أن تكون مستعدًا لاستلام أموال حقيقية.back-end/.envSTRIPE_SECRET_KEY=sk_test_…اشترك في webhook
في Stripe، أضف نقطة نهاية webhook على عنوان واجهة API الخاصة بك متبوعًا بـ
/api/payments/webhook، مشتركة فيpayment_intent.succeededوpayment_intent.payment_failed. انسخ سر التوقيع الخاص بها إلىback-end/.env.back-end/.envSTRIPE_WEBHOOK_SECRET=whsec_…أعطِ المتجر مفتاحه القابل للنشر
اضبط المفتاح القابل للنشر في ملف
.envالخاص بالمتجر، ثم أعد بنائه: المفتاح يُضمَّن أثناء البناء. ومع Docker Compose، ضعه في ملف.envبجوارdocker-compose.ymlوشغّلdocker compose up --build.storefront/.envNEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_…أعد تشغيل واجهة API
النتيجة المتوقعة: يكتب سجل واجهة API الرسالة "Stripe initialized"، وتعرض صفحة إتمام الشراء نموذج البطاقة.
الـ webhook هو ما يعلّم الطلب كمدفوع
يُعلَّم الطلب كمدفوع عندما يستدعي Stripe الـ webhook، لا عندما يعود المتسوّق من صفحة الدفع. من دون الاشتراك وسر التوقيع الخاص به، تبقى طلبات البطاقة معلّقة وغير مدفوعة.
لاختبار الـ webhook على جهازك، تستطيع أداة Stripe CLI تمرير الأحداث إلى http://localhost:8000/api/payments/webhook، وتطبع سر التوقيع الذي تستخدمه أثناء عملها.
من دون Stripe
- من دون
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY، أو مع أي قيمة ليست مفتاحًا حقيقيًاpk_test_…أوpk_live_…، يعرض خيار البطاقة في صفحة إتمام الشراء الرسالة «الدفع بالبطاقة غير متاح حالياً. يرجى اختيار الدفع عند الاستلام.» ويُخفي حقل البطاقة. - من دون
STRIPE_SECRET_KEY، أو مع القيمة المؤقتة الموجودة في.env.example، لا تقبل واجهة API أي دفع بالبطاقة: الطلب المُنشأ بطريقة البطاقة يُحفظ معلّقًا وغير مدفوع. - الدفع عند الاستلام يعمل في الحالتين.
- على المتجر النموذجي في المتجر، ومن دون أي واجهة API، تكتمل عملية إتمام الشراء دون الاتصال بـ Stripe ولا يُحصَّل أي مبلغ.
استلام مدفوعات حقيقية
- استبدل المفاتيح بالمفاتيح المباشرة (
sk_live_…وpk_live_…) وبـ webhook مُنشأ في الوضع المباشر، وله سر توقيع خاص به. - اضبط
NEXT_PUBLIC_DEMO_CHECKOUT=false، حتى لا تُملأ صفحة إتمام الشراء مسبقًا ببيانات مشترٍ مولَّد. - تُحصَّل الأسعار بالدولار الأمريكي. للبيع بعملة أخرى، غيّر العملة التي ترسلها واجهة API إلى Stripe في
back-end/src/modules/payments/payments.service.ts، واضبطNEXT_PUBLIC_ANALYTICS_CURRENCYبما يطابقها.