كل المقالات
تحليل معمّقمدة القراءة 8 دقائق

استرداد الأموال عبر Advanced Commerce API هو الطريق الوحيد ليبدأ مطوّر iOS عملية استرداد، والقرار النهائي يبقى بيد Apple

معظم مطوّري iOS لا يستطيعون ردّ المال إلى العميل. أما التطبيقات العاملة على Advanced Commerce API من Apple فيمكنها طلب استرداد، أو إلغاء اشتراك نهائيًا، أو إعادة مبلغ مخصّص. نشرح هنا كيف تعمل كل نقطة نهاية، وما الذي يمكن أن ترفضه Apple رغم ذلك، وأين يضيع المال.

امرأة على مكتب منزلي تتصفّح مكتبة كبيرة من الكتب الصوتية والدورات على جهاز iPad بجوار حاسوب محمول، وهو نوع التطبيقات ذات الكتالوج الكبير التي يمكنها إرسال طلب استرداد عبر Advanced Commerce API إلى Apple

أهم الخلاصات

  • قال أحد مهندسي Apple في يونيو 2026 إن المطوّر لا يستطيع إصدار استرداد مباشر لعملية شراء عادية من App Store. مساهمة المطوّر الوحيدة هي بيانات الاستهلاك وrefundPreference التي يرسلها ردًّا على CONSUMPTION_REQUEST.
  • تحصل التطبيقات المعتمدة على Advanced Commerce API من Apple على نقطة النهاية Request Transaction Refund، التي تطلب من App Store استرداد رسم لمرة واحدة أو معاملة اشتراك، إضافة إلى نقطتي النهاية Revoke Subscription وCancel a Subscription.
  • لاستدعاء نقاط نهاية الاسترداد والإبطال والإلغاء في Advanced Commerce API، يجب أن يوقّع صاحب الحساب (Account Holder) لدى المطوّر على Advanced Commerce API Addendum، وتقول Apple إن الاستدعاء يُرجع خطأً إذا لم يُقبل أحدث إصدار منه.
  • تقبل نقطة النهاية Request Transaction Refund قيمة refundType وهي FULL أو PRORATED أو CUSTOM، ولا يُسمح بـ refundAmount بوحدات الألف من العملة إلا مع CUSTOM. وتقول Apple إن المبلغ يجب أن يشمل الضريبة في كل المناطق باستثناء كندا والولايات المتحدة.
  • الحقل refundRiskingPreference لدى Apple قيمته الافتراضية true، ما يسمح لـ App Store بإرسال CONSUMPTION_REQUEST بشأن طلب الاسترداد الذي قدّمه المطوّر نفسه. وتطلب Apple الرد خلال 12 ساعة.
  • نقاط نهاية الاسترداد والإبطال والإلغاء في Advanced Commerce API محدودة بـ 5 طلبات في الثانية لكل تطبيق في بيئة الإنتاج، وتحصل بيئة sandbox على 10 بالمئة من ذلك.
  • بعد نجاح استدعاء Revoke Subscription، ترسل Apple إشعار REFUND وتطلب من المطوّرين إنهاء الخدمة اعتبارًا من revocationDate الوارد فيه، لا قبل وصول الإشعار.

مطوّرو iOS العاديون لا يستطيعون ردّ المال إلى العميل. في يونيو 2026 أجاب أحد مهندسي التجارة في App Store عن سؤال في منتدى المطوّرين بسطر واحد: لا يمكن حاليًا للمطوّر إصدار استرداد مباشر. هناك استثناء واحد، وهو داخل Advanced Commerce API. التطبيقات التي تعتمدها Apple له يمكنها إرسال طلب استرداد عبر Advanced Commerce API، أو إبطال اشتراك مع ردّ المال، أو طلب مبلغ مخصّص. ومع ذلك تقرّر Apple وحدها إن كان المال سيُعاد.

ما هو Advanced Commerce API ومن يحصل عليه

أطلقت Apple واجهة Advanced Commerce API في 23 يناير 2025. وهي تتولّى عمليات Apple In-App Purchases للكتالوجات الكبيرة جدًا من المشتريات المخصّصة لمرة واحدة، والاشتراكات، والاشتراكات ذات الإضافات الاختيارية. لا تحتاج إلى إنشاء كل منتج في App Store Connect. بل تعرّف رموز SKU على خادمك وترسلها إلى Apple لحظة الشراء.

