كل المقالات
Deep diveمدة القراءة 7 دقائق

يتيح إشعار الشراء المُلغى لخادم Google Play الخاص بك إلغاء الوصول في اللحظة التي يصل فيها الاسترداد

يمكن لـ Google Play أن يدفع إلى خادمك إشعار شراء مُلغى في اللحظة التي يُسترد فيها الشراء أو يُرَدّ عبر السداد العكسي أو يُلغى. يحمل الإشعار purchaseToken و orderId و productType و refundType، ويعني شيئًا واحدًا، إلغاء الوصول. إليك كيفية قراءته وربطه.

مساحة عمل مطوّر عند الغسق مع هاتف يعرض دفعة معكوسة، تجسّد وصول إشعار شراء مُلغى من Google Play إلى الخادم

أهم الخلاصات

  • إشعار الشراء المُلغى هو Real-time Developer Notification يدفعه Google Play إلى موضوع Cloud Pub/Sub الخاص بك في اللحظة التي يُسترد فيها الشراء أو يُرَدّ عبر السداد العكسي أو يُلغى بطريقة أخرى. إنه إشارة دفع، وليس شيئًا عليك استقصاؤه بالاستطلاع.
  • يحمل الإشعار أربعة حقول بالضبط: `purchaseToken` و `orderId` و `productType` و `refundType`. هذا كافٍ للعثور على الشراء المحدد في قاعدة بياناتك وإلغاء الاستحقاق المرتبط به.
  • قيمة `productType` هي `1` للاشتراك المُلغى و `2` للشراء لمرة واحدة المُلغى. وقيمة `refundType` هي `1` للاسترداد الكامل و `2` للاسترداد الجزئي القائم على الكمية، والذي ينطبق فقط على المشتريات لمرة واحدة متعددة الكميات.
  • إشعار الشراء المُلغى يعني أن العميل قد استعاد ماله بالفعل. توجيه Google نفسه هو إلغاء الوصول إلى المحتوى المرتبط، لأن المشتري لم يعد ينبغي أن يحتفظ بالاستحقاق.
  • تكون إشعارات الشراء المُلغى مُعطّلة حتى تقوم بتشغيلها. في Play Console ضمن Monetization setup تختار إما الاشتراكات مع جميع المشتريات المُلغاة، أو ذلك مع أحداث المنتجات لمرة واحدة. كلا الخيارين يشملان المشتريات المُلغاة.
  • إشعار الشراء المُلغى ليس أحد تدفّقَي الاسترداد اللذين يطلبان منك أدلة. إنه إشعار لاحق للحدث. التدفقان الوحيدان اللذان يأخذان مدخلاتك هما CONSUMPTION_REQUEST من Apple، بنافذة مدتها 12 ساعة، ومراجعة السداد العكسي في Google Play عبر orders.reviewrefund، بنافذة مدتها 24 ساعة.
  • اعتبارًا من August 3, 2026، يمرّر Google إلى المطوّر سعر الشراء مضافًا إليه رسوم البنك لأي سداد عكسي. غالبًا ما يكون إشعار الشراء المُلغى هو الطريقة التي يعلم بها خادمك لأول مرة بوصول إلغاء ناتج عن سداد عكسي، لذا فإن ربطه هو ما يتيح لك التوقف عن خدمة عميل لم تعد تتقاضى مقابله.

لا يجب أن يكون الاسترداد على Google Play شيئًا تكتشفه لاحقًا في تقرير. يمكن لـ Google Play أن يدفع إلى خادمك إشعار شراء مُلغى في اللحظة التي يُلغى فيها الشراء، سواء طلب المشتري استردادًا ذاتي الخدمة، أو منحه أحد موظفي الدعم، أو فرض بنك سدادًا عكسيًا، أو استرددت الطلب بنفسك مع تفعيل علامة الإلغاء. الرسالة صغيرة جدًا، تسمّي الشراء المحدد بالضبط، وتحمل تعليمة واحدة، أعِد الاستحقاق، لأن المال قد ذهب بالفعل.

ما هو إشعار الشراء المُلغى في الحقيقة

