آموزش پرداخت درون برنامه ای کافه بازار
سلام توسعه دهندگان گرامی در این سری از آموزش برنامه نویسی اندروید به آموزش پرداخت درون برنامه ای کافه بازار می پردازیم برخی از دوستان با پرداخت درون برنامه ای کافه بازار مشکل داشتند به همین منظور در این آموزش نحوه صحیح ارتباط با کافه بازار یا همان پرداخت درون برنامه ای را برای شما قرار می دهیم در ادامه با ما همراه باشید تا نحوه پرداخت درون برنامه ای کافه بازار را یاد گیرید.
به قول کافه بازار در 9 مرحله نحوه پیاده سازی کامل پرداخت درون برنامه ای کافه بازار را به شما آموزش میدهیم البته ما در 6 مرحله !
(کلی داستان باید بخونید تا یک اپ رو بفروشید !)
قبل از تمامی مراحل ابتدا شما باید وارد حساب Developer خود در کافه بازار شده سپس یک محصول جدید تعریف کنید.
لیست محصولات مربوط به برنامهٔ خود را میتوانید با ورود به پنل توسعهدهندگیتان و سپس انتخاب برنامهٔ مورد نظر، در سربرگ «پرداخت درونبرنامهای» مشاهده فرمائید.
برای هر محصول اطلاعاتی مانند شناسه کالا، عنوان، قیمت، توضیحات محصول، نوع (فروشی یا اشتراکی) و وضعیت (فعال یا غیرفعال) وجود دارد.
مراحل زیر را برای اضافه کردن محصولات دنبال کنید !
1- وارد پنل توسعهدهندگی خود شوید.
2- برنامه مدنظرتان را انتخاب کنید و وارد سربرگ «پرداخت درونبرنامهای» شوید.
3- روی دکمه <<محصول جدید>> کلیک کنید و اطلاعات مورد نیاز برای هر محصول را وارد کنید.
حدودا یک همچین چیزی شاید به تازگی تغییر کرده باشد.
یک توضیح کوچک دربالا اطلاعات بالا در ادامه قرار میدهیم نمی خوام زیاد طول بکشه.
شناسهٔ کالا
فکر کنید یک کلمه کلیدی به ازای هر محصول هست باید هربار یک چیز unique قرار دهید.
عنوان فارسی و انگلیسی , توضیحان فارسی و انگلیسی هم به پای خودتان نیاز به توضیح نداره (در کل اطلاعات نمایشی است و به شخصی که می خواهد محصول را خریداری کنید نمایش داده می شود)
وضعیت
فعال / غیر فعال تعیین کننده وضعیت محصول است.
نوع محصول
تعیین پولی یا free بودن محصول است.
در نهایت ذخیره را بزنید.
بریم به بخش قول مرحله آخر
مرحله اول
وارد فایل AndroidManifest.xml شده و دسترسی کافه بازار را اضافه کنید.
1 | <uses-permission android:name="com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR"></uses-permission> |
مرحله دوم
شما باید یکسری کد را از اینجا دانلود کنید (یکسری کلاس کمکی) و در پروژه خودتان قرار در ادامه بخشی از آنها را توضیح میدهیم.
لینک دانلود فایل هایی کمکی
پوشه را extract کرده و فایل ها را (همراه با پوشه utils ) در بخش جاوا پروژه خود قرار دهید !
کدهای بالا حدودا 5 سال پیش منشتر شده و حتی یکبار در سال های اخیر ویرایش نشده یعنی واقعا جای تاسف داره برای کافه بازار ! کافه بازار می توانست یک کتاب خانه ساده jar درست کنه برای همچین چیزی حداقل کار بودش !
شاید کدهای بالا خطای import داشته باشند هر فایل را باز کرده بخش ابتدای آن را (بخش import ها بالای کد) را ویرایش کنید (حذف کرده و ALT + Enter بزنید)
یک فایل دیگه هم وجود دارد که باید آن را هم قرار دهید ابتدا دانلودش کنید از این لینک
فایلی که دانلود کردید را باید در یک پوشه خاص قرار دهید مراحل زیر را دنبال کنید.
یک پوشه به نام aidl در مسیر src/main/ ایجاد کنید
بروی همان پوشه aidl کلیک راست کنید و new->add package رو بزنید در کادر باز شده com.android.vending.billing را قرار دهید و ok بزنید.
سپس فایل دانلود شده را در آن قرار دهید.
وارد فایل Gradle شده و کد زیر را تنظیم کنید (یکم دقت کنید متوجه می شوید کجا بزارید !)
1 2 3 4 5 6 7 | android { sourceSets { main { aidl.srcDirs = ['src'] } } } |
مرحله سوم
تعریف متغیر های در بالا Oncreate قرار دهید باید در کل پروزه بتوانیم از آنها استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 | // Debug tag, for logging static final String TAG = ""; // SKUs for our products: the premium upgrade (non-consumable) static final String SKU_PREMIUM = "programchi"; // Does the user have the premium upgrade? boolean mIsPremium = false; // (arbitrary) request code for the purchase flow static final int RC_REQUEST = 1 ; // The helper object IabHelper mHelper; |
تغییری در کد بالا ندهید فقط ما سورس کافه بازار را بخش SKU_PREMIUM را تغییر داده ایم. شما باید شناسه مربوط به محصول خود را در آن قرار دهید بقیش رو تغییر ندهید !
مرحله چهارم
حالا وارد onCreate
اکتیوتی خود شده کدهای زیر را به آن اضافه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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); } }); |
در بالا یک کارکتری چیزی در base64EncodedPublicKey قرار دهید فقط برای افزایش امنیت هست.
مرحله پنجم
کدهای داخل پوشهٔ util
کارهای مشترک بین برنامههایی که از طریق پرداخت درونبرنامهای کالا میفروشند را انجام میدهند. برای زمانی که این کدها چکهای لازم را انجام دادهاند و دیگر نوبت اقدامی توسط برنامهنویس است، لازم است که listener
هایی بنویسید تا به موقع وارد عمل شوند. در کد زیر listener
اول زمانی استفاده میشود که بازار فهرست خریدهای مصرف نشدهٔ کاربر را باز میگرداند و listener دوم زمانی که یک خرید به اتمام میرسد فراخوانی خواهد شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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."); } } |
در واقع در بالا ابتدا شما باید چک کنید که کاربر آیا قبلا این محصول خریدای شده است یا خیر برای این منظور از Listener به نام QueryInventoryFinishedListener استفاده شده است.
متد OnIabPurchaseFinishedListener برای زمانی که است کاربر عمل پرداخت رو به درستی انجام داده است اگر اشتباه باشد وارد if ولی در غیر اینصورت کاربر به درستی پرداخت رو انجام داده است باید در متد else if هر کاری که می خواید با کاربر بکنید مثلا یک فایل دانلود بشه یا هرچیزی دیگه ای
مرحله ششم
در دکمه هم هنگامی که کابر برای خرید اقدام می کند کد زیر را اجرا کنید.
1 | mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST, mPurchaseFinishedListener, "payload-string"); |
وقتی کاربر از بازار برگردد، برنامهٔ شما به کمک کد mPurchaseFinishedListener
خبردار میشود.
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
خیلی خیلی ممنون از لطفتون.
واقعا بهش نیاز داشتیم.
خواهش می کنم موفق باشید.
سلام و خداقوت خدمت شما
برنامه بنده IInAppBillingService رو در فایل IabHelper نمیشناسه…
حتی در قسمت importها هم خط مربوط به این مورد رو پاک کردم تا از طریق Alt+Enter بتونم import کنم. ولی بازم import رو انجام نداد و پیام میداد که کلاس IInAppBillingService رو ایجاد کن…
باید برای حل این موضوع چکار کنم؟
عکسی رو من باب همین موضوع براتون تلگرام کردم
این مورد حل شد.
چجوری حل شد ؟
کاش بعد از اینکه حل شد توضیح میدادید ؟
در کد زیر:
mHelper.queryInventoryAsync(mGotInventoryListener);
مقدار mGotInventoryListener رو برنامه من نمیشناسه…
علتش چی میتونه باشه؟
اگه امکانش هست توضیحات بیشتری در این زمینه بدهید.
بنده اصلا متوجه نمیشم دقیقا باید چکار کنم!
میخوام طوری باشه که با وارد شدن به یه صفحه، اگه کاربر خرید رو قبلا انجام نداده که اون رو به بازار منتقل کنه و اگه رد درخواست باز هم نتونه با زدن دکمه خدمات اپ براش باز شه…
اگر هم پرداخت رو انجام داده که زدن دکمه و ارائه خدمات براش باز شه…
ممنون میشم راهنمایی کنین بنده رو…
سلام و درود
در بالا کد توضیح داده شده است ببیند شما هر وقت می خواید چک کنید ببنید خریداری شده یا نه باید Query بزنید که زده شده متدOnIabPurchaseFinishedListener زمانی که خرید انجام شده باشد.
خیلی عالی بود
ای کاش ویدئو براش درست می کردید تا بهتر متوجه می شدیم برخی جاها رو.
در هر صورت مشکل حل شد
خیلی خیلی ممنونم
سلام خسته نباشید
۱. توی مانیفست اندروید باید کدام صفحه باید Default Launch باشد؟
۲. کدهای مرحله یک تا شش درون Oncreate قرار میگیرن؟
۳. متد QueryInventoryFinishedListener مشخص می کند که اگر خریداری شده بود به صفحه Main Activity برود
۴. سورس کد این پروژه رو هم دارید؟
سپاس از شما بابت این آموزش