يخبرك App Store order ID المطبوع على إيصال العميل بما اشتراه، وما إذا كانت Apple قد ردّت له المبلغ بالفعل
تحوّل نقطة النهاية Look Up Order ID من Apple رقم order ID الموجود في إيصال App Store الخاص بالعميل إلى signed transactions، بما فيها تواريخ الاسترداد وأسبابه. إليك كيف تستخدمها مع رسائل طلب الاسترداد، وما الذي لا تستطيع فعله، وكيف يختلف order ID في Google Play.

أهم الخلاصات
- ترسل Apple بالبريد الإلكتروني إيصالًا يحمل order ID في كل مرة يجري فيها العميل عمليات شراء داخل التطبيق، ويمكن للعملاء أيضًا العثور على أرقام order ID في سجل مشترياتهم على App Store.
- تعيد نقطة النهاية Look Up Order ID في App Store Server API من Apple (GET /inApps/v1/lookup/{orderId}) معاملة موقّعة واحدة أو أكثر لأي order ID صالح، فيرى فريق الدعم productId وpurchaseDate دون تخمين.
- تحمل معاملة App Store بعد فك ترميزها الحقلين revocationDate وrevocationReason، لذا يكشف البحث بـ order ID ما إذا كانت Apple قد ردّت قيمة الشراء بالفعل. السبب 1 يعني أن Apple ردّت المبلغ بسبب مشكلة فعلية أو متصوَّرة داخل التطبيق.
- تعيد Look Up Order ID القيمة OrderLookupStatus 1 دون مصفوفة signedTransactions عندما لا يكون order ID صالحًا لتطبيقك، وهذا يشير إلى إيصال خاطئ أو إلى عملية شراء من تطبيق آخر.
- لا تتوفر Look Up Order ID في بيئة sandbox لدى Apple، وحدّ معدل الطلبات لها في بيئة الإنتاج 10 طلبات في الثانية لكل تطبيق، ويُطبَّق على أساس الساعة.
- لا يستطيع المطورون إصدار استردادات App Store. تقرر Apple ذلك عبر reportaproblem.apple.com، وخطوة الأدلة الوحيدة المتاحة للمطور هي الرد على CONSUMPTION_REQUEST خلال 12 ساعة.
- ترسل Google Play بالبريد الإلكتروني order ID لكل عملية شراء لمرة واحدة ولكل تجديد اشتراك، ويستطيع المطور البحث عن هذا order ID في Play Console وردّ المبلغ مباشرة. ويقول Play Console إن الاسترداد لا يمكن التراجع عنه.
قبل أن ترد على رسالة استرداد من عميل iPhone، اطلب منه App Store order ID المكتوب على إيصال Apple. هذه السلسلة الواحدة، بعد تمريرها إلى نقطة النهاية Look Up Order ID من Apple، تخبرك بالمنتج الذي اشتراه، ومتى اشتراه، وما إذا كانت Apple قد ردّت له المبلغ بالفعل. من دونها، تطابق لقطة شاشة وعنوان بريد إلكتروني مع قاعدة بياناتك وتأمل خيرًا. ومعها، تعرف خلال ثوانٍ إن كنت تتحدث مع عميل دفع فعلًا، أو عميل ردّت له Apple ماله، أو شخص يحمل إيصالًا من تطبيق آخر.
من أين يأتي App Store order ID
وثائق Apple واضحة. عندما يجري العملاء عملية شراء واحدة أو أكثر داخل تطبيقك، يرسل App Store إليهم إيصالًا بالبريد الإلكتروني، ويحتوي هذا الإيصال على order ID. ويمكن للعملاء أيضًا العثور على أرقام order ID في سجل مشترياتهم على App Store. صفحة سجل المشتريات لدى Apple موجودة على reportaproblem.apple.com وفي تطبيق App Store ضمن Apps & Purchase History، وتعرض آخر 90 يومًا افتراضيًا، مع عوامل تصفية للمشتريات الأقدم.
إذن المفتاح في يد العميل أصلًا. كل ما على نموذج الدعم لديك أن يطلبه.
لماذا لا يكفي عنوان البريد الإلكتروني
لا تشارك Apple معك بريد Apple Account الخاص بالعميل. قد لا يكون للعنوان الذي يراسل صندوق الدعم لديك أي صلة بالحساب الذي دفع. إذا ضبطت appAccountToken عند الشراء، يمكنك ربط المعاملة بمعرّف المستخدم لديك، لكن من جهتك فقط. أما order ID فيعمل من جهة العميل، من إيصال يستطيع إعادة توجيهه بلمسة واحدة.
ماذا تعيد Look Up Order ID
Look Up Order ID جزء من App Store Server API، ومتاحة منذ الإصدار 1.1.0. تستدعي GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId} باستخدام JWT الموقّع الخاص بك. تقول Apple إن الاستجابة تستند إلى سجل مشتريات العميل داخل التطبيق، بغض النظر عمّا إذا كان قد ثبّت التطبيق أو حذفه أو أعاد تثبيته.
| الحقل أو السلوك | ما تقوله وثائق Apple | ما يفعله الدعم به |
|---|---|---|
| OrderLookupStatus 0 | order ID صالح. تحتوي الاستجابة على مصفوفة من معاملة موقّعة واحدة أو أكثر | فك ترميز كل واحدة وقراءة عملية الشراء |
| OrderLookupStatus 1 | لا تحتوي الاستجابة على مصفوفة signedTransactions | اعتبر order ID غير صالح لتطبيقك. اطلب الإيصال الصحيح |
| productId وpurchaseDate | تسمّي Apple هذين الحقلين للاستخدام في دعم العملاء | تأكيد ما تم شراؤه ومتى |
| revocationDate | الوقت الذي ردّ فيه App Store قيمة المعاملة أو سحبها من Family Sharing | إذا وُجد، فقد ردّت Apple المال للعميل بالفعل |
| revocationReason | 0: استرداد لأسباب أخرى، مثل شراء عن طريق الخطأ. 1: استرداد بسبب مشكلة فعلية أو متصوَّرة داخل تطبيقك | القيمة 1 إشارة عن المنتج، وليست مجرد تذكرة دعم |
| appAccountToken | معرّف UUID الذي ضبطته عند الشراء، إن كنت ضبطته | مطابقة الطلب مع سجل المستخدم لديك |
| price وcurrency | تقول Apple ألّا تستخدمهما لمطابقة الإيرادات | استخدم تقارير App Store Connect للأرقام المالية |
| Sandbox | نقطة النهاية غير متاحة في بيئة sandbox | اختبر على أرقام order ID من الإنتاج فقط |
| حد المعدل | 10 طلبات في الثانية لكل تطبيق، يُطبَّق كل ساعة. التجاوز يعيد HTTP 429 مع ترويسة Retry-After | كافٍ لمكتب الدعم، وليس للفحص الجماعي |
هل هذا إيصال صالح لتطبيقي؟
هذا هو السؤال الذي يجيب عنه OrderLookupStatus أولًا. القيمة 1 تعني أن order ID لم يُطابق أي مشتريات في تطبيقك. الحالات الشائعة هي خطأ في الكتابة، أو إيصال لتطبيق آخر، أو إيصال ليس من App Store أصلًا. لا تردّ مالًا ولا تمنح رصيدًا ولا تستعد شيئًا عند القيمة 1. اطلب من العميل التحقق من الإيصال مرة أخرى.
هل ردّت Apple قيمة هذا الشراء بالفعل؟
تحقق من revocationDate في كل معاملة بعد فك ترميزها. إذا كان مضبوطًا، فقد ردّت Apple قيمة هذا الشراء أو سحبته من Family Sharing، والعميل استعاد ماله. ومن المفترض أن تكون App Store Server Notifications قد أرسلت REFUND للمعاملة نفسها، لذا فهذه أيضًا طريقة رخيصة للتأكد من أن خادمك ألغى الوصول فعلًا.