يُمنح الوصول لكل تطبيق على حدة. تملأ نموذج طلب، وتذكر صفحة الأهلية لدى Apple ثلاثة نماذج عمل يجب أن تكون جوهر التطبيق:

  • كتالوجات كبيرة جدًا من المشتريات لمرة واحدة، مثل الكتب الصوتية أو الحصص أو الدورات أو mini apps.
  • كتالوجات كبيرة جدًا من محتوى الاشتراكات، حيث يكون عرض كل صانع محتوى اشتراكًا مستقلًا.
  • اشتراك بإضافات اختيارية تتجدّد معًا كعملية شراء واحدة، مثل القنوات المميّزة أو الرياضة.

تسمح Apple أيضًا للتطبيقات بالتقديم عندما يحتاج برنامج آخر إلى هذه الواجهة. فبرنامج Mini Apps Partner Program، الذي يمنح أعضاءه 85% من مبيعات In-App Purchase المؤهّلة داخل mini apps المستضافة، يشترطها.

نقاط نهاية الاسترداد جاءت لاحقًا، وتتطلّب توقيعًا

أضاف الإصدار 1.1، المؤرّخ في 24 مارس 2025، نقطتي النهاية Request Transaction Refund وRevoke Subscription. تقول صفحة البرنامج لدى Apple إن التطبيقات التي تقدّم محتوى اشتراكات قد تكون مؤهّلة أيضًا لاستخدام واجهات Cancel وRevoke وRefund لمعالجة الإلغاءات، والتحقّق من المحتوى بعد الشراء، وإدارة كتالوجاتها. وتضيف كل صفحة نقطة نهاية الشرط ذاته: يجب أن يوقّع صاحب الحساب لديك على Advanced Commerce API Addendum، وإذا لم يُقبل أحدث إصدار منه فإن الاستدعاء يُرجع خطأً. الملحق (Addendum)، لا الوثائق، هو ما يحدّد حالات الاستخدام المقصودة لكل نقطة نهاية.

نقاط النهاية الثلاث جنبًا إلى جنب

Cancel a SubscriptionRevoke SubscriptionRequest Transaction Refund
المسارadvancedCommerce/v1/subscription/cancel/{transactionId}advancedCommerce/v1/subscription/revoke/{transactionId}advancedCommerce/v1/transaction/requestRefund/{transactionId}
يشملالاشتراكات المتجدّدة تلقائيًااشتراك وجميع عناصرهالرسوم لمرة واحدة ومعاملات الاشتراك
ردّ الماللا شيءFULL أو PRORATEDFULL أو PRORATED أو CUSTOM، لكل SKU
الوصوليستمر حتى نهاية الفترةينتهي عند revocationDateيُحدَّد لكل عنصر عبر علامة revoke
حدّ المعدّل في الإنتاج5 في الثانية5 في الثانية5 في الثانية

Cancel a Subscription يوقف الرسم التالي

يوقف Cancel التجديد التلقائي. تقول Apple إن العميل يحتفظ بالوصول حتى نهاية الفترة الحالية. لا يُستردّ أي شيء. وهو الخيار الصحيح حين يريد العميل المغادرة وقد استهلك بالفعل الوقت الذي دفع ثمنه.

Revoke Subscription ينهي كل شيء الآن

يضبط Revoke التجديد التلقائي على false ويُبطل الاشتراك مع استرداد كامل أو تناسبي. يأخذ جسم الطلب الحقول refundReason وrefundRiskingPreference وrefundType وrequestInfo. بعدها ترسل Apple إشعار REFUND إلى نقطة نهاية App Store Server Notifications V2 لديك. وتعليمات Apple محدّدة: أوقف الخدمة اعتبارًا من revocationDate الوارد في ذلك الإشعار، ولا توقفها قبل وصوله.

Request Transaction Refund يعمل عنصرًا بعنصر

هذه هي الأداة الدقيقة. ترسل قائمة عناصر، ويحدّد كل عنصر SKU وrefundReason وrefundType وعلامة revoke. ومع CUSTOM ترسل أيضًا refundAmount بوحدات الألف من العملة، فالقيمة 4990 تعني 4.99. وإذا أرسلت مبلغًا مع FULL أو PRORATED ترفضه Apple بالخطأ 4000155. يحمل الردّ معاملة موقّعة، ومعلومات تجديد موقّعة في حالة الاشتراكات.

