بناء أنظمة الدفع متعددة البائعين (Multi-vendor Split Payments) باستخدام Laravel و Stripe
لو شغال على مشروع منصة تجارة إلكترونية (E-commerce Marketplace) أكيد جالك في وقت من الأوقات السؤال المرعب: إزاي أوزع الفلوس بين صاحب المنصة والبائع (Vendor) بشكل أوتوماتيكي ومن غير وجع دماغ؟ تخيل لو عندك 100 عملية بيع في اليوم، هتقعد تحول لكل بائع فلوسه يدوي؟ طبعاً ده مستحيل ومخاطرة كبيرة. النهاردة هنشرح إزاي تحل المشكلة دي باستخدام إطار العمل لارافيل (Laravel) وبوابة الدفع الشهيرة سترايب (Stripe).
Table of contents [Show]
ليه بنحتاج نظام تقسيم المدفوعات (Split Payments)؟
في الأنظمة التقليدية، الفلوس كلها بتدخل حسابك، وبعدين بتبدأ تحسب عمولتك وتحول الباقي للبائعين. الطريقة دي مش بس مرهقة، دي كمان بتخليك مسؤول ضريبياً وقانونياً عن كل قرش بيدخل حسابك. الحل الأفضل هو استخدام Stripe Connect، واللي بيسمحلك تعمل تقسيم للفلوس (Split Payments) لحظة ما العميل يدفع، بحيث عمولتك تروح حسابك، ونصيب البائع يروح حسابه بشكل مباشر.
الخطوة الأولى: إعداد Stripe Connect في Laravel
أول حاجة لازم تعملها هي ربط حسابات البائعين عندك بحساباتهم على سترايب. استخدم حزمة stripe/stripe-php. عشان تبدأ، لازم تنشئ حساب مستخدم (Connected Account) لكل بائع عندك:
$account = \Stripe\Account::create([
'type' => 'express',
'email' => '[email protected]',
]);
كده أنت أنشأت هوية للبائع على سترايب، تقدر تحفظ الـ id الخاص بيه في قاعدة بياناتك (Database) عشان تستخدمه في عمليات الدفع.
الخطوة الثانية: تنفيذ عملية الدفع المقسمة (Payment Intents)
هنا بيحصل السحر. لما العميل يشتري منتج، بنستخدم الـ PaymentIntent ونحدد الـ application_fee_amount، وهو ده نصيب المنصة بتاعك. الباقي هيروح تلقائياً للبائع:
$paymentIntent = \Stripe\PaymentIntent::create([
'amount' => 10000, // المبلغ الكلي بالسنت
'currency' => 'usd',
'transfer_data' => [
'destination' => 'acct_123456789', // ID حساب البائع
],
'application_fee_amount' => 1000, // عمولتك أنت (10%)
]);
في الكود ده، سترايب (Stripe) بياخد الـ 100 دولار، بيخصم منها الـ 10 دولار بتوعك، وبيبعت الـ 90 دولار لحساب البائع في لمح البصر.
الخطوة الثالثة: التعامل مع المرتجعات (Refunds)
ده الجزء اللي بيخوف أغلب المبرمجين. لما العميل يطلب استرجاع (Refund)، لازم تاخد بالك إنك لازم تعمل "رد" للمبلغ من حساب البائع برضه. لو عملت ريفند للمبلغ كله من حسابك بس، هتخسر عمولتك وهتلاقي حساب البائع لسه فيه فلوس مش بتاعته.
عشان تعمل ريفند صح، لازم تستخدم الـ refund_application_fee عشان سترايب يرجع عمولتك إنت كمان للعميل:
\Stripe\Refund::create([
'payment_intent' => 'pi_12345',
'refund_application_fee' => true,
'reverse_transfer' => true,
]);
نصيحة من أخ لمبرمج
التعامل مع الفلوس في الكود (Financial APIs) بيحتاج دقة عالية. نصيحتي ليك: دايماً استخدم الـ Webhooks عشان تتأكد إن العملية تمت بنجاح في قاعدة بياناتك بعد ما سترايب يبعتلك التأكيد. متعتمدش أبداً على استجابة الـ API في صفحة الدفع (Checkout) فقط، لأن النت ممكن يقطع أو العميل يقفل الصفحة. خلي نظامك مرن (Robust) وقوي بحيث يقدر يعالج فشل أي عملية في الخلفية.
اتعلم تقرأ الـ Documentation بتاع سترايب كويس جداً، لأنهم بيحدثوا الـ API باستمرار، ومتابعتك للتحديثات دي هي اللي هتفرق بين المبرمج الهاوي والمبرمج المحترف اللي بيعتمد عليه في بناء بيزنس حقيقي.