خطاها و چک‌لیست آزمون SDK

خطای ساختاریافته، آفرینگ خالی، نتیجه خرید نامشخص، قابلیت پشتیبانی‌نشده و چک‌لیست امن انتشار.

موفقیت فراخوانی، نبود انتخاب و شکست شبکه را جدا نگه دارید. خطای شبکه را «کد تخفیف نامعتبر» یا «اشتراک ندارد» ترجمه نکنید.

خواندن نتیجه

Flutter: ابتدا result.isSuccess، سپس result.data یا result.failure را بخوانید؛ failure شامل code، message، isRetryable و details است. Kotlin از InappifyResult.Success یا Failure.error با همین مفهوم استفاده می‌کند. بعضی جست‌وجوهای موفق null می‌دهند. JavaScript Promise را reject می‌کند؛ با isInAppifyError(error) خطای SDK را از خطاهای دیگر جدا کنید.

پیام diagnostic را بدون بررسی به کاربر نمایش ندهید. retryable مجوز تکرار کورکورانه پرداخت نیست؛ همان تلاش و context قبلی را حفظ کنید. credential، receipt، ticket و URL کامل پرداخت را در لاگ یا تیکت عمومی قرار ندهید.

نشانه‌های متداول

نشانهبررسی
configuration / notConfiguredکلید عمومی همان اپ، شناسه پکیج/bundle و انتظار تا پایان configure
unauthorizedنشست و برنامه درست؛ توکن دست‌ساز یا fallback حساب دیگر ممنوع
network / timeoutوضعیت موقت؛ برای خرید، reconcile پیش از پرداخت بعدی
purchaseCancelledپیام خنثی لغو؛ بدون grant
UI_HOST_NOT_SUPPORTEDFlutterFragmentActivity یا AndroidX Activity معتبر
PURCHASE_IN_PROGRESSجلوگیری از شروع هم‌زمان و کلیک تکراری
PRODUCT_TYPE_REQUIREDcatalog تازه و نوع محصول معتبر؛ نوع را حدس نزنید
PURCHASE_PACKAGE_CONTEXT_REQUIREDPackage کامل برگشتی از آفرینگ
RATE_LIMITED_NO_CACHEرعایت سقف ۵/۶۰؛ استفاده از retry timing
unsupportedOperationپشتیبانی واقعی پلتفرم، نه فقط وجود امضای متد
bridgeUnavailable روی وبفراهم‌کننده JS bundle و پیش از Flutter بارگذاری شده باشد

نام enumهای Kotlin و Flutter یکسان نیست؛ جزئیات native یا reason ممکن است داخل details باشند. مقدار نامشخص را به‌عنوان موفقیت مالی حدس نزنید.

آفرینگ خالی

کلید، محصول/پکیج، SKU، آفرینگ جاری، placement، شرایط هدف‌گذاری و مجوز feature وب را بررسی کنید. برای targeting مبتنی بر ویژگی، از مسیر sync پشتیبانی‌شده استفاده کنید. getOffering(id) نامعتبر نباید default را جایگزین کند.

پرداخت شده ولی نتیجه مشخص نیست

پرداخت دوم را خودکار شروع نکنید. Android همان attempt ذخیره‌شده را با history/events و در صورت نیاز syncStorePurchases() بررسی می‌کند. iOS از CustomerInfo جاری و Direct delivery پشتیبانی‌شده استفاده می‌کند؛ وب checkout ID را از سرور پیگیری می‌کند. وضعیت مشتری و تراکنش در پنل نیز به تشخیص کمک می‌کند. تحویل مصرفی ممکن است منتظر grant میزبان باشد.

چک‌لیست پیش از انتشار

  • شروع مهمان و کاربر واردشده، restart، logout و تغییر حساب بدون داده حساب قبلی.
  • current، placement، شناسه آفرینگ دقیق و نبود انتخاب؛ نمایش واحد قیمت دریافتی بدون تبدیل حدسی ریال/تومان.
  • ثبت/حذف ویژگی و رفرش در سهمیه، صف خالی، خطای شبکه و محدودیت ۵/۶۰.
  • خرید موفق، لغو، کلیک تکراری، قطع شبکه بعد از پرداخت و بسته‌شدن اپ.
  • lookup نامشخص و رویداد نامرتبط بدون پاک‌کردن journal یا پرداخت دوباره.
  • مصرفی با grant ماندگار، شکست confirm و restart بدون دوبرابرشدن موجودی.
  • انقضای اشتراک، حق دسترسی غیرفعال و failure بدون ادعای دسترسی قطعی.
  • وب با ticket/OTP، انتخاب آفرینگ تخفیف متفاوت و return جعلی بدون grant.

تست‌های عادی باید fake باشند و OTP یا خرید واقعی اجرا نکنند. بررسی زنده استور را با حساب/محصول آزمایشی مجاز انجام دهید؛ نمونه مستندات رایگان‌بودن تراکنش را تضمین نمی‌کند. بیلد و unit test، تأیید پرداخت واقعی یا استقرار backend نیستند.

مرجع متدها · Skill برای ایجنت