إشعار الشراء المُلغى هو أحد أنواع Real-time Developer Notifications من Google Play، أو RTDN. إن RTDN قناة دفع. ينشر Google رسالة إلى موضوع Cloud Pub/Sub تملكه أنت، ويتلقاها خادمك الخلفي خلال لحظات من الحدث، بدلاً من اكتشافها في استطلاعك المجدول التالي. هذه هي الفكرة كلها من إشعار الشراء المُلغى مقارنةً بمسار السحب الأقدم: تعلم بالاسترداد وهو يحدث، لا بعد ساعات.

لا يزال مسار السحب موجودًا ولا يزال مهمًا. تتيح Voided Purchases API لخادمك أن يطلب، وفق جدولك الخاص، قائمة المشتريات التي أُلغيت خلال نطاق زمني. الاثنان متكاملان. يخبرك الإشعار في اللحظة التي تنقلب فيها حالة شراء واحد؛ وتتيح لك الـ API أن تُطابق بالجملة وأن تسدّ أي شيء كانت رسالة فائتة ستتركه خلفها.

يأتي محمولًا داخل Real-time Developer Notification

لا يصل إشعار الشراء المُلغى وحده أبدًا. إنه يقع داخل غلاف DeveloperNotification، ويُسلَّم ذلك الغلاف كسلسلة نصية واحدة مُرمَّزة بـ base64 في حقل data من رسالة Pub/Sub. يفكّ معالِجك ترميز تلك السلسلة إلى JSON قبل أن يتمكن من قراءة أي شيء. يسمّي الغلاف دائمًا التطبيق ووقت الحدث، ويحتوي على كائن إشعار واحد بالضبط من الخمسة التي يعرّفها Google. وهي متنافية، لذا فإن رسالة تحمل voidedPurchaseNotification لن تحمل معها أيضًا حدث اشتراك أو حدثًا لمرة واحدة.

حقل الغلافما الذي يحتويه
versionإصدار مخطط الإشعار، على سبيل المثال 1.0
packageNameالتطبيق الذي ينتمي إليه الحدث، على سبيل المثال com.acme.app
eventTimeMillisمتى وقع الحدث، بالمللي ثانية منذ epoch
واحد من خمسة كائنات إشعارoneTimeProductNotification أو subscriptionNotification أو voidedPurchaseNotification أو pendingRefundReviewNotification أو testNotification. يوجد واحد فقط في كل رسالة

الحقول الأربعة التي يحملها

انزع الغلاف فيصبح إشعار الشراء المُلغى نفسه أربعة حقول. هذا اقتضاب مقصود. موقف Google هو أنه إذا كان كل ما تحتاجه هو العثور على الشراء الصحيح وتعديل الاستحقاق، فهذه الأربعة كافية، ولست مضطرًا إلى معاودة الاتصال بأي API لتتصرف.

الحقلما هوكيف تستخدمه
purchaseTokenالرمز المُسلَّم إلى الجهاز عند شراء العنصرمفتاحك الأساسي. طابقه مع سجل الشراء الذي خزّنته وقت منح الاستحقاق
orderIdمعرّف الطلب المعروض للمشتري، على سبيل المثال GS.0000-0000-0000مفتاح ثانٍ قابل للقراءة البشرية للدعم والمطابقة
productTypeما إذا كان العنصر المُلغى اشتراكًا أم شراءً لمرة واحدةوجِّه إلى مسار الإلغاء الصحيح
refundTypeما إذا كان الإلغاء استردادًا كاملًا أم استردادًا جزئيًا قائمًا على الكميةقرّر ما إذا كنت ستلغي كل شيء أم الكمية المستردة فقط

productType يخبرك بما أُلغي

قيمة productType عدد صحيح صغير، وهي تحدّد أي مسارات الإلغاء لديك تسلك. إلغاء الاشتراك عليه أن يحلّ وصولًا مستمرًا؛ أما إلغاء الشراء لمرة واحدة فيزيل استحقاقًا واحدًا فقط.

قيمة `productType`الثابتالمعنى
1PRODUCT_TYPE_SUBSCRIPTIONتم إلغاء شراء اشتراك
2PRODUCT_TYPE_ONE_TIMEتم إلغاء شراء لمرة واحدة

refundType يخبرك بكم الذي عاد

يفصل refundType بين عكسٍ كاملٍ نظيف وعكسٍ جزئي. الحالة الجزئية ضيّقة. لا تظهر إلا عندما يكون شراء لمرة واحدة متعدد الكميات قد استُرد بعضُ كميته، لا كلها.

