مرجع API · طلبات الشراء

تقديم طلب شراء

POST/v1/wallets/{walletId}/orders

يشتري بطاقات من محفظة، بمعرّف عملية تختاره أنت وتحفظه. إرسال المعرّف نفسه مجددًا لا يشتري مرتين أبدًا: بل يستأنف طلب الشراء نفسه.

الصلاحيةorders:create
المصادقةشراء موقَّع
ردّ أنيسموقَّع
حدود الموظفين التي يُحتسب ضمنهاكل الاستدعاءات، المشتريات (حدّ الطلبات)
حزمة SDK لـ ‎.NETanis.Orders.CreateAsync(walletId, operationId, order) / ResumeAsync(...)
  • 201: اكتمل طلب الشراء، وهذا الرد يحمل رموز البطاقات. احفظها أولًا.
  • 200: الرد الذي يتلقاه الاستئناف حين ضاع الرد الأول. إن كان يحمل رموز البطاقات فهذه أول مرة تراها — احفظها.
  • الرد الموسوم بـ Idempotency-Replayed: true يكرّر طلب شراء أُرسلت نتيجته من قبل: يحمل الطلب (مرجعك والبطاقة والكمية والإجمالي) لا الرموز. وإن لم يصلك ذلك الرد الأول قط — بانتهاء المهلة — فالرموز كانت فيه: اكشفها بمعرّف فاتورة طلب الشراء، وهذا يحتاج cards:reveal.
  • 202: قُبل ولا نتيجة بعد. أرسل طلب الشراء نفسه مجددًا بعد Retry-After.
  • يجب ألا يتجاوز محتوى طلب الشراء 8,192 بايت (8 كيلوبايت)، بترميز UTF-8 — ويُرفض Content-Type يذكر charset آخر بالحالة HTTP ‏422 والرمز validation_failed. يُرفض المحتوى الأكبر بالحالة HTTP ‏422 والرمز validation_failed.
  • الحالة HTTP ‏429 والرمز spending_limit_exceeded: لم يُقدَّم طلب الشراء لأنه سيتجاوز سقف إنفاق التطبيق لهذه النافذة. انتظر إعادة ضبط النافذة بحسب Retry-After، ثم قدّم طلب شراء جديدًا بمعرّف عملية جديد؛ واطلب من موظفي أنيس تغيير السقف إذا احتجت إلى ذلك.

المعاملات

الاسمالموضعالنوعملاحظات
walletIdإلزاميpathUUIDمعرّف UUID بأحرف صغيرة مع الشرطات.

الاستدعاء

موقَّع بمفتاحك، مع رقم استخدام لمرة واحدة (nonce) وبصمة للمحتوى ومعرّف العملية في Idempotency-Key.

الترويسات: Signature-Input، Signature، Content-Digest، Nonce، Idempotency-Key، X-Anis-Date، Accept-Language (اختياري). تضبطها حزم SDK كلها نيابةً عنك.

المحتوى: CreateOrderRequest، بصيغة JSON.

الحقلالنوعملاحظات
externalReferencestringمرجعك الخاص، من 1 إلى 100 حرف: حروف لاتينية وأرقام ومسافة و - _ . : / #.
cardIdإلزاميUUIDبطاقة الكتالوج المراد شراؤها.
quantityإلزاميintegerمن 1 إلى حدّ طلب الشراء على المنصة، وهو 100.
expectedUnitPriceإلزاميMoneyقيمة unitPrice الخاصة بالبطاقة كما عرضها الكتالوج لهذه المحفظة، بصيغة Money المشتركة.
expectedTotalإلزاميMoneyexpectedUnitPrice مضروبًا في quantity بالضبط — محسوبًا دون أرقام عشرية عائمة (floating point).
useAllowedDebtbooleanاجعله true فقط إن كنت تأذن باستخدام الدين المسموح للحساب. قيمته الافتراضية false ولا يُفعَّل نيابةً عنك أبدًا.

الردود

الحالةالمعنىالمحتوى
200نجاح.Order
201اكتمل طلب الشراء.Order
202قُبل — لا نتيجة بعد.Order
400مرفوض: الاستدعاء الموقّع غير سليم البنية.مشكلة
401مرفوض: لم تتم المصادقة.مشكلة
402مرفوض: يلزم الإذن باستخدام الدين المسموح.مشكلة
403مرفوض: غير مسموح.مشكلة
404مرفوض: غير موجود، أو ليس لك.مشكلة
409مرفوض: يتعارض مع الحالة الحالية.مشكلة
422مرفوض: الاستدعاء يخالف قاعدة.مشكلة
429مرفوض: بلغتَ حدًا.مشكلة
503لا قرار: خدمة مطلوبة غير متاحة.مشكلة

