آمادهسازی برنامه برای خرید درونبرنامهای
قبل از اینکه از سرویس خرید درونبرنامهای استفاده کنید، شما باید به برنامه خود یک کتابخانه از خرید درونبرنامهای اضافه کنید. شما همچنین باید مجوزهای لازم برای برقراری ارتباط با مایکت را اخذ نمایید. علاوه بر این، شما به یک ارتباط بین برنامه خود و برنامه مایکت نیاز دارید. همچنین باید بررسی کنید که مایکت از نسخه خرید درونبرنامهای که در برنامه خود استفاده میکنید، پشتیبانی کند. در نظر داشته باشید که مایکت از استاندارد گوگلپلی برای پرداخت درونبرنامهای خود استفاده میکند. یعنی در صورتی که برنامهٔ خود را قبلا به سرویس پرداخت گوگلپلی و یا مارکت دیگری متصل نمودهاید، تنها کافی است با چند تغییر، برنامهٔ خود را به سرویس خرید درونبرنامهای مایکت اتصال دهید.
دانلود برنامه نمونه
در این بخش شما با نحوهٔ پیادهسازی خرید درونبرنامهای در یک برنامه نمونه به نام TrivialDrive آشنا میشوید. این مثال شامل کلاسهایی برای راهاندازی سریع خرید درونبرنامهای، نوعهای دادهای لازم، و اداره کردن انجام خرید درونبرنامهای از thread اصلی برنامه است. برنامه نمونه TrivialDrive را از اینجا دانلود کنید و یا در Github مشاهده نمایید. توجه کنید که این برنامه توسط گوگلپلی آماده شده است و ما تنها چند تغییر جزئی در آن به وجود آوردهایم تا به مایکت متصل شود.
بارگذاری برنامه در پنل توسعهدهندگان
پنل توسعهدهندگان مایکت جایی است که شما برنامه خود را در آن منتشر میکنید و محصولات مختلفی را که برای خرید توسط برنامه شما فراهم شده مدیریت میکند. زمانی که شما یک برنامه جدید در پنل کاربری مایکت قرار میدهید، یک کلید عمومی برای برنامه شما تولید میشود. شما به این کلید برای برقراری ارتباطی امن بین برنامه خود و سرور مایکت نیاز خواهید داشت. شما فقط یک بار نیاز به تولید این کلید برای برنامه خود دارید و نیازی به تکرار این مراحل هنگام بهروزرسانی برنامه خود و ارائه فایل APK جدید ندارید. برای اضافه کردن برنامهٔ خود به پنل توسعهدهندگان اینجا را ببینید.
افزودن کتابخانه خرید درونبرنامهای
برای استفاده از ویژگیهای خرید درونبرنامهای نسخه 3، شما باید فایل IInAppBillingService.aidl را به پروژه اندروید خود اضافه کنید. این فایل واسط لازم برای برقراری ارتباط با سرویس مایکت را تعریف میکند.شما میتوانید فایل IInAppBillingService.aidl را در برنامه نمونه که پیشتر بیان شد (TrivialDrive) بیابید. بسته به این که شما یک برنامه جدید میسازید یا میخواهید در برنامههای قبلی خود تغییر ایجاد کنید، از دستورالعمل زیر برای اضافه کردن سرویس خرید درونبرنامهای استفاده کنید.
پروژهی جدید
برای اضافه کردن سرویس خرید درونبرنامهای به پروژه جدید خود:
- فایلهای برنامه نمونه TrivialDrive را در برنامه جدید خود کپی کنید.
- نام package فایلهایی که کپی کردید را تغییر دهید تا از نام package برنامه شما استفاده شود.
- فایل AndroidManifest.xml را باز کنید و نام بسته (Package) را به نام بسته پروژه خود تغییر دهید.
- در صورت نیاز کدهای import را در فایلهای java تصحیح کنید تا پروژهتان درست کامپایل شود.
- کدهای مثال را تغییر دهید تا برنامه خود را بسازید. به یاد داشته باشید کلید عمومی برنامه خود را از پنل توسعهدهندگان در MainActivity.java کپی کنید.
پروژههای موجود
برای اضافه کردن سرویس خرید درونبرنامهای در برنامهٔ موجود:
- فایل IInAppBillingService.aidl را در پروژه اندروید خود کپی کنید.
- اگر از Eclipse استفاده میکنید: فایلIInAppBillingService.aidl را در پوشه /src پروژه import کنید.
- اگر در محیطی به غیر از Eclipse در حال توسعه هستید: پوشهای با این آدرس بسازید /src/com/android/vending/billing و فایل IInAppBillingService.aidl را در آن کپی کنید.
- برنامه خود را build کنید. اگر همه چیز درست باشد یک فایل ساخته شده با نام IInAppBillingService.java در پوشه /gen میبینید.
- کلاسهای کمکی را از پوشه /util پروژه مثال TrivialDrive بردارید و به پروژه خود اضافه کنید. به یاد داشته باشید که نام package را در این فایلها متناسب با پروژه خود تغییر دهید، تا پروژه درست کامپایل شود.
- هم اکنون پروژه شما شامل کتابخانه خرید درونبرنامهای مایکت است.
تنظیم دسترسی
برنامه شما برای رد و بدل کردن پیامهای درخواست و پاسخ با سرویس خرید درونبرنامهای مایکت نیاز به مجوز دارد. برای دادن اجازه لازم به برنامه خود این خط را به فایل AndroidManifest.xml خود اضافه کنید:
<uses-permission android:name="ir.mservices.market.BILLING" />
درصورتی که targetSdkVersion پروژه شما بزرگتر از 29 باشد package visibility filtering بر روی آن اعمال خواهد شد. این موضوع باعث می شود در صورتی که پروژه توسط مایکت نصب نشده باشد دیگر نتواند ارتباطی با مایکت بر قرار کند.
برای رفع این مشکل کافی است تکه کد زیر را در داخل تگ <manifest> در داخل فایل AndroidManifest.xml کپی کنید
<queries> <package android:name="ir.mservices.market" /> <intent> <action android:name="ir.mservices.market.InAppBillingService.BIND" /> <data android:mimeType="*/*" /> </intent> </queries>
برقراری یک ارتباط با مایکت
شما باید به سرویس خرید درونبرنامهای مایکت متصل شوید تا بتوانید درخواستهای خرید را از برنامه خود به مایکت بفرستید. در برنامه نمونه کلاسهایی فراهم شده که ایجاد این اتصال را انجام میدهند، پس لازم نیست که شما مستقیما این ارتباط را مدیریت کنید.برای راهاندازی ارتباط با مایکت، در متد onCreate یک نمونه از کلاس IabHelper بسازید. در constructor کلاس، مقدار Context مربوط به activity خود، به همراه یک رشته که حاوی کلید عمومی است که قبلاً در پنل توسعهدهندگان مایکت ساخته شده، را بدهید.
IabHelper mHelper; @Override public void onCreate(Bundle savedInstanceState) { // ... String base64EncodedPublicKey; // compute your public key and store it in base64EncodedPublicKey mHelper = new IabHelper(this, base64EncodedPublicKey); }
در قدم بعد، با صدا زدن متد startSetup از نمونه IabHelperی که ساختید عملیات اتصال را اجرا کنید. این متد را به صورت ناهمزمان (Asynchronous) اجرا میشود، یعنی در انتظار تمام شدن عملیات نمیماند و بلافاصله خارج میشود. به این متد یک نمونه از OnIabSetupFinishedListener را به عنوان شنونده بدهید، تا به محض اینکه IabHelper عملیات راهاندازی را به پایان رساند آن را صدا بزند. در بخشی از عملیات راهاندازی، IabHelper همچنین بررسی میکند که آیا خرید درونبرنامهای نسخه 3 توسط مایکت پشتیبانی میشود یا خیر. اگر خرید درونبرنامهای پشتیبانی نشود یا هر خطایی رخ دهد، به شنونده OnIabSetupFinishedListener اطلاع داده میشود و یک نمونه از IabResult حاوی پیغام خطا داده میشود.
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { // Oh noes, there was a problem. Log.d(TAG, "Problem setting up In-app Billing: " + result); } // Hooray, IAB is fully set up! } });
اگر نصب با موفقیت انجام شده باشد، شما میتوانید از mHelper برای برقراری ارتباط با سرویس مایکت استفاده کنید. هنگامی که برنامه شما باز شد، کار خوبیست که به مایکت کوئری بزنید تا بفهمید چه محصولاتی را یک کاربر خریده است. در فصل ۴ درباره این مطلب بحث شده است.
برای جداشدن از سرویس و آزاد سازی منابع سیستمتان، متد dispose از IabHelper را هنگام از بین رفتن activityتان فراخوانی کنید.
@Override public void onDestroy() { super.onDestroy(); if (mHelper != null) mHelper.dispose(); mHelper = null; }