كل المقالات
Playbookمدة القراءة 8 دقائق

إساءة استخدام الاسترداد المتكررة تكلفك مرتين، وإليك كيف يتيح لك المتجران الرد

العميل الذي يطلب الاسترداد مرة بعد مرة ليس حادثًا عابرًا. إساءة استخدام الاسترداد تكلفك المال المُعاد بالإضافة إلى الـ compute الذي أنفقته بالفعل، وكلا المتجرين يمنحك إشارة هوية، وهي appAccountToken من Apple و obfuscated account ID من Google، لربط النمط معًا.

بوابة دوارة في قاعة عبور معتمة يمر عبرها شخص واحد بشكل متكرر، لتوضيح إساءة استخدام الاسترداد المتكررة

أهم الخلاصات

  • تدفقان فقط للاسترداد يسمحان للمطور بتقديم أدلة ضد إساءة استخدام الاسترداد: CONSUMPTION_REQUEST من Apple، بنافذة مدتها 12 ساعة، ومراجعة رد المبالغ (chargeback) في Google Play عبر Review Refund API، بنافذة مدتها 24 ساعة.
  • appAccountToken من Apple هو UUID تُنشئه أنت وتُرفقه بعملية شراء، وتربطه StoreKit بالـ transaction الناتجة، حتى يتمكن خادمك من ربط كل استرداد بالحساب الدقيق الذي أجراه.
  • obfuscated account ID من Google Play هو سلسلة نصية مُجزّأة (hashed)، بحد أقصى 64 حرفًا، تستخدمها Google نفسها لاكتشاف النشاط غير المعتاد مثل شراء أجهزة كثيرة على حساب واحد خلال فترة قصيرة.
  • تخزين بيانات شخصية بنص واضح (cleartext) في obfuscated account ID من Google يؤدي إلى حظر مشترياتك، لذا يجب أن يكون الحقل قيمة مشفّرة أو hash أحادي الاتجاه، وليس بريدًا إلكترونيًا خامًا أبدًا.
  • حقل voidedReason في Google Play يميّز friendly_fraud و fraud كسببين مختلفين عن استرداد الندم (remorse) العادي، مما يتيح لك توجيه المسيئين المتكررين إلى قائمة مراجعة بدلًا من مسار الاسترداد والنسيان التلقائي.
  • تقول Google إنها منعت أكثر من $2 billion من المعاملات الاحتيالية والمسيئة في 2022، وحقول الهوية التي تغذّي ذلك النظام لا تعمل إلا إذا ملأتها في كل عملية شراء.
  • كل عملية شراء مُستردّة تحتفظ بوصولها هي إنفاق على compute و storage و API تستمر في دفعه على مال أعدته بالفعل، والمسترِد المتكرر يضاعف تلك الفاتورة عن قصد.

الاسترداد الواحد هو تكلفة ممارسة العمل. أما الحساب نفسه الذي يطلب الاسترداد للمرة الرابعة، بعد استخدام ما اشتراه في كل مرة، فهو إساءة استخدام للاسترداد، وهو نمط لا يمكنك رؤيته إلا إذا حملت كل عملية شراء هوية تتحكم فيها. كل من Apple و Google يمنحك تلك الهوية، وكلاهما يمنحك نافذة ضيقة لتضعها أمام المتجر قبل البت في استرداد أو رد مبالغ. إن فاتتك النافذة، أو لم ترفق الهوية أبدًا، بدا المسترِد المتكرر تمامًا كعميل غير راضٍ لأول مرة. إليك كيف تميّز بينهما، وكم يساوي هذا الفرق من المال.

لماذا إساءة استخدام الاسترداد مشكلة هوية، لا مشكلة استرداد

المتجر يقرر الاسترداد. لا يمكنك منع عميل من الطلب، وفي معظم التدفقات لا يمكنك منع المتجر من الموافقة. ما يمكنك فعله هو تحديد ما إذا كان حساب معيّن قد فعل هذا من قبل، وما إذا كان المحتوى الذي اشتراه قد سُلّم واستُخدم فعلًا. كلا الأمرين سؤال عن الهوية: أي من مستخدميك يقف خلف هذه الـ transaction، وما هو سجله. إن لم تحمل مشترياتك معرّفًا ثابتًا يعود إلى سجلات مستخدميك، فلن تستطيع الإجابة عن أي من السؤالين، ويصل كل استرداد بلا سياق.