قيمة `refundType`الثابتالمعنى
1REFUND_TYPE_FULL_REFUNDأُلغي الشراء بالكامل
2REFUND_TYPE_QUANTITY_BASED_PARTIAL_REFUNDأُلغي جزء من شراء متعدد الكميات

شغّله أولًا، وإلا فلن يصل أبدًا

لا تتدفق إشعارات الشراء المُلغى افتراضيًا. تُفعّل RTDN مرة واحدة، في Play Console، وتوجّهه إلى موضوع Pub/Sub تتحكم فيه. يقع المفتاح ضمن Monetize، ثم Monetization setup، في قسم Real-time developer notifications أعلى الصفحة. حدّد Enable real-time notifications، ثم الصق اسم موضوعك الكامل بالصيغة projects/{project_id}/topics/{topic_name}، واستخدم Send Test Message للتأكد من أن القناة تعمل قبل أن تثق بها.

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

  • تلقَّ إشعارات للاشتراكات وجميع المشتريات المُلغاة. تتلقى أحداث الاشتراك وكل عملية شراء مُلغاة، لكن ليس أحداث شراء المنتجات لمرة واحدة.
  • تلقَّ جميع الإشعارات للاشتراكات والمنتجات لمرة واحدة. تتلقى ما سبق إضافةً إلى أحداث المنتجات لمرة واحدة مثل ONE_TIME_PRODUCT_PURCHASED و ONE_TIME_PRODUCT_CANCELED.
بطاقة ائتمان موضوعة على وجهها بجانب إيصال ورقي، ترمز إلى عملية شراء مُلغاة على Google Play

ما الذي يكلّفك إياه، بالمال

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

النزيف أسوأ ما يكون على الاشتراكات وأسوأ ما يكون على السداد العكسي. الاشتراك الذي تفشل في إلغائه يظل يكلّفك خدمته، شهرًا بعد شهر، لعميل لم يعد يدفع. والسداد العكسي هو أغلى أنواع الإلغاء. اعتبارًا من August 3, 2026، تنص وثائق Google على أن السداد العكسي يمرّر إلى المطوّر سعر الشراء مضافًا إليه رسوم البنك. غالبًا ما يكون إشعار الشراء المُلغى هو المكان الأول الذي تسمع فيه أنظمتك أن سدادًا عكسيًا قد اكتمل، لذا فإن معالِجًا يلغي على الفور هو ما يمنع بيعًا مفقودًا من أن يتحول إلى بيع مفقود إضافةً إلى أسابيع من الخدمة المجانية.

كيفية التعامل مع إشعار شراء مُلغى، خطوة بخطوة

تحقّق من الرسالة وأزل التكرار

  • تأكّد من أن رسالة Pub/Sub جاءت من Google وتستهدف الموضوع الذي أعددته، ثم فُكّ ترميز حقل data بترميز base64 للحصول على JSON الخاص بـ DeveloperNotification.
  • استخدم messageId الخاص بـ Pub/Sub لإسقاط التكرارات. يحذّر Google من أن الإشعار نفسه قد يُسلَّم أكثر من مرة، لذا عامِل إعادة التسليم كأمر طبيعي واجعل معالِجك عديم التأثير عند التكرار (idempotent).
  • لا تُقرّ باستلام الرسالة إلا بعد أن تكون قد سجّلتها بأمان، حتى لا يفقد عطلٌ في منتصف المعالجة الحدثَ.

ابحث عن الشراء

  • طابِق purchaseToken مع الشراء الذي خزّنته عندما منحت الاستحقاق لأول مرة. ارجع إلى orderId لعمليات بحث الدعم والمطابقة اليدوية.
  • اقرأ productType لاختيار مسار إلغاء الاشتراك أو الشراء لمرة واحدة، واقرأ refundType للاختيار بين إلغاء كامل وإلغاء جزئي.

ألغِ وسجّل

  • أزِل الاستحقاق. في حالة الاسترداد الكامل، اقطع الوصول إلى العنصر. في حالة الاسترداد الجزئي القائم على الكمية، خفّض الكمية الممنوحة بمقدار المبلغ المسترد واترك الباقي سليمًا.
  • دوّن ما فعلته ومتى، مفهرسًا بـ purchaseToken و orderId. ذلك السجل هو ما يتيح لك الرد على تذكرة دعم لاحقًا، وما يتيح لـ Voided Purchases API أن تطابق بنظافة مقابل حالتك الخاصة.