كل ردّ على هذا الاستدعاء موقَّع من أنيس — النجاح وكل رفض. اشترط وجود التوقيع وتحقّق منه قبل أن تتصرف بناءً على الردّ؛ والردّ بلا توقيع فشل، لا يُعدّ ردًّا (كيف).

حالات الرفض

كل رفض لهذا الاستدعاء مشكلةٌ موقَّعة. ابنِ منطقك على رمزها code؛ وكلٌّ منها يرتبط بصفحة تشرح معناه وما عليك فعله.

الخطأالرمزالحالة
بيانات اعتماد غير صالحةinvalid_credentials401
استدعاء موقّع غير سليم البنيةmalformed_signed_request400
صلاحية غير كافيةinsufficient_scope403
عنوان المصدر غير مسموحsource_ip_not_allowed403
تجاوزت حدّ الاستدعاءاتrate_limited429
اكتُشف تكرارreplay_detected409
الحساب غير مخوَّلbinding_not_authorized403
الحساب غير فعّالaccount_inactive403
المحفظة غير ممنوحةwallet_not_granted404
غير موجودresource_not_found404
فشل التحققvalidation_failed422
العملة غير مدعومةcurrency_not_supported422
معرّف العملية مستخدم من قبلidempotency_conflict409
يلزم الإذن باستخدام الدين المسموحallowed_debt_consent_required402
الرصيد غير كافٍinsufficient_balance409
الشراء غير مسموحpurchase_not_allowed403
رُفض طلب الشراءpurchase_not_allowed409
يلزم اشتراك أعمالbusiness_subscription_required409
المحفظة معطّلةwallet_disabled409
انتهت صلاحية المحفظةwallet_expired409
البطاقة غير متاحةcard_unavailable409
الكمية غير متاحةquantity_unavailable409
تغيّر السعرprice_changed409
استُنفد حدّ الإنفاقowner_limit_exceeded409
بُلغ الحدّ اليوميdaily_limit_exceeded429
بُلغ سقف الإنفاقspending_limit_exceeded429
الخدمة غير متاحةdependency_unavailable503
انتهت مهلة الاستدعاءrequest_timeout504
خطأ داخليinternal_error500

الأنواع

CreateOrderRequest

الحقلالنوعملاحظات
externalReferencestringمرجعك الخاص، من 1 إلى 100 حرف: حروف لاتينية وأرقام ومسافة و - _ . : / #.
cardIdإلزاميUUIDبطاقة الكتالوج المراد شراؤها.
quantityإلزاميintegerمن 1 إلى حدّ طلب الشراء على المنصة، وهو 100.
expectedUnitPriceإلزاميMoneyقيمة unitPrice الخاصة بالبطاقة كما عرضها الكتالوج لهذه المحفظة، بصيغة Money المشتركة.
expectedTotalإلزاميMoneyexpectedUnitPrice مضروبًا في quantity بالضبط — محسوبًا دون أرقام عشرية عائمة (floating point).
useAllowedDebtbooleanاجعله true فقط إن كنت تأذن باستخدام الدين المسموح للحساب. قيمته الافتراضية false ولا يُفعَّل نيابةً عنك أبدًا.

Money

الحقلالنوعملاحظات
amountإلزاميstringنص عشري، وليس عدد JSON. قد يكون رصيد المحفظة سالبًا عند استخدام الدين المسموح. تتبع الأسعار والإجماليات قواعد المبلغ لكل مسار.
currencyإلزاميstringرمز عملة من ثلاثة أحرف كبيرة، مثل LYD. اقرأ عملة المحفظة من balance.currency.
asOfstring (date-time)وقت قراءة هذا السعر أو الرصيد.

Order

