50% تخفیف تکرار نشدنی برای تمام محصولات، به مناسبت عید قربان تا عید غدیر ( کد تخفیف: TGG50 )

پیاده سازی پرداخت درون برنامه ای بازار – از سیر تا پیاز

توسعه دهندگان عزیز سلام، در این مطلب می خواهیم روش صحیح و اصولی پیاده سازی پرداخت درون برنامه ای کافه بازار را به شکل کاملا ساده و روان آموزش بدهیم، در ادامه با ما همراه باشید تا نحوه پیاده سازی پرداخت درون برنامه ای کافه بازار را یاد بگیرید…

 

مقدمات پیاده سازی پرداخت درون برنامه ای بازار


قبل از هر چیزی ابتدا باید داخل وب سایت رسمی کافه بازار وارد حساب Developer یا همان حساب توسعه دهندگی خودتان شوید، برای ورود اینجـا کلیک کنید.

اگر برنامه یا بازی خودتان را هنوز داخل بازار آپلود نکردید، این کار را بکنید، و بعد از آپلود در صفحه مختصِ برنامه آپلود شده خودتان، در منوهای بالا بر روی گزینه پرداخت درون برنامه ای کلیک کنید.

شما باید یک محصول جدید اضافه کنید، پس روی دکمه <<محصول جدید>> کلیک کرده و مراحل زیر را برای اضافه کردن یک محصول جدید دنبال کنید !

برای هر محصول اطلاعاتی مانند شناسه کالا، عنوان، قیمت، توضیحات محصول، نوع (فروشی یا اشتراکی) و وضعیت (فعال یا غیرفعال) وجود دارد.

 

Cafebazaar Add Product
Cafebazaar Add Product

شناسهٔ کالا
یک کلمه کلیدی یکتا (با اعداد و حروف لاتین) است که نباید تکراری باشد.

عنوان و توضیحات

عنوان فارسی و انگلیسی , توضیحان فارسی و انگلیسی محصول هم نیازی به توضیحات ندارند (کاملا نمایشی هستند و به شخصی که می خواهد محصول شما را خریداری کنید نمایش داده می شود)

وضعیت

فعال / غیر فعال تعیین کننده وضعیت محصول شما است که میتوانید انتخاب کنید قابل خریدن باشد یا نباشد.

نوع محصول

این بخش هم تعیین کننده خریدنی یا اشتراکی بودن محصول است.

قیمت
برای هر محصول باید یک قیمت به ریال وارد کنید. حداقل و حداکثر این قیمت در قرارداد شما با بازار مشخص شده است. قیمت محصول نمی‌تواند از مقداری که در قرارداد شما مشخص شده است، کمتر یا بیشتر باشد.

 

بعد از تکمیل فرم ایجاد محصول، در نهایت دکمه افزودن را بزنید تا محصول جدید ایجاد شود.

 

خُب، رسیدیم به مرحله نهایی آموزش


تا اینجا مقدمات کار را به راحتی انجام دادیم، حالا میریم سراغ مرحله نهایی و اصل ماجرا یعنی پیاده سازی پرداخت درون برنامه ای کافه بازار در محیط برنامه نویسی اندروید استودیو …

مرحله اول

وارد فایل AndroidManifest.xml شده و دسترسی Permission سرویس پرداخت درون برنامه ای کافه بازار را اضافه کنید.

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

مرحله دوم

اکنون شما باید فایل های مورد نیاز برای پیاده سازی پرداخت درون برنامه ای کافه بازار را دانلود کنید و در پروژه خودتان ایمپورت کنید. برای دانلود اینجـا کلیک کنید

فایل دانلود شده را extract کرده و پوشه utils را همراه با تمام فایل های داخلش در شاخه جاوا پروژه خود قرار دهید!

ممکنه کلاس های چاوا خطای import داشته باشند، اگر اینطور بود هر فایل را باز کرده بخش ابتدای آن (بخش import ها بالای کدها) را ویرایش کنید (حذف کرده و ALT + Enter بزنید) .

حالا داخل پروژه خودتان یک پوشه به نام aidl در مسیر src/main/ ایجاد کنید.

بروی پوشه aidl راست کلیک کنید و new->add package را بزنید، در کادر باز شده com.android.vending.billing را انتخاب کرده و ok را بزنید.

اکنون باید یک فایل دیگر را دانلود کنید و داخل همین پوشه aidl قرار دهید. برای دانلود اینجـا کلیک کنید

وارد فایل Gradle شده و کد زیر اضافه کنید.

android {
sourceSets {
main {
aidl.srcDirs = ['src']
}
}
}

مرحله سوم
حالا نوبت تعریف متغیر ها رسیده، کدهای زیر را در بالای متد Oncreate قرار دهید. میخواهیم در کل پروژه از آنها استفاده کنیم!

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

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

// 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، شما باید شناسه مربوط به محصول خود را جایگزین roidland_sku کنید. (این همان شناسه ای هست که هنگام ایجاد محصول جدید خودتان انتخاب کرده اید)

مرحله چهارم

حالا در متد 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);
}
});

نکتـه! در کدهای بالا، به جای base64EncodedPublicKey میتوانید یک سری کاراکتر نامفهوم با ضریب امنیتی بالا قرار دهید، فقط بمنظور افزایش امنیت!

مرحله پنجم

