پرش به مطلب اصلی

سوالات متداول پرداخت درون‌برنامه‌ای مایکت

تفاوت محصولات مصرفی (Consumable) و غیرمصرفی (Non-Consumable) چیست؟​

محصولات inapp از نظر منطق خرید به دو دسته تقسیم می‌شوند:

  • محصولات غیرمصرفی (Non-Consumable): کاربر این محصولات را یک‌بار می‌خرد و برای همیشه مالک آن‌ها می‌ماند؛ مانند حذف تبلیغات، نسخه ویژه یا بازکردن مراحل قفل‌شده. این محصولات را نباید مصرف (Consume) کنید.
  • محصولات مصرفی (Consumable): کاربر می‌تواند این محصولات را چند بار بخرد؛ مانند سکه، بنزین یا اعتبار. پس از خرید موفق، محصول را مصرف کنید و پس از دریافت پاسخ موفق مصرف، آن را به کاربر تحویل دهید تا امکان خرید دوباره فراهم شود.

آیا خرید اشتراک (Subscription) و تمدید خودکار در مایکت پشتیبانی می‌شود؟​

خیر. در حال حاضر پرداخت درون‌برنامه‌ای مایکت (ir.mservices.market) از خرید اشتراک (subs) و تمدید خودکار پشتیبانی نمی‌کند. برای ارائه اشتراک‌های زمان‌دار، مانند اشتراک یک‌ماهه یا سه‌ماهه، محصول را به‌صورت مصرفی (inapp) تعریف کنید، پس از هر خرید آن را مصرف کنید و تاریخ انقضای اشتراک را در سرور خود مدیریت کنید.

چرا باید در ابتدای اجرای برنامه خریدهای کاربر را استعلام کنیم؟​

استعلام خریدها در شروع برنامه به دو دلیل مهم است:

۱. بازیابی محصولات غیرمصرفی: اگر کاربر برنامه را دوباره نصب کند یا در دستگاه دیگری وارد حساب خود شود، استعلام به شما امکان می‌دهد محصولات غیرمصرفی خریداری‌شده، مانند نسخه ویژه، را بازیابی و فعال کنید.
۲. بازیابی خریدهای مصرفی ناتمام (Crash Recovery): ممکن است کاربر پرداخت را انجام داده باشد، اما پیش از تحویل محصول یا مصرف خرید، برنامه بسته یا اینترنت قطع شده باشد. استعلام خریدها کمک می‌کند این خریدهای ناتمام را شناسایی و تکمیل کنید.\

بهترین زمان برای تحویل محصول مصرفی به کاربر چه زمانی است؟​

ابتدا درخواست مصرف (Consume) را ارسال کنید و فقط پس از دریافت پاسخ موفقیت‌آمیز مصرف، محصولی مانند سکه یا بنزین را به موجودی کاربر اضافه و ذخیره کنید. این کار از تحویل چندباره محصول برای یک خرید، در اثر خطا یا قطع ارتباط، جلوگیری می‌کند.

آیا تغییر حروف کوچک و بزرگ packageName می‌تواند پرداخت را مختل کند؟​

بله. نام بسته (packageName یا applicationId) به حروف کوچک و بزرگ حساس است. نام بسته تنظیم‌شده در پروژه باید دقیقاً با نام بسته ثبت‌شده در پنل توسعه‌دهندگان مایکت مطابقت داشته باشد؛ در غیر این صورت اتصال به سرویس پرداخت یا شناسایی محصولات ممکن است با خطا مواجه شود.

کلید عمومی (Public Key / RSA Key) چیست و چگونه باید از آن نگهداری کرد؟​

کلید عمومی، رشته‌ای مخصوص هر برنامه است که در بخش پرداخت درون‌برنامه‌ای پنل توسعه‌دهندگان مایکت قرار دارد و برای بررسی امضای دیجیتال خریدها استفاده می‌شود. کلید عمومی، برخلاف کلید خصوصی، راز محسوب نمی‌شود؛ اما باید کلید درستِ همان برنامه را از پنل دریافت کنید و از جایگزینی آن با مقدار نامعتبر جلوگیری کنید. برای امنیت بیشتر، اعتبارسنجی امضای خرید را ترجیحاً در سرور خود انجام دهید. مبهم‌سازی یا بازسازی کلید در زمان اجرا ممکن است استخراج آن را دشوارتر کند، اما به‌تنهایی امنیت پرداخت را تضمین نمی‌کند.

پارامتر developerPayload چیست و چه ویژگی‌هایی باید داشته باشد؟​

developerPayload رشته‌ای دلخواه و اختیاری است که هنگام شروع خرید ارسال می‌شود و پس از پایان خرید در اطلاعات رسید به برنامه بازگردانده می‌شود. برای استفاده از آن:

۱. از رشته‌ای استفاده نکنید که فقط به‌صورت محلی روی همان دستگاه ذخیره شده باشد؛ در دستگاه دیگر به آن دسترسی نخواهید داشت.
۲. برای کاربران یا سفارش‌های مختلف مقدار متمایزی در نظر بگیرید تا تطبیق خرید با کاربر یا سفارش ممکن باشد.
۳. مقدار و توکن خرید را در سرور خود ذخیره و اعتبارسنجی کنید.
۴. آن را برای اثبات مالکیت خرید یا جایگزینی اعتبارسنجی امضا به کار نبرید.\

حداکثر طول مجاز developerPayload چقدر است؟​

حداکثر طول مجاز developerPayload برابر ۸۰۰ کاراکتر است. مقدار ارسالی را کوتاه نگه دارید؛ عبور از این حد ممکن است با کد خطای 6 (Error) یا بسته‌شدن سریع پنجره پرداخت همراه باشد.