أين يقع بين إشارات الاسترداد الأخرى

إشعار الشراء المُلغى إشعار، لا مفاوضة. يخبرك بنتيجة تقرّرت بالفعل. يجدر النظر إليه بجانب الإشارات التي يسهل الخلط بينه وبينها، لأن بعضها فقط يطلب في أي وقت روايتك للأمر.

الإشارةالاتجاههل تأخذ مدخلاتك
إشعار الشراء المُلغى (RTDN)Google يدفع إلى خادمكلا. يبلّغ عن إلغاء وقع بالفعل
Voided Purchases APIخادمك يسحب من Googleلا. إنها قائمة للقراءة فقط بإلغاءات سابقة
pendingRefundReviewNotification (RTDN)Google يدفع إلى خادمكنعم، بشكل غير مباشر. يشير إلى سداد عكسي تعترض عليه بعد ذلك عبر orders.reviewrefund خلال 24 ساعة
Apple CONSUMPTION_REQUESTApple يسأل خادمكنعم. تردّ بـ Send Consumption Information خلال 12 ساعة

الخلاصة التي يجب التمسّك بها بسيطة. عبر المتجرين هناك تدفّقا استرداد اثنان بالضبط يكون فيهما للمطوّر رأي، CONSUMPTION_REQUEST من Apple ومراجعة السداد العكسي في Google Play. وإشعار الشراء المُلغى ليس أيًّا منهما. بحلول وقت وصوله إليك، يكون القرار قد صار خلفك ولا يبقى في يديك سوى مدى سرعتك في الإلغاء.

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

ماذا يعني إشعار الشراء المُلغى على Google Play؟
يعني أن شراءً قد استُرد أو رُدّ عبر سداد عكسي أو أُلغي بطريقة أخرى، وأن العميل قد استعاد ماله. توجيه Google هو إلغاء الوصول إلى المحتوى المرتبط، لأن المشتري لم يعد ينبغي أن يحتفظ بالاستحقاق. يسمّي الإشعار الشراء المحدد بالضبط عبر `purchaseToken` و `orderId` الخاصين به.
ما الحقول التي يحتويها إشعار الشراء المُلغى في Google Play؟
أربعة: `purchaseToken` و `orderId` و `productType` و `refundType`. قيمة `productType` هي `1` للاشتراك و `2` للشراء لمرة واحدة. وقيمة `refundType` هي `1` للاسترداد الكامل و `2` للاسترداد الجزئي القائم على الكمية على شراء متعدد الكميات.
كيف أُفعّل إشعارات الشراء المُلغى؟
في Play Console، افتح Monetize ثم Monetization setup، وفي قسم Real-time developer notifications حدّد Enable real-time notifications، ثم أدخِل اسم موضوع Cloud Pub/Sub الخاص بك. كلا خياري المحتوى، الاشتراكات مع جميع المشتريات المُلغاة، وذلك مع أحداث المنتجات لمرة واحدة، يشملان المشتريات المُلغاة.
ما الفرق بين إشعار الشراء المُلغى و Voided Purchases API؟
الإشعار إشارة دفع تُسلَّم في الوقت الفعلي عبر Cloud Pub/Sub لحظة إلغاء الشراء. أما Voided Purchases API فهي مسار سحب يستعلم عنه خادمك وفق جدوله الخاص لسرد الإلغاءات ضمن نطاق زمني. استخدم الإشعار للتفاعل فورًا والـ API للمطابقة وسدّ الفجوات.
هل يتيح لي إشعار الشراء المُلغى الاعتراض على الاسترداد؟
لا. إنه إشعار لاحق لقرار سبق اتخاذه. التدفّق الوحيد في Google Play الذي يأخذ مدخلاتك هو مراجعة السداد العكسي عبر `orders.reviewrefund`، ولديك 24 ساعة للرد، وعلى Apple يكون هو CONSUMPTION_REQUEST بنافذة مدتها 12 ساعة.

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

RefundHalt

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

تابع القراءة

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

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