راهنمای نه گامی خرید درون‌برنامه‌ای

این راهنما در نه گام حداقل کارهای لازم برای پیاده‌سازی و راه‌اندازی پرداخت درون‌برنامه‌ای در برنامه‌تان را توضیح می‌دهد. برای کارهای پیچیده‌تر لازم است مستندات دیگر را مطالعه کنید و از پیچ و خم اتفاقات از لحظهٔ پیشنهاد دادن کالاهایتان برای فروش تا زمان تحویل کالای دیجیتالتان به کاربر و ثبت این تحویل مطلع شوید.

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

خوب است که همیشه با مثالی شروع کنیم و با بازی با اجزای آن کار را جلو ببریم. این مثال که از سوی گوگل ارائه شده است TriviaDrive نام دارد و نمونه مناسبی برای درک مفاهیم پایه‌ای پرداخت درون‌برنامه‌ای و دسترسی به فایل‌های لازم برای کپی کردن در Eclipse است (مرحله 2 را ببینید). ما دو خط از این مثال را تغییر داده‌ایم تا برای خرید به جای گوگل به سراغ بازار بیاید.

سورس کد کامل این برنامه را در قالب یک فایل زیپ شده، و یا در قالب یک git repository می‌توانید از اینجا دریافت کنید. دو خط تغییر ما را می‌توانید در این کامیت ببینید.

دو: کتابخانه

فایل IInAppBillingService.aidl و پوشهٔ utils از کد مثال را به پروژهٔ خود اضافه کنید. حواستان باشد که نام بسته فایل‌های درون utils را با توجه به محل جدیدشان چنانچه لازم است ویرایش و به‌روز کنید. در انتهای این کار ساختار پوشه‌بندی پروژهٔ شما در اکلیپس باید شبیه تصویر زیر باشد. در مورد جزئیات اضافه کردن این فایل و کنار آمدن با مشکلات اکلیپس می‌توانید از این مقالهٔ مصور و جالب استفاده ببرید.

پوشه‌بندی یک پروژهٔ مثالی

سه: دسترسی

این کد را در manifest برنامه خود اضافه کنید:

<uses-permission android:name="com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR"></uses-permission>

چهار: محصول

به پنل بازار مراجعه کنید و apk برنامه خود را آپلود کنید ولی درخواست انتشار آن را ندهید. در پنل پرداخت بازار در بخش «محصولات/خدمات»، محصولی جدید با شناسه‌ کالایی مشخص اضافه کنید و این شناسه را برای مرحلهٔ پنج به یاد بسپارید. مقادیر مناسب کوتاهی در بخش عنوان و توضیحات بنویسید و دکمهٔ ارسال را بزنید.

پنج: متغیرها

پیش از صدا زدن onCreate مربوط به activityی که فروش را انجام می‌دهد این را اضافه کنید:

// Debug tag, for logging
static final String TAG = "";

// SKUs for our products: the premium upgrade (non-consumable)
static final String SKU_PREMIUM = "";

// Does the user have the premium upgrade?
boolean mIsPremium = false;

// (arbitrary) request code for the purchase flow
static final int RC_REQUEST = ;

// The helper object
IabHelper mHelper;

شش: درون onCreate

String base64EncodedPublicKey = "";
// You can find it in your Bazaar console, in the Dealers section. 
// It is recommended to add more security than just pasting it in your source code;
mHelper = new IabHelper(this, base64EncodedPublicKey);

Log.d(TAG, "Starting setup.");
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
    public void onIabSetupFinished(IabResult result) {
        Log.d(TAG, "Setup finished.");

        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.queryInventoryAsync(mGotInventoryListener);
    }
});

هفت: کدهای مثال مربوط به listenerها

کدهای داخل utils کارهای مشترک بین برنامه‌هایی که از طریق پرداخت درون‌برنامه‌ای کالا می‌فروشند را انجام می‌دهند. برای زمانی که این کدها چک‌های لازم را انجام داده‌اند و دیگر نوبت اقدامی توسط برنامه‌نویس است، لازم است که listenerهایی بنویسید تا به موقع وارد عمل شوند. در زیر پیاده‌سازی نمونه برای زمانی که بازار به برنامه خریدهای هنوز مصرف نشدهٔ کاربر را پاسخ می‌دهد و همچنین برای زمانی که یک خرید به اتمام می‌رسد را نشان می‌دهد.

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
        Log.d(TAG, "Query inventory finished.");
        if (result.isFailure()) {
            Log.d(TAG, "Failed to query inventory: " + result);
            return;
        }
        else {
            Log.d(TAG, "Query inventory was successful.");
            // does the user have the premium upgrade?
            mIsPremium = inventory.hasPurchase(SKU_PREMIUM);

            // update UI accordingly

            Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
        }

        Log.d(TAG, "Initial inventory query finished; enabling main UI.");
    }
};

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        if (result.isFailure()) {
            Log.d(TAG, "Error purchasing: " + result);
            return;
        }
        else if (purchase.getSku().equals(SKU_PREMIUM)) {
            // give user access to premium content and update the UI
        }
    }
};

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        super.onActivityResult(requestCode, resultCode, data);
    } else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }
}

هشت: کد مثال فرستادن کاربر برای خرید یک کالا

این کد کاربر را به سراغ صفحهٔ خرید «ارتقا» در بازار می‌فرستد. وقتی کاربر از بازار برگردد، شما به کمک کد mPurchaseFinishedListener خبردار می‌شوید.

mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST, mPurchaseFinishedListener, "payload-string");

نه: onDestroy

از سرویس در زمان اتمام عمر activity قطع شوید:

@Override
public void onDestroy() {
    super.onDestroy();
    if (mHelper != null) mHelper.dispose();
    mHelper = null;
}

کار شما تمام است. فقط منتظر بمانید که بازار آخرین نسخه apk شما را بر روی سرورهایش قرار دهد.

منبع: Redapps