المدفوعات

نقاط النهاية لمعالجة المدفوعات باستخدام Stripe.

تكامل Stripe

يستخدم SalonBookIt Stripe لمعالجة المدفوعات. يتعامل الويدجت مع كل التدفق تلقائياً. هذه النقاط النهائية للتكاملات المخصصة.

POST /api/v1/pagos/intent/

يُنشئ PaymentIntent من Stripe لمعالجة دفعة.

معلمات الجسم

المعامل النوع مطلوب الوصف
cliente_id integer نعم معرف العميل
amount integer نعم المبلغ بالسنتات (مثال: 2500 = 25.00€)
type string نعم booking, order أو points
reference_id integer نعم معرف الحجز أو الطلب أو حزمة النقاط

مثال على الطلب

cURL
curl -X POST "https://app.salonbookit.com/api/v1/pagos/intent/" \
  -H "X-API-Key: hh_pub_live_abc123..." \
  -H "Authorization: Bearer eyJhbG..." \
  -H "Content-Type: application/json" \
  -d '{
    "cliente_id": 456,
    "amount": 2500,
    "type": "booking",
    "reference_id": 12345
  }'

الاستجابة (200 OK)

JSON
{
    "success": true,
    "data": {
        "client_secret": "pi_3N...secret_abc123",
        "payment_intent_id": "pi_3N...",
        "amount": 2500,
        "currency": "eur",
        "stripe_publishable_key": "pk_live_...",
        "customer_id": "cus_abc123"
    }
}

الاستخدام في الواجهة الأمامية

استخدم client_secret مع Stripe.js لإكمال الدفع:

JavaScript
// تهيئة Stripe
const stripe = Stripe('pk_live_...');
const elements = stripe.elements({
    clientSecret: response.data.client_secret
});

// إنشاء عنصر البطاقة
const cardElement = elements.create('card');
cardElement.mount('#card-element');

// تأكيد الدفع
const { error, paymentIntent } = await stripe.confirmCardPayment(
    response.data.client_secret,
    {
        payment_method: {
            card: cardElement,
            billing_details: {
                name: 'Juan Pérez',
                email: 'juan@email.com'
            }
        }
    }
);

if (error) {
    console.error('Error:', error.message);
} else if (paymentIntent.status === 'succeeded') {
    // دفع ناجح
    console.log('تم الدفع:', paymentIntent.id);
}
POST /api/v1/pagos/confirmar/

يؤكد الدفع بعد أن يعالجه Stripe.

معلمات الجسم

المعامل النوع الوصف
payment_intent_id string معرف PaymentIntent من Stripe

الاستجابة (200 OK)

JSON
{
    "success": true,
    "data": {
        "pago_id": 789,
        "estado": "completado",
        "monto": 25.00,
        "moneda": "EUR",
        "reserva_actualizada": true,
        "puntos_otorgados": 25,
        "recibo_url": "https://pay.stripe.com/receipts/..."
    }
}

Webhook الخاص بـ Stripe

يستقبل SalonBookIt webhooks من Stripe تلقائياً على:

POST https://app.salonbookit.com/api/v1/webhooks/stripe/

الأحداث المعالجة:

حدث Stripe الإجراء
payment_intent.succeeded يُعلّم الدفع كمكتمل، يحدّث الحجز
payment_intent.payment_failed يُعلّم الدفع كفاشل، يُبلغ العميل
charge.refunded يسجل الاسترداد
charge.dispute.created يُبلغ النشاط التجاري بالنزاع
لا تحتاج لتكوين أي شيء

يتم تكوين webhook الخاص بـ Stripe تلقائياً عند ربط حساب Stripe في لوحة التحكم.

أخطاء الدفع

الرمز HTTP الوصف
STRIPE_NOT_CONFIGURED 400 النشاط التجاري ليس لديه Stripe مُعدّ
INVALID_AMOUNT 400 مبلغ غير صالح (يجب أن يكون موجباً)
BOOKING_ALREADY_PAID 400 تم دفع الحجز بالفعل
PAYMENT_FAILED 400 خطأ في معالجة الدفع (راجع رسالة Stripe)
CARD_DECLINED 400 البطاقة مرفوضة

العملات المدعومة

الرمز العملة الرمز
EUR Euro
USD الدولار الأمريكي $
GBP الجنيه الإسترليني £
AED الدرهم الإماراتي د.إ