تقبل Apple قيم refundReason التالية: UNINTENDED_PURCHASE وFULFILLMENT_ISSUE وUNSATISFIED_WITH_PURCHASE وLEGAL وOTHER وMODIFY_ITEMS_REFUND. أما القيمة السابعة، SIMULATE_REFUND_DECLINE، فهي لاختبارات sandbox وTestFlight فقط، ووجودها دليل على أن App Store يستطيع الرفض.

يمكن لـ Apple أن ترفض طلب الاسترداد الذي تقدّمه أنت

اسم نقطة النهاية صادق. إنه طلب. وحقلان يوضّحان أين يقع القرار فعلًا.

refundRiskingPreference يفتح الباب لفحص الاستهلاك

تصف Apple الحقل refundRiskingPreference بأنه يحدّد ما إذا كان App Store سيطلب منك بيانات الاستهلاك ليستند إليها في قرار الاسترداد. قيمته الافتراضية true. وعندما يكون true، تتلقّى CONSUMPTION_REQUEST بشأن طلب الاسترداد الخاص بك، وتجيب عبر Send Consumption Information. وتطلب Apple من المطوّرين الرد خلال 12 ساعة من تلقّي CONSUMPTION_REQUEST. اضبطه على false ولن يصل ذلك الإشعار.

الأخطاء التي تقول لك لا

الخطأالرمزما تقوله Apple
AlreadyRefundedError4030021سبق استرداد المعاملة
PendingRefundError4000181توجد عمليات استرداد معلّقة على المعاملة
TransactionNotRefundableError4030024المعاملة غير قابلة للاسترداد
TransactionCannotBeRefundedContactSupportError4030025يمكن للعميل التواصل مع Apple Support
RefundAmountWithoutCustomError4000155أُرسل مبلغ دون CUSTOM

PendingRefundError هو الخطأ الذي يجب أن تستعد له. من أسبابه المرجّحة عميل طلب الاسترداد من Apple عبر Report a Problem قبل أن يتحرّك فريق الدعم لديك. وتُلزم قواعد الأهلية لدى Apple هذه التطبيقات بتوفير مسار للاسترداد داخل التطبيق على أي حال، إما رابط Report a Problem أو واجهة beginRefundRequest، فيبقى البابان مفتوحين في الوقت نفسه.

مطوّر يمسك iPhone فوق دفتر معاملات مطبوع ليتحقّق من العنصر الذي يجب أن يشمله الاسترداد عبر Advanced Commerce API

كم يكلّفك الاسترداد عبر Advanced Commerce API من المال

يبدو الاسترداد بمبادرة منك أرخص من خوض نزاع. لكنه يظل مالًا يخرج من جيبك، والواجهة تجعل تكرار بعض الأخطاء على نطاق واسع أمرًا سهلًا.

الضريبة داخل المبلغ المخصّص

تقول Apple إن refundAmount المطلوب يجب أن يشمل الضريبة في جميع المناطق باستثناء كندا والولايات المتحدة. الفريق الذي يحسب استرداد CUSTOM من سعر SKU قبل الضريبة سيردّ للعملاء أقل من المستحق في كل متجر آخر، ثم يدفع وقت الدعم لتصحيح كل حالة على حدة.

تكاليف لا تعود

  • المدفوعات للمبدعين: في كتالوج صنّاع المحتوى أو منصة mini apps، تُدفع حصة المبدع غالبًا عند البيع. واسترداد المال للعميل لا يستعيدها.
  • ترخيص المحتوى: الرسوم المستحقة لصاحب الحقوق عن كل عنوان من كتاب صوتي أو دورة قد تُستحق بمجرد الوصول، بحسب عقدك، والاسترداد لا يلغيها.
  • الحوسبة: البث وتحويل الترميز وأي عمل على الخادم أُنجز للشراء مسجّل بالفعل في فاتورتك.
  • استدعاءات الواجهات: الخدمات الخارجية التي تُحاسب لكل طلب، من تحويل الكلام إلى استدلال النماذج، تبقى محسوبة بعد الاسترداد.

استرداد كامل وأنت تقصد عنصرًا واحدًا

