كيف تربط نظامك بالبنوك السعودية: متطلبات السيرفر

ربط مع مدى أو SADAD أو بنوك سعودية يتطلب سيرفر سعودي + IP ثابت + شهادات أمان محددة.
متطلبات التكامل مع البنوك السعودية
التكامل مع بوابات الدفع والأنظمة المصرفية السعودية يتطلب استيفاء متطلبات تقنية وأمنية صارمة. هذه المتطلبات ليست اختيارية — الإخفاق في استيفائها يعني رفض الطلب أو قطع الخدمة.
هذا الدليل يغطي متطلبات التكامل مع بوابات الدفع السعودية الرئيسية: مدى، نون بيمنتس، وموبايلي بيمنتس.
القاعدة الذهبية: السيرفر السعودي إلزامي
بنك ساما (البنك المركزي السعودي) يشترط أن تُعالَج البيانات المالية للمستخدمين السعوديين على سيرفرات داخل المملكة. هذا متطلب تنظيمي ليس للتفاوض.
البنوك وبوابات الدفع تفحص:
- عنوان IP المقدم في طلب التكامل
- ASN (Autonomous System Number) — يجب أن يكون سعودياً
- شهادة SSL وجهة إصدارها
- آلية تخزين بيانات المعاملات
متطلبات مدى (mada)
المتطلبات التقنية
# 1. SSL/TLS
# - TLS 1.2 كحد أدنى
# - شهادة من CA معترف بها دولياً
# - HSTS مُفعّل
# 2. PCI-DSS Compliance
# - لا تخزين بيانات البطاقة أبداً
# - استخدام Tokenization فقط
# - سجل تدقيق كامل
# 3. متطلبات الشبكة
# IP سعودي ثابت مسجل في طلب التكامل
إعداد nginx لمتطلبات مدى
# /etc/nginx/conf.d/payment-security.conf
server {
# TLS صارم
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
# Headers الأمان
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'none'" always;
# منع تخزين بيانات الدفع في cache
location /checkout {
add_header Cache-Control "no-store, no-cache, must-revalidate" always;
add_header Pragma "no-cache" always;
}
}
متطلبات نون بيمنتس (Noon Payments)
# التسجيل يتطلب:
# - سجل تجاري سعودي ساري
# - IBAN سعودي للتحويلات
# - IP سيرفر سعودي ثابت
# - Domain مرتبط بالنشاط التجاري
# - SSL صالح (ليس self-signed)
// config/noon.php
return [
'business_id' => env('NOON_BUSINESS_ID'),
'app_name' => env('NOON_APP_NAME'),
'app_key' => env('NOON_APP_KEY'),
'mode' => env('NOON_MODE', 'test'),
'base_url' => env('NOON_MODE') === 'live'
? 'https://api.noonpayments.com/payment/v1'
: 'https://api-stg.noonpayments.com/payment/v1',
];
// app/Services/NoonPaymentService.php
class NoonPaymentService
{
public function initiateOrder(Invoice $invoice): array
{
$authHeader = base64_encode(
sprintf('Key_%s:%s:%s',
config('noon.business_id'),
config('noon.app_name'),
config('noon.app_key')
)
);
$response = Http::withHeaders([
'Authorization' => "Basic {$authHeader}",
'Content-Type' => 'application/json',
])->post(config('noon.base_url') . '/order', [
'apiOperation' => 'INITIATE',
'order' => [
'reference' => (string) $invoice->id,
'amount' => $invoice->total / 100, // من هللة إلى ريال
'currency' => 'SAR',
'name' => "Invoice #{$invoice->id}",
'channel' => 'Web',
'category' => 'webstore',
'description' => "Cloud hosting invoice",
],
'configuration' => [
'returnUrl' => route('portal.payment.callback'),
'locale' => 'ar',
'paymentAction' => 'SALE',
'styleProfile' => 'default',
],
]);
if ($response->failed) {
throw new PaymentException($response->body);
}
return $response->json;
}
}
متطلبات موبايلي بيمنتس والبوابات الأخرى
// متطلبات مشتركة لجميع بوابات الدفع السعودية
$requirements = [
'server_location' => 'Saudi Arabia', // إلزامي
'dedicated_ip' => true, // موصى به بشدة
'ssl_valid' => true, // إلزامي
'tls_version' => '1.2+', // إلزامي
'pci_compliance' => true, // إلزامي للبطاقات
'audit_logs' => true, // إلزامي
'data_residency' => 'Saudi Arabia', // إلزامي (SAMA)
];
إعداد قاعدة البيانات لمتطلبات PCI-DSS
// Migration: لا تخزن بيانات البطاقة
Schema::create('payments', function (Blueprint $table) {
$table->id;
$table->foreignId('invoice_id');
$table->string('gateway_order_id'); // معرف من بوابة الدفع
$table->string('gateway_reference'); // مرجع البوابة
$table->string('token')->nullable; // token آمن - ليس رقم البطاقة
$table->decimal('amount', 10, 2);
$table->string('currency', 3)->default('SAR');
$table->string('status');
$table->string('payment_method')->nullable; // mada, visa, applepay
// لا يوجد: card_number, cvv, expiry_date
$table->timestamps;
});
// التحقق من الدفع بعد العودة من بوابة الدفع
public function callback(Request $request): RedirectResponse
{
$orderId = $request->input('orderId');
$response = $this->payment->getOrder($orderId);
$payment = Payment::where('gateway_order_id', $orderId)->firstOrFail;
if ($response['result']['resultCode'] === '0') {
$payment->update(['status' => 'completed']);
$payment->invoice->markAsPaid;
Log::channel('payments')->info('Payment completed', [
'invoice_id' => $payment->invoice_id,
'gateway' => 'noon',
'amount' => $payment->amount,
'timestamp' => now->toISOString,
]);
}
return redirect->route('portal.invoices.show', $payment->invoice_id);
}
متطلبات التدقيق والسجلات
# كل معاملة مالية يجب توثيقها
# متطلب SAMA: الاحتفاظ بسجلات 5 سنوات
# nginx: سجل خاص للمدفوعات
log_format payment_log '$time_iso8601 $remote_addr '
'"$request" $status $body_bytes_sent '
'$request_id $request_time';
access_log /var/log/nginx/payments.log payment_log;
# حماية سجلات الدفع
chmod 640 /var/log/nginx/payments.log
chown www-data:adm /var/log/nginx/payments.log
الامتثال مع SAMA
متطلبات البنك المركزي السعودي (SAMA):
- البيانات المالية تُخزَّن في السعودية
- نسخ احتياطي يومي مشفر
- سجلات معاملات لمدة 5 سنوات
- encryption للبيانات في الراحة وفي النقل
- مراجعة أمنية سنوية (للتكاملات الكبيرة)
# تشفير قاعدة البيانات (MySQL)
# في my.cnf
[mysqld]
innodb_encrypt_tables = ON
innodb_encrypt_log = ON
innodb_encryption_rotate_key_age = 1
على سيرفرات كلاود
كلاود (cloud.net.sa) في الرياض وجدة يستوفي جميع متطلبات SAMA:
- بيانات تُخزَّن داخل المملكة
- IP سعودي ثابت (400 ريال/سنة)
- Uptime 99.99% بالعقد
- نسخ احتياطي يومي متضمن في جميع الخطط
مع توافر Dedicated IP وSLA موثق بالعقد، يمكنك التقدم لاعتماد بوابات الدفع بثقة.
خلاصة
التكامل مع البنوك السعودية يتطلب جدية في الامتثال. السيرفر السعودي، IP ثابت، HTTPS صارم، وسجلات محكمة — هذه ليست تفاصيل تقنية بل متطلبات تنظيمية. افعل الأمور بالطريقة الصحيحة من البداية وستتجنب إعادة العمل لاحقاً.