چرا استعلام محصولات (queryInventory) هیچ محصولی برنمی‌گرداند؟​

نتیجه خالی استعلام معمولاً یکی از علت‌های زیر را دارد:

۱. شناسه محصولات (skuIds) ارسال نشده است: اگر کاربر هنوز محصولی نخریده و می‌خواهید جزئیات محصول، مانند قیمت و عنوان، را دریافت کنید، دریافت جزئیات (querySkuDetails) را فعال و شناسه محصولات را به متد استعلام ارسال کنید.
۲. SKU در پنل تعریف یا فعال نشده است: شناسه‌های ارسالی باید دقیقاً، با رعایت حروف کوچک و بزرگ، در پنل توسعه‌دهندگان مایکت تعریف شده و فعال باشند.
۳. محصول مصرف شده است: محصولات مصرفی پس از Consume دیگر در فهرست خریدهای فعال کاربر قرار نمی‌گیرند.
۴. نام بسته مطابقت ندارد: نام بسته برنامه باید با نام بسته ثبت‌شده در پنل مایکت یکسان باشد.\

چرا خطای Signature verification failed (کد -1003) دریافت می‌کنم؟​

این خطا یعنی امضای دیجیتال خرید بازگشتی از مارکت با کلید عمومی استفاده‌شده در برنامه مطابقت ندارد. علت‌های رایج:

۱. کلید عمومی از پنل مایکت اشتباه کپی شده یا متعلق به برنامه دیگری است.
۲. هنگام واردکردن کلید در کد یا تنظیمات افزونه، فاصله یا کاراکتر اضافه‌ای وارد شده است.
۳. در پروژه چندمارکتی، به‌جای کلید عمومی مایکت از کلید مارکت دیگری استفاده شده است.\

خطای 3:Billing Unavailable چیست و چرا رخ می‌دهد؟​

این خطا نشان می‌دهد سرویس پرداخت در شرایط فعلی روی دستگاه کاربر قابل استفاده نیست. علت‌های احتمالی:

۱. کاربر در اپلیکیشن مایکت وارد حساب خود نشده است.
۲. نسخه نصب‌شده مایکت قدیمی است.
۳. پرداخت درون‌برنامه‌ای برای برنامه در پنل توسعه‌دهندگان مایکت فعال نشده است.
۴. اپلیکیشن مایکت نصب نیست و در پرداخت وب، مرورگر Google Chrome در دسترس نیست یا اینترنت قطع است.
۵. تنظیمات مانیفست یا شناسه مارکت (ir.mservices.market) درست پیکربندی نشده است.\

خطای Item Already Owned (کد 7) به چه معناست و چگونه رفع می‌شود؟​

این خطا زمانی رخ می‌دهد که کاربر محصول را قبلاً خریده و پیش از مصرف آن دوباره برای خرید همان محصول اقدام می‌کند.

  • اگر محصول غیرمصرفی است، مالکیت قبلی را با استعلام خریدها بررسی و محصول را فعال کنید؛ خرید دوباره را به کاربر پیشنهاد ندهید.
  • اگر محصول مصرفی است، احتمالاً مصرف خرید قبلی تکمیل نشده است. خریدهای کاربر را با queryInventory استعلام کنید، خرید مصرف‌نشده را مصرف کنید و محصول را تحویل دهید تا امکان خرید دوباره فراهم شود.

خطای SkuAlreadyConsumed یا Item not owned (کد 8) به چه معناست؟​

این خطا زمانی رخ می‌دهد که می‌خواهید محصول یا توکن خریدی را مصرف کنید که قبلاً مصرف شده یا کاربر مالک آن نیست. بررسی کنید که برای یک خرید، متد مصرف را بیش از یک بار فراخوانی نمی‌کنید.

خطای another async operation ... is in progress (کد -1011) چیست و چگونه از آن جلوگیری کنم؟​

سرویس پرداخت در هر لحظه فقط اجازه اجرای یک عملیات غیرهمزمان (Async)، مانند استعلام، خرید یا مصرف، را می‌دهد. اگر پیش از پایان عملیات قبلی، عملیات جدیدی را فراخوانی کنید این خطا رخ می‌دهد.

  • پیش از فعال‌کردن امکان خرید، منتظر بمانید استعلام اولیه (queryInventory) کامل شود.
  • هنگام اجرای عملیات پرداخت، وضعیت انتظار نمایش دهید و دکمه‌های خرید را غیرفعال کنید تا چند درخواست هم‌زمان ارسال نشود.

خطای Developer Error (کد 5) به چه دلایلی رخ می‌دهد؟​

  • نام بسته (packageName) برنامه با نام ثبت‌شده در پنل توسعه‌دهندگان مایکت مطابقت ندارد.
  • پارامترهای متد خرید، مانند sku یا itemType، نامعتبر یا خالی هستند.

هنگام بروز مشکل در پیاده‌سازی پرداخت، چه اطلاعاتی را برای پشتیبانی فنی ارسال کنم؟​

  • پیش از تماس با پشتیبانی، سناریوی مشکل را در برنامه نمونه رسمی بررسی کنید.
  • لاگ کامل Logcat را از شروع پرداخت تا دریافت نتیجه، همراه با responseCode و پیام‌های callback، ثبت و ارسال کنید. پیش از ثبت لاگ، enableDebugLogging(true) را فعال کنید.
  • نسخه دقیق SDK یا افزونه، پلتفرم یا موتور بازی‌سازی، مدل دستگاه، نسخه اندروید و مراحل دقیق بازتولید مشکل (Steps to Reproduce) را ارائه دهید.