مستند به‌روزرسانی جاوا – روش پیشنهادی (Native)

در جهت بهبود فرایند به‌روزرسانی کتابخانه پرداخت درون‌برنامه‌ای مایکت، پیشنهاد می‌کنیم از این به بعد، برای اتصال به سرویس مایکت از این روش استفاده کنید. همچنین در این پروژه این امکان وجود دارد که با استفاده از Build Variantهای Gradle بتوانید به سرویس پرداخت چند Store (کافه‌بازار، گوگل‌پلی و…) متصل شوید. این امکان به شما کمک می‌کند تا فرایند نگه‌داری سورس-کد و انتشار پروژه را برای چند فروشگاه اندرویدی، راحت‌تر کنید.

برای مشاهده و دریافت برنامه نمونه و سورس-کد آن می‌توانید به اینجا مراجعه کنید.

برای به‌روزرسانی پرداخت درون‌برنامه‌ای مایکت با این روش، کافی است مراحل زیر را دنبال کنید:

۱. در فایل build.gradle موجود در پوشه‌ اصلی پروژه خود Jitpack Repository را اضافه کنید:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

۲. در فایل build.gradle پروژه خود کتابخانه پرداخت مایکت را اضافه کنید:

dependencies {
    ...
    implementation 'com.github.myketstore:myket-billing-client:v1.3'
}

۳. این تکه کد را در قسمت android موجود در فایل build.gradle پروژه خود اضافه کنید:

android {
    defaultConfig {
        def marketApplicationId = "ir.mservices.market"
        def marketBindAddress = "ir.mservices.market.InAppBillingService.BIND"
        manifestPlaceholders = [marketApplicationId: "${marketApplicationId}",
                marketBindAddress  : "${marketBindAddress}",
                marketPermission   : "${marketApplicationId}.BILLING"]
        buildConfigField "String", "IAB_PUBLIC_KEY", "\"{MYKET_PUBLIC_KEY}\""
    }
    ...
}

در صورتی که می‌خواهید به غیر از سرویس پرداخت درون‌برنامه‌ای مایکت به سرویس پرداخت استو‌رهای دیگر متصل شوید، کافی است به جای defaultConfig از productFlavors استفاده کنید:

android {
    flavorDimensions "store"
 
    productFlavors {
        myket {
            dimension "store"
            def marketApplicationId = "ir.mservices.market"
            def marketBindAddress ="ir.mservices.market.InAppBillingService.BIND"
            manifestPlaceholders = [marketApplicationId: "{marketApplicationId}",
                        marketBindAddress: "${marketBindAddress}",
                    marketPermission: "${marketApplicationId}.BILLING"]
            buildConfigField "String", "IAB_PUBLIC_KEY", “\"{MYKET_PUBLIC_KEY}\""
        }
        otherMarket {
            dimension "store"
            def marketApplicationId = "{OTHER_MARKET_PACKAGE_NAME}"
            def marketBindAddress = "{OTHER_MARKET_BIND_ADDRESS}"
            manifestPlaceholders = [marketApplicationId: "${marketApplicationId}",
                        marketBindAddress  : "${marketBindAddress}",
                        marketPermission   : "{OTHER_MARKET_PERMISSION}"]
            buildConfigField "String", "IAB_PUBLIC_KEY", “\”{OTHER_MARKET_PUBLIC_KEY}\""
        }
    }
    ...
}
برای آشنایی بیشتر با productFlavors می‌توانید اینجا را ببینید.

۴. سپس کلید رمز عمومی (RSA PublicKey) برنامه خود (که از پنل توسعه‌دهندگان مایکت دریافت کردید) را به جای {MYKET_PUBLIC_KEY} جایگزین کنید:

buildConfigField "String", "IAB_PUBLIC_KEY", "\"{MYKET_PUBLIC_KEY}\""

دقت کنید که قسمت buildConfigField پس از تغییر مشابه زیر شده باشد:

buildConfigField "String", "IAB_PUBLIC_KEY", "\"MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgOW5KR56WBWCb5K+yyVDnh/7op0FY4zmM93CWz3xFhgUJe2WXM/8MgpTHiDxrj2Mkgt9bg30qZDtT8gzDHiTgNv6G7pZBDWuyKEariGbbQgoCoeaq3GBcNsQf418jsvOfPjzZ7Rpcl/+9ZPsp1kbJVOmZxnwAZx/wnkUduwfuf8hAgMBAAE=\""