تلك هي الفجوة الحقيقية. آليات الاسترداد ثابتة بموجب السياسة. أما الأدلة التي تجلبها إليها فهي مِلكك بالكامل لتبنيها، وتبدأ من لحظة الشراء، لا من لحظة الاسترداد.

النافذتان اللتان تغيّر فيهما الأدلة النتيجة

هناك تدفقان بالضبط يمكن لأي شيء ترسله أن يحرّك فيهما قرارًا. يُطلق CONSUMPTION_REQUEST من Apple عندما يطلب عميل استرداد مبلغ عن سلعة قابلة للاستهلاك أو اشتراك تلقائي التجديد، ولديك 12 ساعة للرد. تُطلق مراجعة رد المبالغ في Google Play عندما يعترض مستخدم على رسم لدى بنكه، ولديك 24 ساعة للرد عبر Review Refund API. أما كل استرداد آخر، أي استرداد الخدمة الذاتية في Play خلال 48 ساعة، والاسترداد الممنوح عبر الدعم، والاسترداد التلقائي لعملية شراء غير مُقرّة، فيُبتّ فيه من دونك.

كلتا قناتي الأدلة أقوى بكثير عندما تحمل الـ transaction معرّفك بالفعل. يمكن أن تتضمن consumption information من Apple الـ appAccountToken إلى جانب سجل الحساب وإنفاقه، ويمكن لمراجعة Google أن تستند إلى obfuscated account ID الذي تراقبه منذ الشراء. الحساب بلا معرّف هو حساب بلا سجل لتقديمه.

حقلا الهوية، جنبًا إلى جنب

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

Apple: appAccountToken

appAccountToken هو UUID تُنشئه وتمرّره عند بدء عملية شراء. تربطه StoreKit بالـ transaction الناتجة، ويظهر في بيانات الـ transaction التي يتحقق منها خادمك وفي consumption information التي تُعيد إرسالها أثناء CONSUMPTION_REQUEST. وبما أنها قيمتك، فإنها تربط transaction المتجر مباشرة بالحساب في قاعدة بياناتك، دون أي بريد إلكتروني أو اسم. يجب أن يكون UUID حقيقيًا، وأي شيء آخر يُرفض. أضافت Apple لاحقًا نقطة نهاية Set App Account Token يمكنها إرفاق الرمز أو تحديثه على معاملات سابقة، بما في ذلك مشتريات تمت خارج تطبيقك مثل استبدال أكواد العروض.

Google Play: obfuscated account ID

نظير Google هو setObfuscatedAccountId، وهو سلسلة نصية اختيارية مرتبطة بالحساب المشتري. وثائق Google نفسها صريحة بشأن غرضه: يستخدمه Google Play لاكتشاف النشاط غير المعتاد، مثل أجهزة كثيرة تجري مشتريات على الحساب نفسه خلال فترة وجيزة، ولحظر بعض المعاملات الاحتيالية قبل اكتمالها. وهو محدود بـ 64 حرفًا، ويجب ألا يحمل بيانات شخصية بنص واضح (cleartext). خزّن بريدًا إلكترونيًا خامًا هناك وتحظر Google عملية الشراء مباشرة، لأن الحقل يتوقع قيمة مشفّرة أو hash أحادي الاتجاه. وهناك حقل شقيق، setObfuscatedProfileId، موجود للتطبيقات التي يحمل فيها حساب واحد عدة ملفات تعريف.

FieldStoreالنوع والحديُضبط بواسطةالافتراضيما يفعله المتجر به
appAccountTokenAppleUUIDأنت، عند الشراءغير مضبوطيربط الـ transaction بمستخدمك، ويُعاد في بيانات الـ transaction و consumption
obfuscatedAccountIdGoogle Playسلسلة مُجزّأة، بحد أقصى 64 حرفًاأنت، عند الشراءغير مضبوطيكتشف النشاط غير المعتاد ويحظر بعض الاحتيال قبل الاكتمال

كم يكلّف فعليًا استرداد من مُسيء متكرر