الحقلالنوعملاحظات
operationIdموجود دائمًاUUIDمعرّف العملية الذي اخترته وأرسلته في Idempotency-Key.
statusموجود دائمًاstringprocessing: قُبل ولا نتيجة بعد. completed: تمّ الشراء. failed: رفضته قاعدة عمل، ولم يُشترَ شيء. recoveryExhausted: لم تتمكن أنيس بعد من معرفة النتيجة — ربما اكتمل؛ واصل الاستئناف ببطء واكتب إلى support@anis.ly واذكر معرّف العملية. القيم: processing, recoveryExhausted, completed, failed
invoiceIdUUIDالفاتورة التي عليها البطاقات. استخدمه لكشفها مجددًا لاحقًا.
walletIdUUIDالمحفظة التي دُفع منها طلب الشراء.
cardIdanyبطاقة الكتالوج المطلوبة. موجودة في كل ردّ على طلب الشراء — الأول وتكراره والقراءة.
quantityintegerعدد البطاقات المطلوبة. موجود في كل ردّ على طلب الشراء، بما فيه التكرار والقراءة.
totalanyتكلفة طلب الشراء. موجودة في كل ردّ تكون فيه status مساوية لـ completed، بما فيه التكرار والقراءة؛ وغير موجودة ما دام processing أو بعد أن failed.
externalReferencestringمرجعك الخاص كما أرسلته تمامًا. موجود في كل ردّ على طلب الشراء، بما فيه التكرار والقراءة — ويخبرك أي عملية بيع لديك هذه. غير موجود حين لا يحمل الطلب مرجعًا.
failureCodestringسبب فشل طلب الشراء: رمز الرفض الذي سجّلته أنيس، وهو أحد رموز الأخطاء. يظهر فقط في قراءة طلب شراء قيمة status فيه failed. غير موجود حين لا يكون لذلك الرفض رمز علني.
codesWithheldbooleanتساوي true فقط في الرد الذي يعلن أول مرة طلب شراء مدفوعًا ومكتملًا تعذّر إصدار رموزه. لا تشترِه مرة أخرى، واكتب إلى support@anis.ly واذكر معرّف العملية. لا تساوي false أبدًا: في كل رد آخر هي غير موجودة، وفي التكرار أو القراءة يعني غيابها «غير مذكور».
soldCardslist of RevealedCredentialرموز البطاقات. موجودة فقط في الرد الذي يعلن اكتمال طلب الشراء أول مرة — احفظها قبل أي شيء آخر.
completedAtstring (date-time)وقت اكتمال طلب الشراء.

RevealedCredential

الحقلالنوعملاحظات
soldCardIdموجود دائمًاUUIDالبطاقة المبيعة التي تخصها هذه الرموز.
serialNumberstringالرقم التسلسلي للبطاقة. سرّ: احفظه حيث تحفظ الأسرار ولا تسجّله في السجلات أبدًا.
voucherstringرمز القسيمة للبطاقة. سرّ: احفظه حيث تحفظ الأسرار ولا تسجّله في السجلات أبدًا.
revealedAtstring (date-time)وقت كشفها.
expiryDatestring (date)آخر يوم يمكن فيه استخدام البطاقة، بصيغة yyyy-MM-dd. أبلغ به عميلك النهائي. غير موجود حين لا يكون للبطاقة تاريخ انتهاء.
invoiceIdanyالفاتورة التي عليها البطاقة. يظهر أيضًا داخل soldCards في طلب الشراء.
cardCardSummaryبطاقة الكتالوج التي بيعت، لتعرف لأي بطاقة هذه الرموز. تظهر أيضًا داخل soldCards في طلب الشراء.
purchasedAtstring (date-time)وقت شراء البطاقة. يظهر أيضًا داخل soldCards في طلب الشراء.

CardSummary

الحقلالنوعملاحظات
idUUIDمعرّف بطاقة الكتالوج.
nameLocalizedTextاسم البطاقة بالعربية والإنجليزية؛ يُحذف النص المحلي الفارغ.
faceValuestringالقيمة المطبوعة الاختيارية؛ تُحذف حين تكون فارغة.
logostringعنوان URL مطلق واختياري لشعار الفئة الفرعية؛ يُحذف حين يكون فارغًا.
subcategoryobjectالفئة الفرعية للبطاقة، بمعرّفها واسمها المحلي.
subcategory.idUUIDمعرّف الفئة الفرعية.
subcategory.nameLocalizedTextاسم الفئة الفرعية بالعربية والإنجليزية.
categoryobjectفئة البطاقة، بمعرّفها واسمها المحلي.
category.idUUIDمعرّف الفئة.
category.nameLocalizedTextاسم الفئة بالعربية والإنجليزية.

LocalizedText

الحقلالنوعملاحظات
arstringالنص العربي؛ يُحذف حين يكون فارغًا.
enstringالنص الإنجليزي؛ يُحذف حين يكون فارغًا.