
كيف تربط جهاز الكاشير بزاتكا في المرحلة الثانية
دليل تقني شامل لربط جهاز الكاشير بمنصة فاتورة في المرحلة الثانية: 8 خطوات، APIs، التوقيع ECDSA، TLV QR، والأخطاء الشائعة.
ربط الكاشير بزاتكا في المرحلة الثانية يعني ثماني خطوات فنية دقيقة تبدأ من طلب رمز OTP من منصة فاتورة وتنتهي بإصدار شهادة الإنتاج (Production CSID)، ثم إرسال كل فاتورة إلى واحد من نموذجَين: المشاركة (Clearance) لفواتير B2B أو الإبلاغ (Reporting) لفواتير B2C.
أي خطوة ناقصة – سواء تزامن ساعة الجهاز أو ترميز حقل واحد من CSR – تُعيد المنشأة إلى نقطة الصفر وتفتح باب غرامات المادة 45 التي قد تبلغ 50,000 ريال لكل واقعة.
في هذا الدليل نشرح المرحلة الثانية (الربط والتكامل) بلغة عربية فصحى واضحة للمطوِّرين وأصحاب الأعمال على السواء، ونقدِّم تدفق الاستبدال مع منصة فاتورة، ونعرض مسارات APIs الفعلية، ونوضِّح متطلبات التوقيع ECDSA secp256k1 وبنية UBL 2.1 XML، وحقول محتوى TLV QR المُشفَّر بـBase64، ثم نضع أكثر الأخطاء شيوعاً وحلولها العملية.
ما هي المرحلة الثانية في الفوترة الإلكترونية؟
انطلقت المرحلة الثانية – الربط والتكامل (Integration Phase) رسمياً في 1 يناير 2023 على موجات متدرجة. بخلاف المرحلة الأولى التي اقتصرت على إصدار الفاتورة إلكترونياً بصيغة مقروءة وحفظ رمز QR، تفرض المرحلة الثانية ربطاً تقنياً مباشراً بين نظام المنشأة (EGS – Electronic Generation Solution) ومنصة فاتورة (fatoora.zatca.gov.sa). كل فاتورة يجب أن:
- تُصاغ بصيغة UBL 2.1 XML وفق معيار زاتكا (vTrack).
- تُحفظ في ملف PDF/A-3 يتضمن XML مضمَّناً.
- تُوقَّع رقمياً بخوارزمية ECDSA على منحنى secp256k1 مع تجزئة SHA-256.
- تحمل رمز QR بترميز TLV يتكوّن من 9 حقول مُشفَّرة Base64.
- تُرسَل إلى منصة فاتورة بحسب نوعها: المشاركة للفاتورة الضريبية (B2B) أو الإبلاغ للفاتورة الضريبية المبسطة (B2C).
حتى نهاية 2025 وصلت زاتكا إلى الموجة 22 (حد إيرادات 1 مليون ريال)، والآن في 2026 تعلن الموجتان 23 (750 ألف ريال – 31 مارس 2026) و24 (375 ألف ريال – 30 يونيو 2026).
نموذج المشاركة ونموذج الإبلاغ: الفرق الجوهري
| العنصر | نموذج المشاركة (Clearance) | نموذج الإبلاغ (Reporting) |
|---|---|---|
| ينطبق على | الفواتير الضريبية (B2B) وإشعاراتها | الفواتير المبسطة (B2C) وإشعاراتها |
| التوقيت | قبل تسليم الفاتورة للمشتري | خلال 24 ساعة بعد الإصدار |
| مَن يولِّد QR | زاتكا تدرج QR النهائي بعد الاعتماد | جهاز المنشأة يولِّده (9 حقول) |
| نقطة النهاية | /invoices/clearance/single |
/invoices/reporting/single |
| حقل الاستجابة الرئيس | clearanceStatus + clearedInvoice |
reportingStatus |
| تصرُّف البائع عند الرفض | لا يسلّم الفاتورة للمشتري | يصحِّحها عبر إشعار دائن/مدين |
الخطوات الثماني لتأهيل جهاز الكاشير على منصة فاتورة
الخطوة 1: الدخول إلى منصة فاتورة
افتح fatoora.zatca.gov.sa وسجِّل الدخول ببيانات بوابة ERAD للمنشأة. هذه البوابة هي نفسها بوابة الزكاة والضريبة المعتمدة، وليست بوابة المطوِّرين.
الخطوة 2: طلب رمز OTP
في قائمة «تسجيل وحدة حل جديد» اختر «توليد OTP». يُولَّد رمزاً بعدد الأجهزة المراد ربطها. كل رمز صالح ساعة واحدة فقط من لحظة توليده، ومُخطَّط عمليات CSR وطلب الشهادة تتمّ داخل هذه النافذة.
الخطوة 3: توليد CSR على الجهاز
يجب أن يُنشئ جهاز الكاشير طلب توقيع شهادة (CSR) محلياً بصيغة PKCS#10، ومُوقَّعاً بمفتاح ECDSA جديد على منحنى secp256k1. الحقول الإلزامية:
C: رمز الدولة، دائماً SA.O: الاسم القانوني للمنشأة.OU: اسم الفرع، أو الرقم الضريبي لعضو المجموعة الضريبية إذا كان الحساب لمجموعة.CN: اسم عام فريد لكل جهاز، مثلABC-3111111119-311111111100003.UID: الرقم الضريبي (15 رقماً يبدأ وينتهي بـ3).title: نواع ثنائي يحدد أنواع الفواتير (1000قياسية،0100مبسطة،1100كلاهما).subjectAltNameيحتوي علىSN=1-{اسم الحل}|2-{الطراز}|3-{UUID}.registeredAddressوbusinessCategory.- امتداد
certificateTemplateName=ASN1:PRINTABLESTRING:ZATCA-Code-Signingللإنتاج، أوPREZATCA-Code-Signingلبيئة المحاكاة. keyUsage=digitalSignature, nonRepudiation, keyEncipherment.
بأوامر OpenSSL يمكن توليد المفتاح و CSR كالتالي:
openssl ecparam -name secp256k1 -genkey -noout -out privatekey.pem
openssl req -new -sha256 -key privatekey.pem \
-extensions v3_req -config cert.cnf -out generatedCSR.csr
echo -n `cat generatedCSR.csr` | openssl enc -base64 -a -A > csr_b64.txt
الخطوة 4: طلب شهادة الامتثال (Compliance CSID)
يرسل الجهاز CSR المُشفَّر Base64 في جسم الطلب مع رمز OTP في ترويسة OTP إلى نقطة النهاية:
POST https://gw-fatoora.zatca.gov.sa/e-invoicing/core/compliance
Accept-Version: V2
OTP: 123456
Content-Type: application/json
تعيد زاتكا شهادة الامتثال (CCSID) في نوع X.509 بصيغة Base64، بالإضافة إلى سر (secret) يستخدم لمصادقة HTTP Basic في النداءات التالية.
الخطوة 5: اجتياز اختبارات الامتثال بفواتير عينة
قبل السماح بالإنتاج، تطلب زاتكا تقديم عمليات موقَّعة من كل نوع فاتورة أعلنته في title:
title=1000– 3 عمليات: فاتورة قياسية (388)، إشعار دائن (381)، إشعار مدين (383).title=0100– 3 عمليات مبسطة.title=1100– 6 عمليات (النوعان معاً).
ترسل العمليات إلى:
POST https://gw-fatoora.zatca.gov.sa/e-invoicing/core/compliance/invoices
Authorization: Basic base64(CCSID:secret)
الخطوة 6: طلب شهادة الإنتاج (Production CSID)
بعد نجاح كل العمليات، يطلب الجهاز شهادة الإنتاج الحقيقية:
POST https://gw-fatoora.zatca.gov.sa/e-invoicing/core/production/csids
Body: {"compliance_request_id": "…"}
Authorization: Basic base64(CCSID:secret)
تعيد زاتكا Production CSID من هيئة الشهادات التقنية (Technical CA) مع سر إنتاج جديد. صلاحية الشهادة عادة سنة واحدة، وتُجدَّد قبل انتهائها عبر PATCH على نفس النقطة بـ CSR جديد ورمز OTP جديد.
الخطوة 7: إصدار الفواتير في الإنتاج
كل فاتورة جديدة تُمرّ بهذه المراحل داخل الجهاز:
- بناء XML وفق UBL 2.1 مع
ProfileID = reporting:1.0. - تنفيذ Canonicalization (C14N) ثم تجزئة SHA-256 → Base64 لإنتاج
InvoiceHash. - تطبيق توقيع رقمي XAdES-B-B enveloped بخوارزمية ECDSA/SHA-256 باستخدام مفتاح PCSID.
- حساب PIH = تجزئة الفاتورة السابقة وإدراجها في
cac:AdditionalDocumentReferenceبمعرِّفPIH. - بناء QR بـ9 حقول TLV وتشفيرها Base64.
-
إرسال الفاتورة إلى نقطة النهاية المناسبة:
- فاتورة B2C:
POST /e-invoicing/core/invoices/reporting/single - فاتورة B2B:
POST /e-invoicing/core/invoices/clearance/singleمع ترويسةClearance-Status: 1.
- فاتورة B2C:
الخطوة 8: الأرشفة وتجديد الشهادة
يلتزم النظام بحفظ كل XML صادر مع استجابة زاتكا لمدة 6 سنوات (15 سنة للفواتير المرتبطة بالعقارات)، وتخزين سلسلة التجزئة محلياً لضمان صحة كل PIH جديد. قبل انتهاء Production CSID بأسبوعين على الأقل، أعد تنفيذ الخطوات 2 و3 و6 لتحديث الشهادة.
نقاط النهاية الرسمية لمنصة فاتورة
| الغرض | المسار الكامل |
|---|---|
| شهادة الامتثال | https://gw-fatoora.zatca.gov.sa/e-invoicing/core/compliance |
| فواتير الامتثال | https://gw-fatoora.zatca.gov.sa/e-invoicing/core/compliance/invoices |
| شهادة الإنتاج | https://gw-fatoora.zatca.gov.sa/e-invoicing/core/production/csids |
| الإبلاغ (B2C) | https://gw-fatoora.zatca.gov.sa/e-invoicing/core/invoices/reporting/single |
| المشاركة (B2B) | https://gw-fatoora.zatca.gov.sa/e-invoicing/core/invoices/clearance/single |
🔎 ملاحظة مهمة: بيئة المحاكاة (Simulation) تستعمل نفس الهيكل مع مقطع
/simulation/بدل/core/، وSandbox المطوِّرين يستعمل/developer-portal/. تأكَّد من استخدام قالب الشهادة الصحيح لكل بيئة (ZATCA-،PREZATCA-، أوTSTZATCA-).
متطلبات التوقيع الرقمي
| العنصر | المواصفة |
|---|---|
| المنحنى الإهليلجي | secp256k1 (256 بت) |
| خوارزمية التجزئة | SHA-256 |
| التوقيع | ECDSA مع ترميز DER |
| نوع الشهادة | X.509 v3 |
| توقيع XML | XAdES-B-B مغلَّف (enveloped) |
| توقيع PDF | PAdES-B-B مغلَّف |
| ترويسة المصادقة | Basic base64(binarySecurityToken:secret) |
بنية UBL 2.1 XML المختصرة
كل فاتورة تبدأ بعنصر الجذر <Invoice> مع فضاءات الأسماء cac/cbc/ext، وتحتوي على العناصر الإلزامية التالية:
cbc:ProfileIDدائماًreporting:1.0.cbc:ID،cbc:UUID،cbc:IssueDate،cbc:IssueTime.cbc:InvoiceTypeCode name="0100000|0200000"مع القيمة 388/381/383.cbc:DocumentCurrencyCode = SAR، وcbc:TaxCurrencyCode = SAR.cac:AdditionalDocumentReferenceبمعرِّفات ICV و PIH (و QR للمبسطة).cac:AccountingSupplierPartyوcac:AccountingCustomerParty.cac:InvoiceLineلكل بند مع TaxTotal وPrice.cac:TaxTotalالإجمالي +cac:LegalMonetaryTotal.ext:UBLExtensionsلاحتضان توقيع XAdES معKeyInfo/X509DataوخصائصQualifyingProperties.
بنية QR code بترميز TLV (9 حقول في المرحلة 2)
كل حقل يُكتَب بالشكل [Tag:1 byte][Length:1 byte][Value]، ثم تُدمج البايتات وتُشفَّر Base64:
| Tag | الحقل | القيمة |
|---|---|---|
| 1 | اسم البائع | نص UTF-8 بالعربية |
| 2 | الرقم الضريبي | 15 رقماً |
| 3 | الطابع الزمني | ISO 8601 Zulu مثل 2026-04-17T14:30:00Z |
| 4 | الإجمالي شامل الضريبة | عدد عشري بمنزلتين |
| 5 | مبلغ ضريبة القيمة المضافة | عدد عشري بمنزلتين |
| 6 | تجزئة XML للفاتورة | Base64 SHA-256 |
| 7 | توقيع ECDSA | DER مشفَّر Base64 |
| 8 | المفتاح العام ECDSA | SubjectPublicKeyInfo |
| 9 | ختم زاتكا | توقيع CA — للفواتير المبسطة فقط |
الطول الأقصى لنص الناتج 700 حرف كحد أعلى.
سلسلة التجزئة PIH: كيف تضمن عدم التلاعب
القاعدة: PIH_N = Base64( SHA-256( Canonical XML(N-1) ) ) – مع استبعاد UBLExtensions وAdditionalDocumentReference[ID='QR'] وأي Signature سابق من الحساب. أول فاتورة تستعمل البذرة الثابتة:
NWZlY2ViNjZmZmM4NmYzOGQ5NTI3ODZjNmQ2OTZjNzljMmRiYzIzOWRkNGU5MWI0NjcyOWQ3M2EyN2ZiNTdlOQ==
أي فاتورة ترفَض أيضاً تحتفظ بموقعها في السلسلة: PIH التالي = تجزئة الفاتورة المرفوضة، لا المقبولة قبلها. ولكن عدّاد ICV لا تُستعمل مرتين حتى لو فشلت الفاتورة.
الأخطاء الشائعة وحلولها السريعة
أخطاء توليد CSR
- «X509Certificate is not valid for this VAT Registration Number» – الرقم الضريبي في
UIDلا يطابق حساب ERAD. - «invalid certificateTemplateName» – استخدمت قالب الإنتاج في بيئة المحاكاة أو العكس.
- «invalid SN format» – تحقَّق أن
SNفيsubjectAltNameبالصيغة1-x|2-y|3-z.
أخطاء الطابع الزمني
- «Time on QR Code does not match Invoice Issue Time (KSA-25)» – عدم تزامن ساعة الكاشير مع NTP. زامن الجهاز مع
time.google.comواحسب الطابع الزمني مرة واحدة لكل فاتورة. - OTP expired – تجاوز ساعة كاملة منذ التوليد. أعد التوليد وأكمل خلال النافذة.
أخطاء التجزئة والتوقيع
- «invalid-invoice-hash» – XML عُدِّل بعد حساب التجزئة. احسب التجزئة آخر شيء، ولا تُعِد تنسيق XML بعدها.
- «invoiceSignedDataDigestValue» – لم تُطبَّق الاستبعادات الصحيحة قبل C14N.
- «SignatureValue does not verify» – مفتاح التوقيع لا يطابق الشهادة، أو ترميز غير DER.
- «QRCODE_INVALID» – حقول 6–9 ناقصة (لا زيت على QR المرحلة 1).
أخطاء السلسلة والتسلسل
- «PIH mismatch» – اعتمدت تجزئة فاتورة مقبولة وتجاهلت فاتورة مرفوضة بينهما.
- «ICV must be sequential» – عدّاد ICV قفز أو أعيد استخدامه.
- «Duplicate invoice ID» – إعادة إرسال نفس
cbc:IDبعد رفض. أنشئ رقماً جديداً.
أخطاء رمز نوع الفاتورة
- «Invalid InvoiceTypeCode / name attribute» – نواع KSA-2 خاطئ. مثلاً «simplified export» غير مسموح لأن التصدير لا بدّ أن يكون قياسياً.
- «BR-KSA-37» – رقم المبنى يجب أن يكون 4 أرقام بالضبط.
- «Missing BillingReference» – كل إشعار دائن أو مدين يجب أن يشير إلى الفاتورة الأصلية في
cac:BillingReference.
لماذا «هلا إنفويس» ينجز هذه الطبقة عنك؟
كل ما سبق يتطلب فريق تطوير متخصص في التشفير، وتجزئة XML، وسلاسل التجزئة، والامتثال الضريبي. هلا إنفويس يختصر هذه الطبقة كلياً: يدير CSR و CSID، وينفِّذ اختبارات الامتثال نيابة عن عميله، ويوقِّع الفواتير بـ ECDSA secp256k1، ويُولِّد QR بـ9 حقول TLV، ويحافظ على سلسلة PIH، ويرسل إلى نموذجَي المشاركة والإبلاغ بحسب نوع الفاتورة، مع أرشفة سحابية 6 سنوات. كل ذلك خلف واجهة عربية أولاً ولوحة تحكم للتقارير الضريبية. نحن نجعل الامتثال زاتكا تلقائياً وغير مرئي بالنسبة لصاحب المنشأة.
أسئلة شائعة حول ربط الكاشير بزاتكا في المرحلة الثانية
أسئلة شائعة
هل يستطيع كاشير عادي أن يتكامل مع منصة فاتورة؟
إذا كان الكاشير يدعم توليد CSR بمفتاح secp256k1، وتوقيع XML بـ XAdES، وإرسال REST APIs فنعم. وإلا تحتاج إلى طبقة وسيطة مثل هلا إنفويس.
ما الفرق بين Production CSID و Compliance CSID؟
Compliance CSID تُستعمل فقط لاختبارات الامتثال (حتى 6 فواتير عينة). Production CSID هي الشهادة الإنتاجية التي توقِّع بها كل فاتورة حقيقية لاحقاً.
كم مدة صلاحية شهادة الإنتاج؟
غالباً سنة واحدة، ويُفضَّل التجديد قبل انتهائها بأسبوعين على الأقل عبر PATCH مع CSR جديد و OTP جديد.
ماذا يحدث إذا انقطع الاتصال بمنصة فاتورة لحظة البيع؟
بالنسبة للفاتورة المبسطة (B2C) لديك 24 ساعة للإبلاغ، ويمكن الإرسال عند عودة الاتصال. بالنسبة للفاتورة الضريبية (B2B) فلا يجوز تسليمها قبل اعتماد زاتكا لها.
هل يجب على كل فرع أو كاشير أن يُربط بشكل مستقل؟
نعم. كل جهاز EGS يحصل على CSR و CSID خاصَّين به، ولا يجوز مشاركة المفاتيح بين الأجهزة.
هل يمكن استخدام منحنى secp256r1 بدلاً من secp256k1؟
لا. عملياً جميع مكتبات وأمثلة زاتكا تستعمل secp256k1، وإن لم يُنصّ صراحة في كل وثيقة.
ماذا لو رُفِضَت فاتورة B2B في المشاركة؟
لا تُسلَّم الفاتورة للمشتري. صحِّح البيانات وأعِد الإرسال برقم Invoice ID جديد و UUID جديد و ICV جديد.
جاهز لإنشاء فاتورتك الآن؟
أنشئ فاتورة إلكترونية متوافقة مع ZATCA في أقل من 3 دقائق – مجاناً وبدون تسجيل
أنشئ فاتورتك الآن✓ مجاني 100% • ✓ بدون تسجيل • ✓ متوافق مع ZATCA