الاسترداد نفسه هو أصغر جزء من الفاتورة. عندما يمنح المتجر استردادًا، تعيد الإيراد، وهذا القدر ظاهر في السجل. ما لا يظهر في سطر الاسترداد هو كل ما أنفقته لتسليم المنتج الذي أصبح الآن مجانيًا.

تخيّل سلعة قابلة للاستهلاك تُطلق عملًا حقيقيًا: توليد صورة، دفعة من API calls إلى مزوّد نموذج، تصدير فيديو، دفعة لمنشئ محتوى. لقد دفعت مقابل ذلك الـ compute لحظة استخدام العميل له. الاسترداد يستعيد السعر، لكنه لا يستعيد فاتورة المزوّد. المسترِد المتكرر هو من تعلّم أن المحتوى ينجو من الاسترداد، فيعيد تشغيل الحلقة: يشتري، يستهلك، يسترد، يكرر. في كل دورة، تتحمل تكلفة التسليم مرة ثانية.

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

تصف Google الحجم بوضوح: تقول إنها منعت أكثر من $2 billion من المعاملات الاحتيالية والمسيئة في 2022. ذلك الرقم موجود لأن الإشارات، ومنها obfuscated account ID، كانت مملوءة. التطبيق الذي يشحن مشتريات بحقول هوية فارغة يتنازل عن تلك الحماية.

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

كيف تكتشف المستردّين المتكررين قبل أن يقرر المتجر

وسِم كل عملية شراء بهوية تملكها

اضبط appAccountToken على كل عملية شراء عبر StoreKit و setObfuscatedAccountId على كل عملية شراء عبر Play Billing، كلاهما مُولّد من سجل مستخدمك الخاص. على Apple، استخدم UUID حقيقيًا مرتبطًا بالحساب. على Google، جزّئ (hash) مفتاح الحساب حتى لا تنتقل أي بيانات شخصية بنص واضح. افعل هذا وقت الشراء، لأنه على Google هو الخطوة الوحيدة التي لا يمكنك استعادتها لاحقًا.

احتفظ بسجل مفتاحه تلك الهوية

خزّن كل عملية شراء وتسليم وحدث استهلاك واسترداد مقابل المعرّف. عندما تصل CONSUMPTION_REQUEST أو مراجعة رد مبالغ، يكون سجل الحساب الكامل، بما في ذلك عمليات الاسترداد السابقة، على بُعد عملية بحث واحدة. تحتوي consumption information من Apple على حقول صريحة لهذا بالضبط: consumptionStatus و deliveryStatus و playTime و accountTenure و lifetimeDollarsPurchased، و refundPreference الخاص بك.

اقرأ voidedReason ووجّه المسيئين بطريقة مختلفة

عندما تُلغى عملية شراء في Google، يخبرك حقل voidedReason بالسبب، و friendly_fraud و fraud قيمتان منفصلتان عن استرداد الندم (remorse) العادي. وجّه تلك إلى قائمة مراجعة وسياسة أكثر صرامة، لا إلى المسار التلقائي نفسه الذي يسلكه استرداد لأول مرة. إرشادات Google نفسها نموذج متعدد الإنذارات: حذّر المخالف لأول مرة، واتخذ إجراءً أكثر حزمًا مع المتكررين، وعطّل المشتريات لحساب يواصل ذلك.

أجب على النافذة في كل مرة

الأدلة لا تُحتسب إلا داخل النافذتين. أتمِت رد CONSUMPTION_REQUEST بحيث يُطلق قبل انقضاء 12 ساعة بوقت كافٍ، ومراجعة رد المبالغ بحيث تُطلق خلال 24 ساعة. السجل المثالي الذي تقدّمه متأخرًا هو سجل لا يقرؤه المتجر أبدًا.

الإشارة التي تريد التقاطهاأين توجدالحقل أو التدفق الذي يُظهرها
الحساب نفسه، أجهزة كثيرة، فترة قصيرةGoogle Playكشف النشاط غير المعتاد عبر Obfuscated account ID
هذا الحساب سبق أن استردسجلكسجل مفتاحه appAccountToken أو obfuscated account ID
المحتوى سُلّم واستُهلكAppledeliveryStatus و consumptionStatus في consumption info
النزاع في الواقع احتيال من الطرف الأولGoogle Playقيمة voidedReason وهي friendly_fraud