يستردّ Revoke Subscription الاشتراك كله وينهيه، بما في ذلك الإضافات. إذا كان اعتراض العميل على إضافة واحدة فقط، فإن Request Transaction Refund يتيح لك استرداد ذلك الـ SKU وحده، مع ضبط revoke لذلك العنصر فقط. واستدعاء Revoke Subscription بسبب شكوى تخص عنصرًا واحدًا يعيد إيرادات الخطة الأساسية أيضًا.

قائمة تحقّق قبل تفعيل هذه الواجهات

  • تأكّد من أن صاحب الحساب لديك قبل الإصدار الحالي من Advanced Commerce API Addendum، وضع تنبيهًا على الخطأ الذي يظهر عند انتهاء صلاحيته.
  • أنشئ requestReferenceId جديدًا بصيغة UUID لكل طلب، ولا تُعِد استخدامه إلا لإعادة محاولة استدعاء انتهت مهلته.
  • ضع استدعاءات الاسترداد في طابور. الحدّ هو 5 طلبات في الثانية لكل تطبيق، والاستجابة 429 تحمل ترويسة Retry-After بالمللي ثانية بتوقيت UNIX.
  • اختبر حالات الرفض في sandbox باستخدام SIMULATE_REFUND_DECLINE، وتذكّر أن حدود sandbox هي 10 بالمئة من حدود الإنتاج.
  • قرّر قيمة refundRiskingPreference لكل حالة، وأبقِ نظام الرد على طلبات الاستهلاك جاهزًا لمهلة الـ 12 ساعة حين تبقى القيمة true.
  • لا تُنهِ الوصول إلا عند وصول إشعار REFUND، واعتبارًا من revocationDate الوارد فيه.
  • سجّل السبب والمبلغ والـ SKU لكل طلب، كي ترى معدّل الاسترداد لديك قبل أن تراه Apple.

الأسئلة الشائعة

هل يستطيع مطوّر iOS ردّ المال إلى العميل مباشرة؟
ليس في عملية شراء عادية من App Store. قال أحد مهندسي Apple في يونيو 2026 إنه لا يمكن للمطوّر إصدار استرداد مباشر. أما التطبيقات المعتمدة على Advanced Commerce API، بعد توقيع الملحق (Addendum)، فيمكنها طلب استرداد عبر نقطة النهاية Request Transaction Refund، والقرار يبقى لـ Apple.
ما الفرق بين Cancel وRevoke في Advanced Commerce API؟
يوقف Cancel التجديد التلقائي ويحتفظ العميل بالوصول حتى نهاية الفترة، دون استرداد. أما Revoke فينهي الاشتراك وجميع عناصره فورًا ويستردّ المبلغ كاملًا أو بشكل تناسبي. وترسل Apple إشعار REFUND بعد الإبطال.
هل يمكنني استرداد مبلغ مخصّص عبر Advanced Commerce API؟
نعم. اضبط refundType على CUSTOM ومرّر refundAmount بوحدات الألف من العملة. تقول Apple إن المبلغ يجب أن يشمل الضريبة في جميع المناطق باستثناء كندا والولايات المتحدة، وإرسال مبلغ مع FULL أو PRORATED يُرجع الخطأ 4000155.
هل سأتلقّى CONSUMPTION_REQUEST عن استرداد طلبته بنفسي؟
قد يحدث ذلك. قيمة refundRiskingPreference الافتراضية true، ما يسمح لـ App Store بأن يطلب منك بيانات الاستهلاك عبر CONSUMPTION_REQUEST، وتطلب Apple الرد خلال 12 ساعة. اضبطه على false وتقول Apple إن ذلك الإشعار لن يُرسل.
لماذا فشل طلب الاسترداد عبر Advanced Commerce API؟
راجع رمز الخطأ. 4030021 يعني أن المعاملة استُردّت من قبل، و4000181 يعني أن هناك استردادًا معلّقًا بالفعل، و4030024 يعني أنها غير قابلة للاسترداد، و4030025 يعني أن على العميل التواصل مع Apple Support. كما أن الملحق غير الموقّع أو القديم يُرجع خطأً أيضًا.

المصادر وقراءات إضافية

RefundHalt

الطيار الآلي للاستردادات في App Store وGoogle Play

تابع القراءة

طلب الاسترداد التالي في طريقه إليك بالفعل.

أعد RefundHalt في الوقت الذي تستغرقه لقراءة رسالة دعم أخرى عن استرداد لم تتمكن من الاعتراض عليه.