کدهای داخل پوشهٔ util کارهای مشترک بین برنامه‌هایی که از طریق پرداخت درون‌ برنامه‌ ای کالا میفروشند را انجام می‌دهند. برای زمانی که این کدها چک‌های لازم را انجام داده‌اند و دیگر نوبت اقدامی توسط برنامه‌نویس است، لازم است که listener هایی بنویسید تا به موقع وارد عمل شوند. در کد زیر listener اول زمانی استفاده می‌شود که بازار فهرست خریدهای مصرف نشده ی کاربر را باز می‌گرداند و 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.");
}
}

در واقع در بالا ابتدا شما باید چک کنید که کاربر آیا قبلا این محصول را خریدای کرده است یا خیر برای این منظور از Listener به نام QueryInventoryFinishedListener استفاده شده است.

متد OnIabPurchaseFinishedListener برای زمانی است که کاربر عمل پرداخت را به درستی انجام داده است، اگر پرداخت ناموفق باشد وارد if می شود و اگر کاربر به درستی پرداخت را انجام داده باشد وارد else if می شود که شما اینجا به عنوان یک برنامه نویس هر کاری که می خواهید می توانید انجام بدهید، بطور مثال می توانید کاری کنید بعد از پرداخت موفق فاکتور خرید به کاربر نمایش داده شود یا هر چیز دیگه ای …

ادامه مطلب  خطای سپر ایمنی گوگل Blocked By Play Protect و آموزش رفع آن

مرحله ششم

هنگامی که کابر برای خرید اقدام می کند باید کد زیر را اجرا کنید.

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

وقتی کاربر از درگاه پرداخت بازار مجددا به برنامه برگردد، برنامه ی شما به کمک mPurchaseFinishedListener از وضعیت پرداخت (موفق یا ناموفق) خبردار می‌شود.

 

خب دوستان این مقاله آموزشی هم به پایان رسید. پیشنهاد میکنیم قبل از انتشار یک اپلیکیشن اندرویدی حتما مقاله ” رفع خطای سپر ایمنی گوگل Blocked By Play Protect ” را مطالعه کنید، موفق و سربلند باشید.

دیدگاه کاربران
  • ابرج ۲۷ تیر ۱۳۹۸ / ۱۴:۳۱

    این کدهای listener در کجا نوشته می شوند؟؟

    • سرزمین اندروید ۲۷ تیر ۱۳۹۸ / ۱۷:۴۳

      کدهای listener رو میتونید داخل اکتیویتی صفحه پرداخت قرار بدید و دکمه ی شرطی ای هم بذارید تا کاربر با کلیک روی اون دکمه در صورتی که قبلا محصول رو خریده بود آن را دریافت کند و اگر تابحال نخریده بود به درگاه پرداخت کافه بازار هدایت شود. موفق باشید

  • ایرج ۲۷ تیر ۱۳۹۸ / ۱۸:۲۱

    منظور شما این است که listenerها درون متد OnCreate در ادامه کدها قرار بدم یا درون فانکشن دکمه خرید بصورت جداگانه؟

    • سرزمین اندروید ۲۷ تیر ۱۳۹۸ / ۲۳:۴۳

      بله میتونید داخل OnCreate صفحه پرداخت بذارید. و برای دکمه پرداخت هم شما اول باید دسترسی به قسمت های پولی اپلیکیشن رو با توجه به موفق یا ناموفق بودن پرداخت، خودتون به کاربر بدید چون این کار توسط خود کافه بازار انجام نمیشه !
      شما باید یک متغیر داخل دیتابیس برنامتون یا شیردپرفرنس ذخیره کنید که مثلا مقدار پیشفرض اون free باشه، بعد از این که پرداخت کاربر با موفقیت انجام شد مقدار متغیر به pro تغییر کنه! به وقتش میتونید از این متغیر هر طور که بخواهید استفاده کنید.
      حالا با ورود کاربر به صفحه پرداخت با یک if چک میکنید ببینید کاربر قبلا پرداختی انجام داده یا خیر! اگر قبلا پرداخت کرده بود متغیر تعریف شده که مقدار پیشفرض اون free هست باید به pro تغییر کنه! به کاربر هم میتونید دیالوگی نمایش بدید تا بگه شما قبلا برنامه را ارتقا داده اید، نسخه ویژه برنامه برای شما فعال شد!
      بعد دکمه پرداخت هم غیر فعال بشه و یا تبدیل بشه به دکمه بازگشت به صفحه اصلی برنام …

      اما اگر شرط برقرار نبود و کاربر پرداختی انجام نداده بود دکمه پرداخت از حالت غیرفعال به فعال تبدیل میشه و کاربر وقتی روی اون کلیک کنه به صفحه پرداخت هدایت میشه و بعد از پرداخت هم باز مقدار متغیر به pro باید تغییر داده بشه و باقی کارها انجام بشه …

      با کمی حوصله و ابتکار میتونید یک سورس پرداخت حرفه ای و کامل بسازید و از همون داخل برنامه های خودتون به راحتی استفاده کنید و نیاز نباشه هر سری کدهای تکراری بنویسید و کل این مراحل رو بگذرونید. موفق باشید

  • ایرج ۲۸ تیر ۱۳۹۸ / ۱۱:۲۴

    سپاس فراوان از شما

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

توسط
تومان
  • ثبت نام
رمزعبور خودتان را فراموش کردید؟ فقط کافیه ایمیل خودتان را در کادر زیر وارد نمایید و دکمه درخواست لینک بازیابی رمزعبور را بزنید تا بلافاصله یک لینک بازیابی رمزعبور به آدرس ایمیل شما ارسال شود.
نگران نباشید! ما همواره در نگهداری از آدرس ایمیل و دیگر مشخصات شخصی شما سخت تلاش میکنیم.