ما سيفعله المتجران لك وما لن يفعلاه

من المفيد أن نكون دقيقين بشأن تقسيم العمل، لأنه من السهل افتراض أن المتجرين يتوليان إساءة الاستخدام، وهما في الغالب لا يخبرانك حين لا يفعلان. تستخدم Google بنشاط obfuscated account ID لحظر بعض الاحتيال قبل اكتمال عملية شراء، وتلتقط أنظمتها حصة كبيرة على مستوى المنصة. تقرر Apple كل استرداد بنفسها وتعامل consumption information لديك كمُدخل، لا كتصويت أبدًا. لا أحد من المتجرين يحتفظ بقائمة المسيئين نيابة عنك، أو يخصم سلعة قابلة للاستهلاك مُستردّة من رصيدك، أو يقول لا لمسترِد متكرر نيابة عنك. الهوية للمتجر ليتصرف بها عند الأطراف ولك لتتصرف بها في كل مكان آخر.

لهذا السبب نفسه تجعل RefundHalt كل شيء مفتاحه هوية الشراء: استرداد ومراجعة رد مبالغ وطلب استهلاك للحساب نفسه تُحلّ جميعها إلى سجل واحد، حتى يظهر المسترِد المتكرر كنمط أول مرة يكرر فيها، لا بعد الفاتورة الرابعة التي دفعتها بالفعل.

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

ما هي إساءة استخدام الاسترداد في أحد التطبيقات؟
إساءة استخدام الاسترداد هي أن يطلب عميل الاسترداد مرارًا بعد استلام واستخدام ما اشتراه، فيحتفظ بالمحتوى أو المنفعة بينما يستعيد المال. على متاجر التطبيقات تظهر عادة كالحساب نفسه يسترد سلعًا قابلة للاستهلاك أو اشتراكات مرة بعد مرة، أو كاحتيال ودّي (friendly fraud)، حيث يُعترض على رسم مشروع لدى البنك.
كيف أربط عملية شراء داخل التطبيق بمستخدم محدد؟
على Apple، أنشئ UUID ومرّره كـ appAccountToken عند بدء الشراء، وتربطه StoreKit بالـ transaction وتعيده في بيانات الـ transaction و consumption. على Google Play، استدعِ setObfuscatedAccountId بقيمة مُجزّأة مرتبطة بالحساب. كلاهما يربط transaction المتجر بسجل مستخدمك دون كشف بيانات شخصية.
هل يمكن لـ Apple أو Google إخباري بأن حسابًا هو مسترِد متكرر؟
ليس مباشرة. تستخدم Google obfuscated account ID لاكتشاف النشاط غير المعتاد وحظر بعض الاحتيال قبل الشراء، وتتيح لك Apple تقديم سجل الحساب أثناء طلب الاستهلاك، لكن لا أحد من المتجرين يسلّمك قائمة بالمستردّين المتكررين. أنت تبني ذلك بنفسك من سجلك الخاص المفتاح فيه حقول الهوية.
لماذا تحظر Google عملية الشراء عندما أضبط account ID؟
لأن obfuscated account ID يجب ألا يحتوي على بيانات شخصية بنص واضح (cleartext). تخزين شيء مثل عنوان بريد إلكتروني خام فيه يجعل Google Play يحظر عملية الشراء. استخدم قيمة مشفّرة أو hash أحادي الاتجاه، وابقَ ضمن حد الـ 64 حرفًا.
هل الطعن في عمليات الاسترداد عبر طلب الاستهلاك يوقف إساءة الاستخدام؟
يمكن أن يقلّلها. CONSUMPTION_REQUEST هو واحد من تدفقين فقط تصل فيهما أدلتك إلى المتجر قبل أن يقرر، وسجل الحساب إلى جانب بيانات التسليم والاستهلاك يساعدان Apple على تحديد إساءة استخدام الإرجاع والاحتيال الودّي. لكنه ليس حظرًا. لا تزال Apple تقرر، وإساءة الاستخدام التي تصل عبر تدفقات غير قابلة للطعن تبقى غير متأثرة.

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

RefundHalt

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

تابع القراءة

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

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