ما الذي لا يستطيع order ID فعله على App Store
لا يستطيع إصدار استرداد. ليس لدى المطورين زر لاسترداد App Store. تقرر Apple الاستردادات، ويوجّه مقال الدعم الخاص بها العملاء إلى reportaproblem.apple.com، حيث يختارون "I'd like to" ثم "Request a refund"، ويحددون سببًا، ثم يختارون العنصر. وتقول Apple أيضًا إن الرسوم المعلّقة لا يمكن ردّها حتى يصل إلى العميل إيصال البريد الإلكتروني.
المكان الوحيد الذي يكون لك فيه رأي هو CONSUMPTION_REQUEST من Apple. عندما يطلب عميل من Apple استردادًا، قد ترسل Apple هذا الإشعار، ولديك 12 ساعة للرد عبر Send Consumption Information. البحث بـ order ID أداة دعم. لا يفتح تلك النافذة ولا يمدّدها.
كم تكلفك رسالة استرداد عندما تتخطى البحث
الدعم من دون order ID هو المكان الذي يتسرب منه المال بهدوء. تتكرر ثلاثة أنماط مرة بعد مرة.
- مجاملة فوق الاسترداد. تردّ Apple قيمة الشراء، ويراسلك العميل أيضًا، فيمنحه الدعم رصيدًا مجانيًا أو شهرًا إضافيًا. كل رصيد تمنحه يعمل على compute وAPI calls وstorage تدفع أنت ثمنها، على حساب استعاد ماله بالفعل.
- وصول لم يُلغَ قط. إذا فشلت معالجة REFUND لديك، يواصل العميل المسترد ماله الاستخدام. بحث يُظهر revocationDate بينما تقول قاعدة بياناتك إن الاشتراك ما زال نشطًا هو تقرير خلل يحمل ثمنًا.
- حساب خاطئ، وحل خاطئ. استعادة الحساب المرتبط ببريد معاد توجيهه أو منحه رصيدًا، بينما يعود order ID لشخص آخر، يمنح خدمة مدفوعة لشخص لم يشترها قط.
لا يحتاج أي من هذه الأنماط إلى نزاع أو مهلة كي يضرّك. إنها مجرد ردود دعم صدرت دون حقائق. استدعاء API واحد لكل تذكرة يزيل التخمين.
هل يعني revocationReason 1 أنني أخطأت؟
ليس بالضرورة. تقول Apple إن السبب 1 يعني أنها ردّت قيمة الشراء بسبب مشكلة فعلية أو متصوَّرة داخل تطبيقك. وكلمة متصوَّرة تحمل وزنًا كبيرًا هنا. لكن مجموعة من استردادات السبب 1 على منتج واحد، بعد إصدار واحد، هي أوضح ملاحظة عن المنتج تقدمها لك Apple. عُدّها.
كيف يختلف order ID في Google Play
تعمل Google Play بالعكس. تقول وثائق الفوترة من Google إن المستخدمين يتلقون رسالة بريد إلكتروني تحمل order ID فريدًا لكل عملية شراء لمنتج لمرة واحدة، ولعملية شراء الاشتراك الأولى، ولكل تجديد متكرر، وإنك تستطيع استخدام order ID لإدارة الاستردادات في Play Console. تبحث في Order management بـ order ID أو بعنوان البريد الإلكتروني الكامل للمستخدم، ثم تردّ المبلغ بنفسك.
| السؤال | App Store order ID | Google Play order ID |
|---|---|---|
| أين يجده العميل | إيصال البريد الإلكتروني وسجل مشتريات App Store | إيصال بريد إلكتروني لكل عملية شراء ولكل تجديد |
| كيف تبحث عنه | Look Up Order ID في App Store Server API | البحث في Order management داخل Play Console |
| هل تستطيع الاسترداد منه | لا. تقرر Apple | نعم. استرداد كامل، واسترداد جزئي للمشتريات داخل التطبيق والاشتراكات |
| نافذة الأدلة للاسترداد | CONSUMPTION_REQUEST، 12 ساعة، وتقرر Apple | مراجعة رد المبلغ المصرفي عبر orders.reviewrefund، 24 ساعة |
| هل يمكن التراجع عن الاسترداد | ليس من جهتك | لا. يقول Play Console إن الاسترداد لا يمكن التراجع عنه |
في Google Play، يهم order ID أكثر لأنك أنت من يضغط الزر. يقول Play Console إن ردّ قيمة أحدث طلب اشتراك يزيل الاشتراك فورًا ويلغي التجديدات المستقبلية، بينما ردّ قيمة طلب أقدم هو استرداد فقط ويبقى الاشتراك نشطًا. الاستردادات الجزئية مدعومة فقط للطلبات المقدمة بعد مارس 2018، ولا يمكنك ردّ جزء من قيمة تطبيق مدفوع.
ضع order ID في مقدمة مسار دعم الاسترداد لديك
- اطلب order ID في نموذج الدعم، مع تلميح من سطر واحد: إنه موجود في رسالة إيصال Apple أو Google Play.
- على iOS، استدعِ Look Up Order ID، وفك ترميز كل معاملة، واعرض للدعم productId وpurchaseDate وrevocationDate وrevocationReason في شاشة واحدة.
- إذا كانت قيمة OrderLookupStatus هي 1، توقف واطلب الإيصال الصحيح. لا تمنح شيئًا.
- إذا كان revocationDate مضبوطًا، فتأكد من أن الوصول أُلغي بالفعل على خادمك، ثم أغلق التذكرة. بلا مجاملة إضافية.
- إذا لم يكن مضبوطًا وأراد العميل استعادة ماله، فوجّهه إلى reportaproblem.apple.com وأبقِ معالج CONSUMPTION_REQUEST لديك جاهزًا لنافذة الساعات الـ12. يرد RefundHalt على هذا الطلب ببيانات الاستهلاك التي تطلبها Apple.
- على Android، ابحث عن الطلب الصحيح تمامًا في Play Console قبل الاسترداد، واختر عن قصد بين الاسترداد فقط والاسترداد مع إلغاء الوصول.
الأسئلة الشائعة
- كيف أبحث عن App Store order ID بصفتي مطورًا؟
- استدعِ نقطة النهاية Look Up Order ID في App Store Server API، GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}، باستخدام JWT الموقّع الخاص بك. يعيد order ID الصالح القيمة OrderLookupStatus 0 ومعاملة موقّعة واحدة أو أكثر، تفك ترميزها لقراءة productId وpurchaseDate وأي تفاصيل استرداد. نقطة النهاية غير متاحة في sandbox.
- أين يجد العميل App Store order ID الخاص به؟
- في إيصال البريد الإلكتروني الذي ترسله Apple في كل مرة يجري فيها مشتريات داخل التطبيق، وفي سجل مشتريات App Store على reportaproblem.apple.com أو ضمن Apps & Purchase History في تطبيق App Store. يعرض سجل المشتريات آخر 90 يومًا افتراضيًا، مع عوامل تصفية للمشتريات الأقدم.
- هل أستطيع ردّ قيمة شراء من App Store باستخدام order ID؟
- لا. لا يستطيع المطورون إصدار استردادات App Store. تقرر Apple ذلك عندما يطلب العميل الاسترداد عبر reportaproblem.apple.com. ومساهمتك هي الرد على CONSUMPTION_REQUEST من Apple خلال 12 ساعة عبر Send Consumption Information.
- كيف أعرف أن Apple ردّت قيمة الشراء بالفعل؟
- ابحث بـ order ID وتحقق من revocationDate في كل معاملة بعد فك ترميزها. إذا كان مضبوطًا، فقد ردّت Apple قيمة الشراء أو سحبته من Family Sharing. القيمة 0 في revocationReason تعني أسبابًا أخرى مثل شراء عن طريق الخطأ، والقيمة 1 تعني مشكلة فعلية أو متصوَّرة داخل تطبيقك.
- ماذا تعني OrderLookupStatus 1؟
- تعني أن order ID غير صالح لتطبيقك، وأن الاستجابة لا تحتوي على مصفوفة signedTransactions. غالبًا أرسل العميل إيصالًا من تطبيق آخر، أو أخطأ في كتابة المعرّف، أو أرسل إيصالًا ليس من App Store. اطلب الإيصال الصحيح قبل منح أي شيء.
المصادر وقراءات إضافية
- Apple Developer Documentation: Look Up Order ID
- Apple Developer Documentation: orderId
- Apple Developer Documentation: revocationReason
- Apple Developer Documentation: Identifying rate limits
- Apple Support: See your purchase history for the App Store, iTunes Store, and more
- Apple Support: Request a refund for apps or content that you bought from Apple
- Play Console Help: Refund orders and subscriptions
- Android Developers: Integrate the Google Play Billing Library into your app
RefundHalt
الطيار الآلي للاستردادات في App Store وGoogle Play
تابع القراءة
استرداد مبالغ الدفع عبر الويب في iOS يصل إليك الآن بدلًا من Apple، وكذلك نزاعات البنوك
أصبح بإمكان تطبيقات iPhone في الولايات المتحدة توجيه المشترين إلى صفحة دفع عبر الويب. تقول Apple إنها لا تستطيع المساعدة في استرداد المبالغ عن هذه المبيعات، لذا ينتقل إليك مكتب الاسترداد والاعتراضات على المدفوعات ورسوم النزاع البالغة $15. إليك ما يتغير، وكم يكلّف، وكيف تقلّل النزاعات.
استرداد ثمن التطبيق المدفوع لا يصل إلى خادمك أبدًا، لذا على التطبيق نفسه أن يكتشفه
عمليات استرداد ثمن التطبيقات المدفوعة مسبقًا تتجاوز كل إشعار يستمع إليه خادمك. تمنح Google المشترين مهلة إرجاع مدتها ساعتان وتزيل التطبيق، ويمكن أن تردّ Apple المبلغ خلال 90 يومًا بموجب اتفاقيتك، ولا تطلب أيٌّ منهما دليلًا. إليك ما يخبرك به كل متجر، وكم يكلّفك ذلك، وكيف تتحقق منه داخل التطبيق.