در صورتی که می‌خواهید به غیر از مایکت، استور دیگری را اضافه کنید، باید مقادیر {OTHER_MARKET_PACKAGE_NAME}، {OTHER_MARKET_BIND_ADDRESS}، {OTHER_MARKET_PERMISSION} و {OTHER_MARKET_PUBLIC_KEY} را جایگزین کنید. مثلا برای پیاده‌سازی پرداخت درون‌برنامه‌ای برای استور مایکت و کافه‌بازار، productFlavors به صورت زیر است:

android {
    flavorDimensions "store"
 
    productFlavors {
        myket {
            dimension "store"
            def marketApplicationId = "ir.mservices.market"
            def marketBindAddress ="ir.mservices.market.InAppBillingService.BIND"
            manifestPlaceholders = [marketApplicationId: "{marketApplicationId}",
                        marketBindAddress: "${marketBindAddress}",
                    marketPermission: "${marketApplicationId}.BILLING"]
            buildConfigField "String", "IAB_PUBLIC_KEY", “\"{MYKET_PUBLIC_KEY}\""
        }
        bazaar {
            dimension "store"
            def marketApplicationId = "com.farsitel.bazaar"
            def marketBindAddress = "ir.cafebazaar.pardakht.InAppBillingService.BIND"
            manifestPlaceholders = [marketApplicationId: "${marketApplicationId}",
                        marketBindAddress  : "${marketBindAddress}",
                        marketPermission   : "com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR"]
            buildConfigField "String", "IAB_PUBLIC_KEY", “\”{BAZAAR_PUBLIC_KEY}\""
        }
    }
    ...
}

دقت کنید که در مثال بالا باید قسمت {MYKET_PUBLIC_KEY} با کلید رمز عمومی مایکت و قسمت {OTHER_MARKET_PUBLIC_KEY} با کلید رمز عمومی کافه‌بازار، جایگزین شود. در نهايت می‌توانید برای هر فروشگاه یک خروجی (نسخه) مجزا بگیرید.

۵. در قسمتی از پروژه خود که کلاس IabHelper را می‌سازید، باید مقدار کلید رمز عمومی را از BuildConfig بخوانید:

mHelper = new IabHelper(this, BuildConfig.IAB_PUBLIC_KEY);

۶. تمامی فایل‌های مربوط به پرداخت درون‌برنامه‌ای که در گذشته به پروژه خود اضافه کرده بودید، پاک کنید و در قسمت‌هایی از پروژه که از آن‌ها استفاده می‌کند، importها را اصلاح کنید. به عنوان نمونه، در تصویر زیر باید پوشه‌های utils و aidl حذف شود و در کلاس MainActivity در ابتدای فایل importها اصلاح گردد:

۷. در این مدل دیگر نیازی به Override کردن متد onActivityResult در Activityهای شما وجود ندارد و متد handleActivityResult از کلاس IabHelper حذف شده است. بنابراین قسمت‌های مربوط به کد پرداخت در متد onActivityResult خود را حذف نمایید. برای مثال خطوط زیر در مدل قدیمی باید حذف گردد:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
    if (mHelper == null) return;
 
    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);
    }
    else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }
}

همچنین با توجه به تغییر بالا ورودی‌های متد launchPurchaseFlow تغییر کرده و فیلد requestCode از آن حذف شده. بنابراین هر جا که launchPurchaseFlow را صدا می‌زنید، باید این مقدار را حذف کنید. یک نمونه از تغییر متد launchPurchaseFlow را در مثال زیر ببینیم:

// پیاده‌سازی قدیمی
iabHelper.launchPurchaseFlow(this, SKU_GAS, RC_REQUEST, mPurchaseFinishedListener, payload);
 
// پیاده‌سازی جدید
iabHelper.launchPurchaseFlow(this, SKU_GAS, mPurchaseFinishedListener, payload);

۸. به فایل AndroidManifest پروژه خود مراجعه کنید و Permission پرداخت درون‌برنامه‌ای مایکت (استورهای دیگر) را حذف نمایید. به بیان دیگر باید خط زیر را حذف نمایید:

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

همچنین در صورتی که از queries در AndroidManifest خود استفاده می‌کنید، این تیکه-کد را هم حذف نمایید:

<queries>
    <package android:name="ir.mservices.market" />
    <intent>
        <action android:name="ir.mservices.market.InAppBillingService.BIND" />
        <data android:mimeType="*/*" />
    </intent>
</queries>

۹. پروژه را Build کنید و سناریوی خرید را روی دستگاه تست نمایید.

Was this article helpful?
Dislike 0
قبلی: به‌روزرسانی پرداخت درون‌برنامه‌ای مایکت (فروردین ۱۴۰۱)
بعدی: مستند به‌روزرسانی یونیتی (Unity)