خرید با Package و پیگیری نتیجه
خرید فروشگاهی و Direct با پکیج، Activity کاتلین، idempotencyKey، نتیجه نامشخص و رویداد و تاریخچه نسخه 0.2.1.
ابتدا آفرینگ مناسب را دریافت و همان Package را نگه دارید. SDK از آن productIdentifier، offeringIdentifier، packageIdentifier و نوع محصول را میخواند؛ دولوپر نباید این اطلاعات را از متن نمایشی حدس بزند.
Flutter
packageToPurchase اجباری است. idempotencyKey، paywallId و paywallRevision اختیاریاند و پیشفرض null دارند؛ attribution آیدی/نسخه باید جفت و مربوط به همان paywall باشد. در نبود key، SDK یکی میسازد. برای پیگیری میزبان پس از بستهشدن اپ، پیش از خرید یک key معتبر ذخیره و فقط برای همان تلاش منطقی استفاده کنید. کلید ۱ تا ۱۲۸ کاراکتر از حروف، رقم و _ . : - دارد.
پل Android خودش Activity را فراهم میکند. API عمومی جدید ورودی apiKey، market/RSA، مبلغ تخفیف، isCrypto یا override نوع محصول ندارد. نسخه ساده purchase(params) nullable است؛ برای تصمیم مالی از Result استفاده کنید.
Kotlin: فروشگاه و Direct
Activity برای شروع خرید تازه استور لازم است؛ Builder بدون Activity برای Direct یا ادامه کار پرداختشده کاربرد دارد. Activity-backed params را بیرون عمر Activity نگه ندارید. سازنده اختیاری paywallAttribution(id, revision) مخصوص context معتبر Direct است؛ مبلغ خرید را تعیین نمیکند.
نتیجه عملیات و نتیجه پرداخت
| وضعیت | کار میزبان |
|---|---|
NEEDTOPAY و URL | ادامه در مرورگر معتبر؛ بدون اعطای دسترسی |
PROCESSING یا خطای retryable نامشخص | انتظار/بازیابی همان تلاش؛ بدون پرداخت دوم |
COMPLETED، RESTORED، ALREADY_PROCESSED | بررسی CustomerInfo برای دسترسی |
DELIVERY_REQUIRED | تحویل ماندگار و یکتای مصرفی |
CONSUME_REQUIRED | تکمیل مرحله مصرف؛ بدون افزودن دوباره موجودی |
REJECTED | عدم اعطای دسترسی یا موجودی |
همه این برچسبها لزوماً بهصورت Success برنمیگردند؛ بعضی وضعیتهای درانتظار در Failure قابلبازیابی ظاهر میشوند. در Flutter از mobile.storePurchaseStatus و در Kotlin از storePurchaseStatus استفاده کنید. isSuccess فقط موفقیت عملیات SDK است.
پرداخت مستقیم
میزبان لینک را باز میکند. روی موبایل ابتدا InappifySdk.isPaymentUrlAllowed(url) را await و success/data برابر true را بررسی کنید؛ Kotlin extension client.isPaymentUrlAllowed(url) Boolean است. مقصد Direct مجاز طبق تنظیم SDK بررسی میشود؛ query یا URL دلخواه کاربر را جایگزین نکنید.
Android نتیجه Direct جدید را با attempt اصلی و backend سازگار پیگیری میکند. روی iOS، key این نسخه فقط همبستگی محلی نتیجه/خطاست و داخل درخواست Direct ارسال نمیشود؛ تکرار با همان key تضمین deduplication سرور نیست. نتیجه مبهم را پیش از پرداخت بعدی بازیابی و بررسی کنید.
وب از checkout جداگانه استفاده میکند و return آن با checkout ID بررسی میشود؛ نمونه وب را دنبال کنید. لینک برگشت، بستن مرورگر و موفقیت ایجاد checkout اثبات پرداخت نیستند.
Android: پیگیری پس از بستهشدن اپ
پیش از خرید listener را وصل کنید؛ هنگام پایان مالک UI اشتراک را cancel کنید. Kotlin از client.addEventListener { event -> event.purchaseAttempt ... } استفاده میکند و registration قابل close میدهد. getPurchaseAttempts() نیز تاریخچه همان نشست را میخواند؛ شبکه و استور اجرا نمیکند.
وضعیت تلاشها pending/succeeded/failed است. موفقیت lookup با null یعنی نامشخص، نه شکست. تاریخچه Android رمزشده، محدود و وابسته به app/customer/market است؛ events ممکن است تکرار شوند یا زمان بستهبودن اپ از دست بروند. پس از configure تاریخچه را برای تلاش ذخیرهشده بررسی کنید. وجود موفقیت قبلی نیز جای CustomerInfo جاری یا موجودی ماندگار نیست.
خطای شبکه، تغییر حساب، خروجی خالی sync و رویداد نامرتبط نباید سابقه تلاش را پاک یا خرید جدید شروع کند. این API تاریخچه روی iOS و Flutter Web پشتیبانی نمیشود.