راهنمای پیاده‌سازی خرید درون برنامه‌ای کافه‌بازار

اگر تازه برنامه‌نویسی اندروید رو شروع کرده باشید، حتما دوست دارید در کنار یادگیری از راه ساخت برنامه‌ی موبایل پول هم در بیارید. خرید درون برنامه‌ای یکی از راه‌هایی هست که میشه باهاش از طریق برنامه‌نویسی اندروید کسب درآمد کرد. کاربر توی این روش برنامه رو رایگان نصب می‌کنه ولی در صورت علاقه میتونه محصولاتی که توی برنامه برای فروش گذشته شدن رو بخره. محصول میتونه دسترسی به محتوای بیشتر، اضافه شدن یه سری قابلیت‌ها به برنامه یا دریافت خدمات گوناگون باشه. در ادامه بیشتر در مورد پرداخت درون برنامه‌ای صحبت میکنیم، اینکه چطوری کار میکنه، چه روش‌هایی داره و در آخر خرید درون برنامه‌ای رو به یه پروژه‌ی اندروید که از قبل نوشته شده اضافه می‌کنیم.نحوه‌ی کار خرید درون برنامه‌ایبرای اینکه نحوه‌ی کار خرید درون برنامه‌ای رو بهتر درک کنید با یه مثال شروع می‌کنیم، فرض کنید یه کاربر برنامه‌ی شما رو باز میکنه و روی دکمه‌ی خرید محصول y در برنامه کلیک میکنه. برنامه شما، به برنامه‌ی کافه‌بازار بر روی گوشی کاربر اعلام میکنه که کاربر x میخواد محصول y رو بخره (شماره ۱ در تصویر زیر)، بعد برنامه‌ی کافه‌بازار با سرور خودش صحبت میکنه و سرور کافه‌بازار همه مسائلی که برای انجام خرید کاربر نیازه (مثل اعتبارسنجی کاربر، داشتن اعتبار کافی برای خرید و …) رو چک میکنه و خرید رو ثبت میکنه (شماره ۲)، بعد نتیجه رو به برنامه‌ی کافه‌بازار روی گوشی کاربر خبر میده که خرید با موفقیت انجام شده یا به مشکل خورده (شماره ۳)، برنامه‌ی کافه‌بازار هم به برنامه‌ی شما خبر میده که نتیجه خرید کاربر چی شده (شماره ۴) و شما میتونید متناسب با جوابی که از برنامه کافه‌بازار میگیرید، هر کاری که میخواید بکنید.فرآیند خرید درون برنامه‌ایبا توجه به توضیحات بالا سه نکته رو در نظر داشته باشید:۱- توی خرید درون برنامه‌ای برنامه‌ی شما نیاز به اینترنت نداره ولی با توجه به اینکه برنامه کافه‌بازار باید با سرور خودش در ارتباط باشه، گوشی در زمان خرید باید به اینترنت وصل باشه.۲- برنامه‌ی کافه‌بازار باید روی گوشی کاربر نصب باشه. پس قبل از شروع فرآیند خرید درون برنامه از نصب بودن برنامه کافه‌بازار روی گوشی کاربر مطمئن بشید و در صورت نصب نبودنش به کاربر پیغام مناسب نشون بدید.۳- اطلاعات خرید کاربر روی حساب کاربری کافه‌بازارش ثبت میشه. یعنی اگر کاربر برنامه‌ی شمارو پاک و دوباره نصب کنه، نیاز نیست محصولاتی که قبلا خریده رو دوباره بخره.روش‌های مختلف خرید درون برنامه‌ایبه چند صورت میشه محصولات رو از طریق خرید درون برنامه‌ای برای خرید در اختیار کاربر گذاشت. در ادامه چهار روش ساده‌شو با هم بررسی می‌کنیم.۱- فروش دائمی (محصولات غیر مصرفی)- در این حالت کاربر با یه بار خرید محصول، برای همیشه میتونه به اون محصول دسترسی داشته باشه و مالکش باشه. برای مثال کاربر میتونه بخش‌هایی از برنامه رو به رایگان استفاده کنه (Demo Version) ولی برای دسترسی به همه امکانات باید از طریق خرید درون برنامه‌‌ای، برنامه خود رو به نسخه‌ی کامل (Full Version) تبدیل بکنه.۲- فروش موقت (محصولات مصرفی)- در این حالت کاربر وقتی محصولی رو میخره، فقط یکبار میتونه ازش استفاده بکنه و بعد از استفاده اگر دوباره بهش نیاز داشته باشه باید بخرتش. مثلا فرض کنید دیدن آنلاین فیلم‌ها در برنامه‌ای رایگانه ولی اگر کاربر بخواد فیلمی رو دانلود کنه، باید محصول «دانلود» رو بخره. بعد از اینکه خرید با موفقیت انجام شد، باید محصول مصرف بشه تا کاربر بتونه برای دانلود فیلم بعدی هم این محصول رو بخره. اصطلاح مصرف کردن به صدا زدن یه متد به اسم consumeAsync توسط برنامه‌نویس اشاره میکنه. اگر برنامه‌نویس محصول رو با این متد مصرف نکنه، کاربر دیگه نمیتونه اون محصول رو بخره، چون یه بار خریده و هنوز مالکش هست. برای اینکه این مشکل پیش نیاد، برنامه‌نویس باید بلافاصله بعد اینکه خرید کاربر موفق بود، متد consumeAsync رو صدا بزنه و محصول رو مصرف کنه تا کاربر در آینده اگر به اون قابلیت نیاز داشت، بتونه دوباره بخرتش.۳- فروش ماهیانه (اشتراک)- در این حالت کاربر وقتی محصولی رو میخره برای حداقل یکماه میتونه بهش دسترسی داشته باشه و ازش استفاده کنه. در صورتی که اشتراکش رو لغو نکنه، بصورت خودکار در آخر ماه دوباره پول اشتراک ماه بعدی از حسابش کم میشه و اشتراکش تمدید میشه. اگر وسط ماه اشتراکش رو لغو کنه، تا پایان ماه جاری هنوز میتونه از اشتراکی که خریده استفاده کنه و پولی بهش پرداخت نمیشه، فقط در پایان اون ماه دیگه اشتراک بصورت خودکار تمدید نمیشه. در صورتی که از این روش استفاده می‌کنید، حتما به این نکته دقت کنید که اگر حتی یه نفر از شما اشتراک خریده باشه، باید تا اتمام مدت اشتراک اون فرد، خدماتی که در ازاش اشتراک رو فروختید ارائه کنید وگرنه کافه‌بازار با شما برخورد میکنه.۴- فروش سالیانه (اشتراک)- تنها فرق این روش با روش قبلی توی مدت زمان دوره اشتراک هست که بجای ماهیانه، دوره‌اش سالیانه هست.برنامه‌ی Moviesبرای درک بهتره اینکه پیاده‌سازی خرید درون برنامه‌ای چطوریه و چه مراحلی داره، روش‌های بالا رو بصورت قدم به قدم در یک برنامه‌ی اندروید به اسم Movies پیاده‌سازی می‌کنیم. این برنامه قابلیت‌های زیر رو داره:۱- دسترسی به اطلاعات ۱۰ فیلم برتر IMDB مثل نام کارگردان، امتیاز IMDB و خلاصه داستان۲- امکان اضافه کردن فیلم‌ به لیست علاقمندی‌۳- امکان دانلود فیلم‌‌ها۴- امکان دیدن فیلم‌ها بصورت آنلاینالبته این قابلیت‌ها بصورت واقعی توی برنامه پیاده‌سازی نشدن و فقط برای اینکه مثال مقاله به پروژه‌های واقعی شبیه‌تر باشه، این قابلیت‌ها بصورت ظاهری توی برنامه گذاشته شدن. برنامه Movies خیلی ساده هست و از ۳ صفحه درست شده. صفحه اول و اصلی، لیست ۱۰ فیلم رو نشون میده. صفحه دوم، برای نمایش جزییات هر فیلم استفاده میشه. صفحه سوم هم وظیفه‌اش نمایش آنلاین فیلم هست.صفحه اصلی برنامهصفحه نمایش جزییات فیلمسورس برنامه رو بدون کدهای خرید درون برنامه‌ای میتونید از طریق این لینک دانلود کنید یا توی این لینک در گیت‌هاب ببینید.فرض کنید شما مسئول پیاده‌سازی پیشنهادات تیم بازاریابی برای برنامه‌‌ی Movies هستید. تیم بازاریابی پیشنهاد داده که بعضی از قابلیت‌های برنامه پولی بشه. تیم بازاریابی پیشنهادهای زیر رو دادن:قابلیت لیست علاقمندی‌ها- برنامه دو نسخه‌ی پیش نمایش و نسخه‌ی کامل داشته باشه. کاربر باید بتونه نسخه‌ی پیش نمایش رو رایگان روی گوشیش نصب کنه و از اطلاعات فیلم‌ها استفاده بکنه ولی برای اینکه بتونه فیلمی رو به لیست علاقمندی‌هاش اضافه کنه، باید نسخه‌ی کامل برنامه رو بخره.قابلیت دانلود فیلم‌ها- کاربر هر بار میخواد فیلمی رو دانلود کنه، باید مبلغی رو به عنوان هزینه دانلود پرداخت کنه.قابلیت پخش آنلاین فیلم‌ها- قابلیت پخش آنلاین فیلم‌ها فقط برای کاربرانی فعال بشه که اشتراک ماهیانه بخرن. کاربر در زمانی که اشتراک ماهیانه خریده میتونه هر چقدر که خواست فیلم‌های مختلف رو آنلاین ببینه.پیاده‌سازی روش‌های خرید درون برنامه‌ایخب با توجه به اینکه قراره از خرید درون برنامه‌ای برای پیاده‌سازی پیشنهادات تیم بازاریابی استفاده کنید، توی این بخش سه مرحله‌ای که برای اینکار نیاز هست رو مرور کنیم.مرحله اول- اضافه کردن مجوز و کلاس‌های پیش‌نیاز به پروژهمرحله دوم- دریافت کد RSA و تعریف محصولات توی پنل کافه‌بازارمرحله سوم- پیاده‌سازی روش‌های خرید درون برنامه‌ای در پروژهدر ادامه این مرحله‌هارو بیشتر بررسی می‌کنیم و همزمان تغییرات مورد نیاز رو روی پروژه Movies اعمال می‌کنیم.مرحله اول - مقدماتهمانطور که در تصویر اول مقاله نشون داده شده بود، توی فرآیند خرید درون برنامه‌ای نیاز هست که بین برنامه‌ای که خرید داخلش انجام میشه و برنامه‌ی کافه‌بازار ارتباط برقرار بشه. برای این ارتباط، نیاز به یه سری کلاس کمکی و یه فایل AIDL هست. خوشبختانه لازم به دونستن جزییات این کلاس‌ها و فایل AIDL نیست.برای اضافه کردن فایل AIDL باید یه فولدر مخصوص توی پروژه ساخته بشه. برای ساخت فولدر روی app کلیک راست کنید.مسیر زیر رو توی منوی باز شده برید و روی AIDL Folder بزنید.بعد یه فولدر شبیه تصویر زیر اضافه میشه که البته خالی هست.داخلش یه پکیج به اسم com.andorid.vending.billing و داخل پکیج یه کلاس به IInAppBillingService.aidl بسازید، سورس رو از لینک زیر داخل کلاس کپی کنید.IInAppBillingService.aidlکلاس‌های زیر رو هم از لینک‌ها برداشته و مثل بقیه‌ی کلاس‌های معمولی توی پروژه کپی و پیست کنید. میتونید کنار کلاس اکتیویتیون بذاریدشون یا برای اینکه ساختار پروژه تمیزتر باشه یه پکیج به اسم iabhelpers بسازید.Base64.java - Base64DecoderException.java - IabException.java - IabHelper.java - IabResult.java - Inventory.java - Purchase.java - Security.java - SkuDetails.javaدر ضمن برای ارتباط با برنامه کافه‌بازار باید مجوز PAY_THROUGH_BAZAAR رو شبیه زیر توی مانیفست کپی و پیست کنید.AndroidManifest.xml https://gist.github.com/abbas-oveissi/1571d20471fa4d2753ab0d6cbaa7355e مرحله دوم - دریافت RSA و ثبت محصولبرای دریافت کلید RSA و ثبت محصول باید به داشبورد برنامه Movies در پنل توسعه‌دهندگان کافه‌بازار برید. اگر هنوز برنامه‌ی Movies رو به پنل توسعه‌دهندگان کافه‌بازار اضافه نکردید، اول باید اینکارو انجام بدید. برای اینکار از منوی Build اندروید استودیو روی Generate signed build apk کلید کنید.توی پنجره‌ای که باز میشه Apk رو انتخاب و روی Next کلیک کنید. در پنجره‌ی بعدی یه کلید جدید بسازید یا از یه کلیدی که قبلا داشتید برای امضا استفاده کنید (حواستون باشه در آپدیت‌های بعدی باید APK رو با همین کلید امضا کنید و دیگه نمیشه تغییرش داد). توی تصویر زیر من از یه کلید قدیمی استفاده کردم.اگر قبلا کلید نساختید، روی Create New کلیک کنید و طبق راهنمای زیر کلید خودتون رو بسازید.راهنمای ساخت کلید که در صفحه خطای Play Protect کافه‌بازار گذاشتهبعد ساخت کلید جدید یا انتخاب کلید قدیمی روی Next بزنید و بقیه مرحله‌هارو طی کنید تا به Finish برسید، بعد از زدن Finish اندروید استودیو به شما خروجی APK پروژه‌ رو تحویل میده. حالا به پنل توسعه‌دهندگان کافه‌بازار برید و روی «ثبت برنامه جدید» بزنید. پنجره‌ای شبیه تصویر زیر باز میشه.دسته‌بندی برنامه رو انتخاب (راهنمای انتخاب دسته‌بندی) و APK رو آپلود کنید. اگر تیک سبز رو دیدید، یعنی همه چی بدون مشکل پیش رفته و روی دکمه «ایجاد برنامه» بزنید. حالا برنامه‌ی Movies به لیست برنامه‌هاتون توی پنل اضافه میشه و میتونید به داشبورد برنامه برید.توی داشبورد برنامه‌ از بین تب‌های موجود روی «خرید درون برنامه‌ای» کلیک کنید. توی صفحه جدید کلید RSA به شما نمایش داده می‌شود.برای ثبت محصولات روی دکمه «ثبت محصول جدید» بزنید.توی این پروژه ما سه محصول داریم. محصول FULLVERSION که خریدش باعث میشه برنامه تبدیل به نسخه‌ی کامل بشه. محصول DOWNLOAD که کاربر هر بار بخواد فیلمی رو دانلود کنه باید بخرتش. و آخرین محصول STREAMING که کاربر با خریدش میتونه حداقل تا یه ماه، هر فیلمی رو خواست آنلاین ببینه.فرم اطلاعات محصول رو شبیه زیر برای هر سه محصول پر کنید، نوع دو محصول FULLVERSION و DOWNLOAD رو خریدنی و STREAMING رو اشتراک یه ماهه بذارید. برای اینکه بتونید به صورت رایگان روش‌های خرید درون برنامه‌ای رو تست کنید، قیمت‌ همه محصولات رو صفر بذارید. توجه کنید بعد از ساخت محصول امکان تغییر نوع یا شناسه‌ی اون وجود نداره.محصول‌های ساخته شده به جدول محصولات اضافه میشن.شناسه محصولات و کلید RSA رو جایی یادداشت کنید، چون در ادامه بهشون نیاز دارید.مرحله سوم - پیاده‌سازی روش‌های خرید درون برنامه‌ایبرای اتصال به برنامه‌کافه‌بازار از کلاس کمکی IabHelper استفاده میشه که در مرحله اول به پروژه اضافه‌شون کردید. توی متد OnCreate اکتیویتی DetailActivity با فراخوانی متد startSetup ارتباط برقرار میشه و در متد OnDestroy اکتویتی با متد dispose ارتباط قطع میشه.سازنده کلاس IabHelper دو تا پارامتر میگیره، اولی از نوع Context و دومی از نوع رشته هست. این رشته همون کلید RSA هست که توی مرحله قبلی از توی پنل یادداشتشون کردید. کد زیر رو توی onCreate اضافه کنید.InAppPurchase_Code1.java https://gist.github.com/abbas-oveissi/d15cefaed0569624646d7db84366b1fa برای شروع ارتباط با برنامه‌ی کافه‌بازار، کد زیر رو بعد از کد ساخت آبجکت IabHelper بذارید.InAppPurchase_code2.java https://gist.github.com/abbas-oveissi/930a0f4d1e34fde502ba576d8fd252f6 کالبک متد startSetup نتیجه‌ی ارتباط با برنامه‌ی کافه‌بازار خبر میده. اگر result.isSuccess() مقدارش True بود یعنی ارتباط به درستی برقرار شده و میشه از همه‌ی متدهای خرید درون برنامه‌ای استفاده کرد.برای اینکه کالبک‌هایی که ست میکنید درست کار کنند، تیکه کد زیر رو حتما توی onActivityResult اکتیویتی DetailActivity بذارید.InAppPurchase_code3.java https://gist.github.com/abbas-oveissi/e6e268c73bbad2bf349dbe293cd1e121 متد زیر رو هم توی اکتیویتی کپی کنید تا باهاش بتونید از اینکه برنامه‌ی کافه‌بازار روی گوشی کاربر نصب هست، مطمئن بشید.InAppPurchase_code4.java https://gist.github.com/abbas-oveissi/d8d0d05643e65743f2c66209e9fbf58d برای اینکه کد تمیزتر باشه، به ازای سه تا محصولی که توی پنل ساخته شده، سه تا متغییر ثابت به شکل زیر تعریف می‌کنیم. در ادامه اگر جایی به شناسه محصول‌ها نیاز بود، از این متغیرها استفاده می‌کنیم.InAppPurchase_Constants.java https://gist.github.com/abbas-oveissi/af289cba4988f61a1620865c60d2bd4f خب حالا نوبت پیاده‌سازی روش‌های خرید درون برنامه‌ای هست که از محصول FULLVERSION شروع می‌کنیم.فروش دائمی FULLVERSIONاگر کاربر این محصول رو خریده باشه باید بتونه از همه قابلیت‌هایی برنامه که مخصوص نسخه‌ی کامل هست، استفاده کنه. توی پروژه‌ی Movies قراره اضافه کردن یه فیلم به لیست علاقمندی‌ها، جزء قابلیت‌های نسخه‌ی کامل باشه.وقتی کاربر روی دکمه‌ی علاقمندی‌ها کلیک کرد، برای اینکه بدونید آیا کاربر نسخه‌ی کامل رو خریده یا نه، یه متد به اسم isUserBuyFullVersion با کدهای زیر بسازید و صداش کنید.InAppPurchase_code5.java https://gist.github.com/abbas-oveissi/e91ba4d3a541b902669f73166446ea6c داخل این متد اول از طریق متد isCafeInstalled چک شده که روی گوشی کاربر کافه‌بازار نصب هست یا نه، اگر نصب بود با استفاده از متد QueryInventoryFinishedListener کلاس IabHelper چک شده که آیا کاربر محصول FULLVERSION رو خریده یا نه. داخل کالبک این متد، شناسه محصول رو اگر به متد hasPurchase آبجکت Inventory بدید، بهتون میگه آیا کاربر این محصول رو خریده یا نه.اگر خروجی HasPurchase برای شناسه محصول True بود، متد bookmarkMovie صدا زده میشه و توی این متد باید فیلم به لیست علاقمندی‌ها اضافه بشه (البته بصورت نمادین دیگه!)، اگر خروجی False بود، متد buyFullVersion صدا زده میشه تا فرآیند خرید نسخه‌ی کامل آغاز بشه.توی متد buyFullVersion باید متد launchPurchaseFlow آبجکت mHelper رو مثل کد زیر صدا بزنید. این متد ۴ پارامتر داره، پارامتر اول اکتیویتی رو میخواد که this بهش بدید، پارامتر دوم شناسه محصول رو میخواد، پارامتر سوم یه عدد صحیح به عنوان request code بدید و در نهایت کالبک رو ست کنید.InAppPurchase_code6.java https://gist.github.com/abbas-oveissi/588b733e926037570f532d43bd583874 زمانی که خرید موفق یا ناموفق نتیجه‌اش مشخص بشه، متد onIabPurchaseFinished صدا زده میشه. توی این متد از طریق اطلاعاتی که توی آبجکت info از کلاس Purchase میده، میتونیم متوجه بشید خرید موفق بوده یا نه. اگر موفق بود متد bookmarkMovie رو صدا بزنید تا فیلم به لیست علاقمندی‌ها اضافه بشه (باز تاکید میکنم بصورت نمادین!).خب پیاده‌سازی این روش تموم شد، برای اطمینان از اینکه همه مراحل رو درست رفتید، یه بار تست کنید تا ببینید فرآیند خرید بدون خطا انجام میشه یا نه. فروش موقت DOWNLOADهر بار کاربر میخواد فیلمی رو دانلود کنه باید محصول DOWNLOAD رو بخره. کد پیاده‌سازی خرید درون برنامه‌ای برای این محصول با محصول قبلی دو تا تفاوت داره. اول اینکه بعد از اتمام فرآیند خرید، باید متد consumeAsync صدا زده بشه، دوم اینکه نیازی نیست چک کنید کاربر قبلا این مصحول رو خریده یا نه، چون هر بار باید بخره.یه متد به اسم buyDownload بسازید و هر بار کاربر روی دکمه‌ی دانلود کلیک کرد، صداش بزنید. کدهای زیر رو داخلش کپی کنید.InAppPurchase_code7.java https://gist.github.com/abbas-oveissi/4eaa5d91bd94087b538216da59eea348 کد داخل این متد شبیه همون متد buyFullVersion هست، اول چک میشه روی گوشی برنامه‌ی کافه‌بازار هست یا نه، اگر نصب بود متد launchPurchaseFlow صدا زده میشه.فقط توی این روش وقتی خرید با موفقیت تموم شد، باز از طریق متد consumeAsync محصولی رو که کاربر خریده مصرف شده. پارامتر اول یه آبجکت از کلاس Purchase هست که توی کالبک متد launchPurchaseFlow بهمون داده میشه. کد مصرف کردنش به شکل زیره:InAppPurchase_code8.java https://gist.github.com/abbas-oveissi/d799168cddb0dcf0b777f772f1479e09 اگر مقدار result.isFailure() برابر با false بود، مشخص میشه که محصول به درستی مصرف شده و با صدا زدن متد startDownloading دانلود فیلم شروع میشه (باز اینم بصورت نمادینه).فروش اشتراک STREAMINGکاربر برای دیدن آنلاین فیلم‌ها باید اشتراک دیدن آنلاین فیلم (محصول STREAMING) رو خریده باشه. وقتی این محصول رو بخره، تا زمانی که لغوش نکرده باشه، هر ماه اشتراکش تمدید میشه و هرچقدر بخواد میتونه فیلم‌های مختلف رو بصورت آنلاین توی برنامه Movies ببینه.یه متد به اسم isUserBuyStreaming بسازید و وقتی کاربر روی دکمه بخش فیلم کلیک کرد صداش بزنید. کدهای زیر رو داخلش کپی کنید.InAppPurchase_code9.java https://gist.github.com/abbas-oveissi/8314028c31a5e89e9b9ef3308eda2beb اگر روی گوشی کاربر برنامه‌ی کافه‌بازار نصب بود، متد queryInventoryAsync صدا زده میشه تا مشخص بشه که کاربر اشتراک STREAMING رو خریده یا نه. اگر خریده بود به صفحه نمایش فیلم منتقل میشه و اگر نخریده بود متد buyStreaming صدا زده میشه. توی buyStreaming مثل زیر متد launchPurchaseFlow صدا زده بزنید تا فرآیند خرید اشتراک شروع بشه.InAppPurchase_Code10.java https://gist.github.com/abbas-oveissi/f26176873955a97bbcd1bfe242cf63b8 اگر خرید اشتراک با موفقیت انجام شد، یعنی مقدار result.isFailure() برابر false بود و مطمئن شدیم info برای محصول STREAMING هست، کاربر رو به صفحه نمایش فیلم منتقل میشه.وب‌سرویس‌های (API) کافه‌بازار کافه‌بازار برای بخش خرید درون برنامه‌ای یه سری وب‌سرویس درست کرده که باهاش میشه خریدها و اشتراک‌های کاربران رو چک کرد. البته در بیشتر مواقع همون پنل توسعه‌دهندگان کافه‌بازار برای دیدن این اطلاعات کافی هست ولی اگر شمابرای خودتون یه پنل مدیریتی وب دارید، شاید بخواید اونجا گزارش چندتا برنامه رو با هم ببینید یا صحت خریدهای کاربران رو قبل از ثبت در دیتابیس از طریق کافه‌بازار چک کنید.بطور مثال فرض کنید میخواید قبل از اینکه خرید کاربر رو در دیتابیس سرورتون ثبت کنید، میخواید مطمئن بشید که خرید حتما انجام شده و درخواست یه درخواست تقلبی نیست. برای اینکار سه مرحله به فرآیند خرید درون برنامه‌ای که اول مقاله در موردش صحبت کردیم اضافه میشه (فرآیند Authorization رو در نظر نگرفتم، ابتدا باید اینکارو انجام بدین، توی مستندات کافه‌بازار جزییاتش هست). وقتی خرید با موفقیت انجام شد، برنامه باید به سرورتون اعلام کنه کاربر x محصول y رو خریده (شماره ۵)، بعد سرور از طریق APIهای کافه‌بازار چک میکنه واقعا همچین خریدی توسط کاربر x انجام شده یا نه؟! (شماره ۶). اگر جواب وب‌سرویس کافه‌بازار این بود که خرید انجام شده (شماره ۷)، شما با اطمینان خاطر میتونید خرید رو توی دیتابیس ذخیره کنید و به برنامه خبر بدید که خرید کاربر در دیتابیس سرورتون اعمال شده.فرآیند خرید درون برنامه‌ی + صحت سنجی خرید از طریق APIبدلیل اینکه مقاله طولانی نشه، اینجا در مورد جزییات پیاده‌سازی کار با APIهای کافه‌بازار صحبت نمی‌کنیم ولی خود مستندات API کافه‌بازار در این رابطه کامل هست، اگر روزی خواستید ازش استفاده کنید به اون مستندات مراجعه کنید.وضعیت لاگین بودن کاربر در حساب کافه‌بازاربرای اینکه بتونید لیست خریدهای کاربر رو از اپ کافه‌بازار بگیرید یا خریدی رو مصرف کنید، کاربر باید در برنامه‌ی کافه‌بازار لاگین کرده باشه.اگر کاربر لاگین نکرده باشه، توی کالبک این متدها result.isFailure() مقدار True رو برمیگردونه و نشون میده مشکلی پیش اومده. در این حالت برنامه کافه‌بازار با یه ناتیکفییشن (شبیه تصویر زیر) کاربر رو متوجه میکنه که باید وارد حسابش در کافه‌بازار بشه.ولی راه بهتر اینه شما خودتون قبل از اینکه متد queryInventoryAsync یا consumeAsync رو صدا بزنید، از لاگین بودن کاربر مطمئن بشید. توی این مقاله در مورد جزییات پیاده‌سازی این قضیه صحبت نمی‌کنیم ولی توی پروژه Movies پیاده‌سازیش انجام شده و اول دو متد isUserBuyStreaming و isUserBuyFullVersion وضعیت لاگین کاربر چک میشه. برای خوندن جزییات پیاده‌سازی به این لینک در مستندات کافه‌بازار مراجعه کنید.و بالاخره پایان!فکرکنم خیلی زودتر از این‌ها منتظر این بخش مقاله بودید D: ببخشید اگر مقاله طولانی شد، امیدوارم از اینکه خوندینش پشیمون نشده باشید و جواب سوال‌هاتون رو گرفته باشید. حتما مستندات خود کافه‌بازار رو هم بخونید، اونجا خیلی کاملتر همه‌ی جزییات رو توضیح دادند. من فقط سعی کردم همون نکات رو ساده‌ و خلاصه‌تر با یه مثال شبه واقعی توی این مقاله بگم.در ضمن سورس کامل پروژه که همه روش‌های خرید درون برنامه‌ای داخل پیاده شدن رو میتونید توی ریپوی گیت‌هاب زیر ببینید.https://github.com/abbas-oveissi/Movies-InAppBillingلینک بالا به آخرین کامیت برنچ Master اشاره می‌کنه که شامل پیاده‌سازی همه‌ی روش‌ها به همراه کدهای چک کردن وضعیت لاگین بودن کاربر هست.اگر پیاده‌سازی همه‌ی روش‌هارو بدون چک کردن لاگین بودن کاربر میخواهید از این لینک استفاده کنید.اگر پیاده‌سازی هر روش رو جدا میخواهید ببینید از برنچ‌های دیگه به نام‌های consumable، non-consumable و subscription استفاده کنید.