در این مستند با نحوه پیادهسازی سرویس پرداخت درونبرنامهای مایکت برای برنامههای تحت Flutter آشنا میشوید. برای مشاهده نحوهٔ پیادهسازی اینجا را ببینید. همچنین سورس کد کتابخانهی فلاتر اینجا موجود است.
نصب Plugin
جهت پیادهسازی In App Billing در برنامههای Flutter کافی است dependency مایکت را به pubspec.yaml خود به صورت زیر اضافه کنید:
myket_iap: ^1.1.5
پکیج زیر را در کلاس خود Import کنید:
import 'package:myket_iap/myket_iap.dart';
بهروزرسانی از نسخهٔ ۱.۰.۶ به ۱.۱.۰
از فایل AndroidManifest.xml دسترسی زیر را حذف کنید:
<uses-permission android:name="ir.mservices.market.BILLING" />
از فایل AndroidManifest.xml قسمت queries زیر را حذف کنید:
<queries> <package android:name="ir.mservices.market" /> <intent> <action android:name="ir.mservices.market.InAppBillingService.BIND" /> <data android:mimeType="*/*" /> </intent> </queries>
پیادهسازی
در فایل build.gradle مقادیر زیر را اضافه کنید:
android { defaultConfig { def marketApplicationId = "ir.mservices.market" def marketBindAddress = "ir.mservices.market.InAppBillingService.BIND" manifestPlaceholders += [marketApplicationId: "${marketApplicationId}", marketBindAddress : "${marketBindAddress}", marketPermission : "${marketApplicationId}.BILLING"] } compileOptions { sourceCompatibility 17 targetCompatibility 17 } ... }
مطمئن شوید از کاتلین نسخهی 1.9.10 به بالا و جاوا با نسخهی 17 استفاده میکنید.
این plugin به صورت static است و نیازی به ایجاد شی ندارد.
در نصب سرویس پرداخت درونبرنامهای مایکت باید قبل از هر تابع دیگری این تابع صدا زده شود تا از وضعیت نصب بودن مایکت و پشتیبانی کردنش از این سرویس اطلاع پیدا کنید، این تابع را میتوانید در متد initState() صدا بزنید:
var iabResult = await MyketIAP.init(rsaKey: rsa, enableDebugLogging: true);
پارامتر rsaKey کلید عمومی است که از پنل توسعهدهنگان مایکت گرفتهاید.
توجه کنید با تغییر پارامتر enableDebugLogging میتوانید لاگهای مربوط به خرید را مشاهده نمایید و مقدار جواب این متد کلاس IabResult است.
برای خرید یک محصول از متد launchPurchaseFlow به صورت زیر استفاده کنید:
Map<String, dynamic> result = await MyketIAP.launchPurchaseFlow(sku: "gas", payload:"payload");
پارامتر sku شناسه محصول درونبرنامهای است که قصد خرید آن را دارید.
پارامتر payload رشته developerPayload برای مشخص کردن هر اطلاعات اضافی که مایلید مایکت به همراه اطلاعات خرید برای شما برگرداند، استفاده میشود.
جواب این متد به صورت یک Map متشکل از IabResult و Purchase است، برای دسترسی به این دو مقدار از کد زیر استفاده کنید.
IabResult purchaseResult = result[MyketIAP.RESULT]; Purchase purchase = result[MyketIAP.PURCHASE];
هنگامی که محصولی توسط کاربر خریداری میشود، آن کاربر مالک آن محصول تلقی میشود و امکان خرید دوباره آن را نخواهد داشت. شما باید یک درخواست مصرف به مایکت ارسال کنید تا مایکت اجازه خرید دوباره محصول را به کاربر بدهد. برای این کار از متد consume به صورت زیر استفاده کنید:
Map<String, dynamic> result = await MyketIAP.consume(purchase: purchase);
پارامتر purchase محصول خریداری شده است.
جواب این متد به صورت یک Map متشکل از IabResult و Purchase است، برای دسترسی به این دو مقدار از کد زیر استفاده کنید:
IabResult purchaseResult = result[MyketIAP.RESULT]; Purchase purchase = result[MyketIAP.PURCHASE];
برای گرفتن وضعیت یک محصول از متد getPurchase به صورت زیر استفاده کنید:
Map<String, dynamic> result = await MyketIAP.getPurchase(sku: "gas", querySkuDetails: false);
پارامتر sku شناسه محصول درونبرنامهای که وضعیت آن را میخواهید.
پارامتر querySkuDetails در صورت true بودن اطلاعات محصول را نیز برمیگرداند.
جواب این متد به صورت یک Map متشکل از IabResult و Purchase است، برای دسترسی به این دو مقدار از کد زیر استفاده کنید:
IabResult purchaseResult = result[MyketIAP.RESULT]; Purchase purchase = result[MyketIAP.PURCHASE];
در صورتی که میخواهید اطلاعات تمام محصولات خریداری شده توسط کاربر را داشته باشید از متد queryInventory به صورت زیر استفاده کنید:
Map<String, dynamic> result = await MyketIAP.queryInventory(querySkuDetails: false);
پارامتر querySkuDetails در صورت true بودن اطلاعات محصول را نیز برمیگرداند.
جواب این متد به صورت یک Map متشکل از IabResult و Inventory است، برای دسترسی به این دو مقدار از کد زیر استفاده کنید:
IabResult purchaseResult = result[MyketIAP.RESULT]; Inventory inventory = result[MyketIAP.INVENTORY];
برای آزادسازی ریسورسهای گرفته شده میتوانید از متد dispose استفاده کنید:
await MyketIAP.dispose();
پشتیبانی همزمان از چند استور
در صورتی که میخواهید با استفاده از این کتابخانه به صورت همزمان از چند Store اندرویدی با Buildهای مختلف استفاده کنید، این مستند را بخوانید.