یونیتی (Unity)

با توجه به اینکه یونیتی در نسخه‌های اخیر امکان استفاده از Gradle را فراهم کرده است، پیشنهاد می‌شود که از روش پرداخت درون‌برنامه‌ای یونیتی با Gradle استفاده کنید. ضمنا استفاده از این روش جدید، به‌روزرسانی کتابخانه‌ی پرداخت یونیتی را برای شما ساده‌تر می‌کند.

برای دریافت آخرین نسخه پلاگین پرداخت درون برنامه‌ای مایکت در Unity اینجا کلیک کنید

راه‌اندازی

برای راه‌اندازی کافیست بسته مربوطه را دانلود و وارد پروژه خود کنید. سپس در فایل  AndroidManifest.xml خود سه تغییر زیر را ایجاد نمایید:

۱. اضافه کردن دسترسی به اینترنت و خرید از مایکت

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="ir.mservices.market.BILLING" />

۲. اضافه کردن Activityهای مربوط به پلاگین در قسمت Application

۳. تکه کد زیر را اضافه کنید

<application>
    ...
    <receiver android:name="com.myket.util.IABReceiver">
        <intent-filter>
            <action android:name="ir.mservices.market.ping" />
            <action android:name="ir.mservices.market.purchase" />
            <action android:name="ir.mservices.market.getPurchase" />
            <action android:name="ir.mservices.market.billingSupport" />
            <action android:name="ir.mservices.market.skuDetail" />
            <action android:name="ir.mservices.market.consume" />
        </intent-filter>
    </receiver>
</application>

به یاد داشته باشید که نیازی به اضافه کردن هیچ Prefab یا Script خاصی در پروژه خود ندارید، پلاگین به طور خودکار یک شی با نام MyketIABPlugin می‌سازد که دارای یک فرزند به نام MyketPlugin.IABEventManager است که نباید در طول برنامه پاک یا تغییر نام داده شود.

معرفی توابع

توابع موجود در کلاس MyketIAB

public static void init(string publicKey)

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

public static void enableLogging(bool shouldEnable)

این تابع لاگ‌های فایل‌های کمکی را فعال می‌کند. دقت کنید که مقدارshouldEnable در حالت Release برابر با False باشد.

public static void unbindService()

زمانی که کار با سرویس پرداخت را تمام کردید، این تابع را فراخوانی کنید.

public static void queryInventory(string[] skus)

برای گرفتن اطلاعات محصولاتی که در پنل پرداخت درون‌برنامه‌ای تعریف کرده‌اید مثل قیمت، عنوان و … باید از این تابع استفاده کنید. همچنین لیست تمام محصولات خریداری شده‌ای که هنوز مصرف نشده‌اند نیز توسط این تابع برگردانده می‌شود (محصولات درون Inventory). این تابع در ورودی، لیستی از IDهای محصولات شما را دریافت می‌کند.

توجه کنید که برای جلوگیری از مشکلات احتمالی پرداخت، نیاز است در شروع برنامه، این تابع را فراخوانی کنید و در صورتی که محصولات شما مصرف‌شدنی است و محصولی دریافت کردید که مصرف نشده بود، آن را مصرف کنید و به کاربر خود تحویل دهید. برای محصولات مصرف‌نشدنی هم که لازم است با هر بار باز شدن برنامه این تابع را فراخوانی کنید تا مطلع شوید که آیا کاربر شما یکی از محصولات شما را خریداری کرده است یا خیر.
public static void querySkuDetails(string[] skus)

برای گرفتن اطلاعات محصولاتی که در پنل پرداخت درون‌برنامه‌ای تعریف کرده‌اید مثل قیمت، عنوان و … باید از این تابع استفاده کنید.

public static void purchaseProduct(string sku)public static void purchaseProduct(string sku, string developerPayload)

برای شروع فرایند خرید یک  محصول با نام sku باید از این تابع استفاده کنید. بعد از تلاش برای خرید دو رخداد فراخوانی خواهد شد یکی purchaseSucceededEvent است که در زمان‌های زیر فراخوانی می‌شود:

۱. زمانی که خرید موفقیت‌آمیز بود.

۲. زمانی که تلاش می‌کنید محصولی که قبلا خریده‌اید ولی مصرف نکرده‌اید را دوباره بخرید.

و دیگری رخداد purchaseFailedEvent است که در صورت ناموفق بودن خرید، فراخوانی خواهد شد.

خریدهایی که انجام می‌شوند به داخل Inventory خواهند رفت که اگر محصول مصرفی باشد باید بعد از موفقیت فرآیند خرید، آن را با استفاده از تابع consumeProduct مصرف کنید.

public static void consumeProduct(string sku)
public static void consumeProducts(string[] skus)

برای مصرف محصول خریداری شده باید از این تابع استفاده کنید. بعد از این که فرآیند مصرف به درستی انجام شد محصول از Inventory پاک می‌شود و شما اجازه خواهید داشت تا بار دیگر همان محصول را بخرید.

معرفی رخدادها

رخدادها از طریق کلاس MyketIABEventManager قابل دسترس هستند.

public static event Action billingSupportedEvent;

زمانی که پرداخت درون‌برنامه‌ای روی دستگاه پشتیبانی شود، فراخوانی می‌شود.

public static event Action<string> billingNotSupportedEvent;

بعد از فراخوانی تابع init اگر خرید درون‌برنامه‌ای ممکن نباشد، این رخداد فراخوانی می‌شود.

public static event Action<List<MyketPurchase>, List<MyketSkuInfo>> queryInventorySucceededEvent;

در صورتی که فراخوانی تابع queryInventory موفقیت‌آمیز باشد این رخداد فراخوانی می‌شود.

public static event Action<string> queryInventoryFailedEvent;

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

public static event Action<MyketPurchase> purchaseSucceededEvent;

زمانی که خرید موفقیت‌آمیز باشد، فراخوانی می‌شود.

public static event Action<string> purchaseFailedEvent;

زمانی که خرید موفقیت آمیز نباشد، فراخوانی می‌شود.

public static event Action<MyketPurchase> consumePurchaseSucceededEvent;

اگر تلاش برای مصرف یک محصول خریداری شده موفق باشد، فراخوانی می‌شود.

public static event Action<string> consumePurchaseFailedEvent;

اگر تلاش برای مصرف یک محصول خریداری شده ناموفق باشد، فراخوانی می‌شود.

نکته: در صورتی که Target API Level شما بزرگ‌تر یا برابر با 30 است، از دید سیستم‌عامل اندروید شامل Package Visibility Filtering می‌شود. این موضوع باعث می‌شود، در صورتی که برنامه‌ شما از طریق کلاینت مایکت نصب نشده باشد (مثلا از طریق کانال‌های تبلیغاتی و… نصب شده باشد) برای ارتباط سرویس درون‌برنامه‌ای با مایکت با مشکل مواجه شود.

برای رفع این مشکل کافی است تکه کد زیر را در قسمت <manifest> در فایل AndroidManifest پروژه خود اضافه کنید.

     <queries>
		<package android:name="ir.mservices.market" />
		<intent>
			<action android:name="ir.mservices.market.InAppBillingService.BIND" />
			<data android:mimeType="*/*" />
		</intent>
	</queries>
Was this article helpful?
Dislike 0
قبلی: یونیتی (Unity) با Gradle
بعدی: پلاگین خرید درون‌برنامه‌ای فلاتر (Flutter)