پرداخت امن کافه بازار

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

طبق مشاهداتی که داشتیم، بیش از ۷۵ درصد کاربران با استفاده از برنامه‌هایی مثل لاکی پچر اقدام به فعالسازی بازی‌ها و برنامه‌ها می‌کنن. متاسفانه این برنامه، مثل آب خوردن هر بازی یا برنامه‌ای رو هک میکنه. و تاسف بیشتر از اینکه کاربران ما به دلیل عدم اطلاع از بار شرعی و اخلاقی، از این برنامه استفاده میکنن. بعد از استقبال بسیار خوب از آموزش پرداخت امن کافه بازار در بازیهای یونیتی، تصمیم گرفتیم این آموزش رو برای برنامه‌های اندروید هم آماده کنیم.

مسلما در جایگاه یک توسعه‌دهنده یا صاحب اثر دوست ندارید زحمات چند ماهه شما که در رویای فروش میلیونی بوده با یک برنامه هک برباد بره، و در نهایت نتیجه بشه اینکه فروش شما زیر ۱۰۰ هزار تومن باشه. ما هم دوست نداریم این اتفاق برای شما بیفته. اما تا وقتی راه برای تقلب و هک کردن باز باشه، افرادی خواسته و ناخواسته ازش استفاده میکنن.

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

به همین دلیل و در راستای ارتقاء سطح درآمد شما، در این مطلب پرداخت امن کافه بازار رو در برنامه‌های اندروید با استفاده از API توسعه دهندگان کافه‌بازار بدون نیاز به داشتن سرور آموزش میدیم.

کلیت کار به این شکله که شما ابتدا باید یک کلاینت در کافه‌بازار بسازید که آموزش میدیم چطور، و بعد در برنامه خودتون هر خریدی که انجام شد، توکن خرید رو به بازار ارسال کنید و بررسی کنید آیا این خرید معتبر هست یا نه.

 

آموزش ساخت کلاینت در کافه‌بازار

این آموزش در مستندات کافه‌بازار وجود داره، اما شاید گام به گام و راحت نباشه برای همه.

برای این کار به بخش امور مالی و فروش در پنل خودتون برید و بعد تب API توسعه دهنده رو انتخاب کنید.

در این صفحه روی دکمه client جدید کلیک کنید. در دیالوگ باز شده به جای مقدار Redirect URI یک آدرس وب بدید. اگر سایت دارید آدرس سایت خودتون، اگر ندارید هم مهم نیست. هرچیزی بزنید فرقی نداره. مثلا بزنید http://bobardo.com

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

بعد توی مرورگر لینک زیر رو کپی کنید:

https://pardakht.cafebazaar.ir/devapi/v2/auth/authorize/?response_type=code&access_type=offline&redirect_uri=XXXXX&client_id=YYYYY

توی این لینک باید دو تا مقدار رو مشخص کنید. آخر لینک به جای XXXXX آدرس لینک توی کلاینت رو وارد کنید. و به جای YYYYY مقدار client id توی کلاینت رو وارد کنید. لینک در نهایت باید بدون فاصله باشه. حالا اینتر بزنید.

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

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

بعد از زدن دکمه تایید، آدرسی که توی کلاینت وارد کردید باز میشه و توی مرورگر بعد از آدرس یک پارامتر code دیده میشه. مثلا به شکل زیر:

http://bobardo.com/?code=6hsH0MGCVOzSv1rVMpIGnF

مقدار مقابل code رو توی مرحله بعدی استفاده میکنیم.

 

گرفتن refresh code

لینک زیر رو باز کنید.

https://pardakht.cafebazaar.ir/devapi/v2/auth/token/

توی صفحه باز شده به جای مقدار grant_type بنویسید authorization_code

به جای code مقدار دریافت شده در مرحله قبل رو وارد کنید و به جای سه پارامتر دیگه اطلاعات کلاینتی که توی بازار ساختید رو قرار بدید.

روی دکمه authorize کلیک کنید. در صورتی که اطلاعات درست باشه یک جیسون به شکل زیر براتون میاد:

{
"access_token": "GWObRK06KHLr8pCQzDXJ9hcDdSC3eV",
"token_type": "Bearer",
"expires_in": 3600000,
"refresh_token": "yBC4br1l6OCNWnahJvreOchIZ9B6ze",
"scope": "androidpublisher"
}

خب حالا ما مقدار refresh token رو از این جیسون نیاز داریم. پس یه جا ذخیرش کنید.

 

بررسی اعتبار پرداخت

حالا که رفرش توکن رو داریم، میریم سمت برنامه اندروید. روش کار به این شکله که هر بار برای اینکه درستی یک خرید رو تشخیص بدید باید یک access token به بازار بفرستید، اما این توکن دسترسی بعد از زمان کوتاهی منقضی میشه.

برای همین، هر سری ما به صورت اتوماتیک و با استفاده از رفرش توکن باید یک توکن دسترسی جدید بگیریم.

برای بررسی خرید از بازار دو راه وجود داره:

اول اینکه یک وب سرویس روی سرورتون داشته باشید که نقش واسط رو بازی کنه، به این شکل که درخواست از اپلیکیشن شما به وب سرویس بره و بعد سرور شما از بازار استعلام بگیره و نتیجه رو به شما بگه. این روش برای حالتی خوبه که شما بخواین خریدها رو سمت سرور ذخیره کنید که بتونید عملیات دیگه‌ای در آینده انجام بدید یا بخواین کاربرا رو مدیریت کنین. معایب این روش اینه که حتما نیاز به سرور داره که خب هزینه هم داره (حداقل سالی ۵۰ هزار تومن) و عیب دیگه اینکه اگه سرورتون به هر دلیلی جواب نده، خریدهاتون تایید نمیشه و کاربرا نمیتونن محصول رو دریافت کنن.

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

ما اینجا روی روش دوم تمرکز میکنیم.

 

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

در اینجا ما آموزش رو طبق سیستم اندروید استودیو جلو میبریم.

فرض بر این گذاشته میشه که شما تمام کارهای مربوط به پرداخت درون برنامه‌ای رو انجام دادید و پروژه کاملا آماده ست.

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

<uses-permission android:name="android.permission.INTERNET" />

ما برای اتصال به اینترنت، دریافت access token و تایید اعتبار خرید از کتابخونه Volley استفاده میکنیم. این کتابخونه رو باید داخل فایل gradle خودتون توی قسمت dependencies به شکل زیر اضافه کنید.

compile 'com.android.volley:volley:1.0.0'

بعد اجازه بدید تا گردل خودش رو سینک کنه و کتابخونه اضافه بشه. برای استفاده از کتابخونه شاید نیاز باشه یکبار پروژه رو Rebuild کنید (از تب Build)

حالا کلاس زیر رو دانلود کنید و به پروژتون اضافه کنید. این کلاس تمام کارهای مربوط به تایید اعتبار رو انجام میده.

دانلود BobardoPurchaseValidator.java

حالا اکتیویتی مربوط به پرداخت خودتون رو باز کنید. این اکتیویتی باید BazaarPurchaseValidator.OnValidatePurchaseListener رو implement کنه. یعنی کلاس اکتیویتی شما باید به شکل زیر تعریف بشه:

public class MyPaymentActivity extends Activity implements BobardoPurchaseValidator.OnValidatePurchaseListener { ...

بعد از این کار اندروید استودیو بهتون خطا میده. روی خطا کلیک کنید و Ctrl + i رو بزنید. بعد در پنجره‌ای که باز میشه ok‌ بزنید تا تابع onValidatePurchase به کلاستون اضافه بشه.

ساختار این تابع به شکل زیر هست:

@Override
public void onValidatePurchase(boolean isValid, boolean isRefund, boolean isConsumed, String sku, String orderId, String payload) {

}

 

اعتبارسنجی خریدها

داخل کلاس و ابتدای اون متغیر زیر رو تعریف کنید

private BobardoPurchaseValidator bobardoPurchaseValidator;

توی تابع onCreate کلاستون این کد رو بنویسید و مقادیر خواسته شده رو وارد کنید:

bobardoPurchaseValidator = new BobardoPurchaseValidator();
bobardoPurchaseValidator.setup(this,
        "your client id",
        "your client secret",
        "your refresh token");

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

زمانی که کاربر خرید میکنه تابع mPurchaseFinishedListener از طرف کافه‌بازار صدا زده میشه که برای بررسی درستی خرید میتونید به شکل زیر عمل کنید:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {

        if (result.isFailure()) {
            return;
        }

        // show a loading to user !!!
        bobardoPurchaseValidator.validatePurchase(purchase.getSku(), purchase.getOrderId());

    }
};

و زمانی که کاربر خریدهای قبلی رو چک میکنه تابع mGotInventoryListener از طرف کافه‌بازار صدا زده میشه، که برای بررسی درستی خرید میتونید به شکل زیر عمل کنید:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

            if (result.isFailure()) {
                return;
            } else {

                if (inventory.hasPurchase(your_product_SKU)) {

                    // show a loading to user !!!
                    bobardoPurchaseValidator.validatePurchase(your_product_SKU, inventory.getPurchase(your_product_SKU).getOrderId());

                }
            }
        }
    };

 

مرحله پایانی

بعد از ارسال درخواست بررسی خرید، بسته به سرعت اینترنت کاربر و سرورهای کافه‌بازار چند ثانیه‌ای طول میکشه و در نهایت جواب به تابع onValidatePurchase ارسال میشه.

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

در تابع onValidatePurchase بعد از بررسی اینکه خرید isValid هست و isRefund نیست، بر اساس sku محصول خریداری شده، محصول رو برای کاربر فعال کنید.

نکته مهمتر: حتما سیستم رو قشنگ تست کنید در شرایط مختلف، و مطمئن بشید همه چیز تحت کنترل شماست.

لازم به ذکر هست که هدف اصلی API توسعه دهندگان اعتبارسنجی خریدها نیست. ممکنه به دلیل کندی سرعت اینترنت یا قطعی موقت این سیستم، خریدها تایید نشن و کاربران محصول رو دریافت نکنن. در این حالت شما باید حتما به کاربران امکان تلاش مجدد برای اعتبارسنجی خرید رو بدید.

 

حمایت از ما

این آموزش به رایگان در اختیار شما توسعه‌دهنده عزیز قرار گرفته تا بتونید جلوی ضررهای مالی زیادی رو بگیرید. در صورت استفاده از این آموزش و رضایت، میتونید ما رو از حمایت خودتون بهره‌مند کنید.

حمایت مالی به میزان دلخواه -> کلیک کنید

حمایت معنوی، به هر شکلی که بتونه به ما انگیزه بده 😉

لطفا بازخوردها و نظرات خودتون رو از طریق کامنت ثبت کنید.

 

حجت ریحانه

من عاشق برنامه‌نویسی، یاد گرفتن و آموزش دادن هستم. انجام کارای جدید توی برنامه‌نویسی رو بیشتر به چشم سرگرمی میبینم تا کار.

20 ديدگاه بر “پرداخت امن کافه بازار برای برنامه‌های اندروید

  1. برای بررسی خرید از بازار دو راه وجود داره:

    اول اینکه یک وب سرویس روی سرورتون داشته باشید که نقش واسط رو بازی کنه، به این شکل که درخواست از اپلیکیشن شما به وب سرویس بره و بعد سرور شما از بازار استعلام بگیره و نتیجه رو به شما بگه. این روش برای حالتی خوبه که شما بخواین خریدها رو سمت سرور ذخیره کنید که بتونید عملیات دیگه‌ای در آینده انجام بدید یا بخواین کاربرا رو مدیریت کنین. معایب این روش اینه که حتما نیاز به سرور داره که خب هزینه هم داره (حداقل سالی ۵۰ هزار تومن) و عیب دیگه اینکه اگه سرورتون به هر دلیلی جواب نده، خریدهاتون تایید نمیشه و کاربرا نمیتونن محصول رو دریافت کنن.

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

    ما اینجا روی روش دوم تمرکز میکنیم.

    1. سلام مجدد
      روش وب سرویس رو منظورتونه
      کار با این روش تفاوت زیادی با روش اول نداره، فقط عملیات استعلام از کافه‌بازار رو باید سمت سرور انجام بدید.
      برای این کار باید یک زبان سمت سرور رو یاد داشته باشید. مثلا php
      از اونجایی که نمیشه php رو آموزش داد، من به شما چند تا مطلب مرتبط با این موضوع معرفی میکنم که دنبالش برید و پیاده سازی کنید.

      http://barnamenevis.org/showthread.php?482457-%D9%81%D8%B1%D8%A7%D8%B1-%D8%A7%D8%B2-%D8%AF%D8%B3%D8%AA-Lucky-Patcher&p=2177474&viewfull=1#post2177474

      http://barnamenevis.org/showthread.php?488813-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-api-%D8%A8%D8%A7%D8%B2%D8%A7%D8%B1

    2. نباید تایید رو سمت کلاینت انجام بدیم … با این روش هم با برنامه های دیگه ای هک می شن…. تایید حتما باید سمت سرور باشه

  2. داداش این چه کاریه آخه؟ :|||
    اگه قرار باشه refresh_token رو بذاریم تو اپ که دیگه بازار authorize رو نمیگذاشت… اونم تازه expire میشه بعد یه مدت و اگه برنامه بعد expire شدن بخواد خرید انجام شده رو چک کنه خطا میده… باید این کارا سمت سرور خود توسعه دهنده انجام بشه که قابل هک نباشه و گرنه این کد رو اگه مستقیم بذاری تو اپ با یه کپچر پکت ارسالی ساده میشه بدستش آورد و با یک توکن خرید هزاران بار خرید انجام داد…

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

  3. اقا دمتم گرم بخاطر آموزش. ولی من اون کلاسی که گذاشتین، رو میخوام با رتروفیت پیاده کنم ولی نمیدونم چطوری

  4. با سلام. خواهشمندیم نحوه ایمن کردن پرداخت درون برنامه ای داخل یونیتی رو هم توضیح بفرمایید

  5. سلام و عرض ادب …
    برادر میشه این پلاگین رو برای بازی های pc و mac و xbox one هم استفاده کرد یا فقط روی android جواب میده؟؟؟

  6. سلام وقت بخیر ببخشید بنده برای قفل گذاری روی محصولم یک لایه دکمه ترنسپرنت گذاشتم که اگر این دکمه باشه میره برای خرید اگر نباشه اینتنت میکنه به صفحه خدمات ویژه حالا برای فعال و غیر فعال کردن اون دکمه قفل به نظر شما تابع ترو فالس خوبه بزارم که بگم هر زمان خرید خورد ترو کن و با بازو بسته شدن اپلیکیشن هر بار بیاد چک کنه یا شیر پریفرنسز استفاده کنم؟ یا هر روشی که خودتون میدونید پیشنهاد بدید و رایج هست

  7. تشکر میکنم از شما

    ولی یک سوال دارم برای دریافت توکن خرید یا اعتبار خرید کاربر که برنامه را به صورت خرید فروشی دریافت کرده است یعنی قبل از دانلود برنامه پرداخت را انجام داده چگونه باید عمل کنیم ایا کسی راهی میشناسه

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

  8. سلام
    مدیر سایت جت اموز هستم
    اموزش پرداخت درون برنامه ای یونیتی به کافه بازار را با کامپوننت شما در لینک زیر قرار داده ام
    https://jetamooz.com/courses/in-app-billing-inside-cafebazaar-on-unity/

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

  9. سلام خیلی ممنون از اموزش راحتتون
    من تا این مرحله پیش رفتم:پیاده‌سازی مقدمات در برنامه
    اما من با (جواپ) کار میکنم و از اینا چیزی سردرنمیارم
    لطفا کمکم کن تا ۳۰ ام وقت دارم

    1. سلام
      این آموزش مخصوص جاوا هست.
      متاسفانه در مورد پیاده‌سازی در اپلیکیشن‌سازها اطلاعی ندارم و نمیدونم قابل انجام هست یا نه.

  10. من برنامم کامله
    توی کافه بازار هم هست
    گفته باید یک نسخه دیگه بیرون بدم
    الان میتونم با این برنامه هایی مثل apk editor و اینجور چیزا این کلاینت رو توش جایگذاری کنم
    (کمک کنی دعات میکنم)

    1. سلام و وقت بخیر

      متاسفانه راجع به APK editor ها اطلاعات زیادی ندارم.
      اما فکر میکنم احتمالا بشه این کار رو کرد.
      مشکل اصلی همون امضاء apk هست که باید فایلش رو داشته باشید.

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

    1. سلام
      خیلی ممنون
      استفاده از این سرویس‌ها تنها زمانی توجیه داره که شما نتونید خودتون انجام بدید یا نتونید کسی رو پیدا کنید که براتون انجام بده.
      به شخصه و طبق تجربه‌ای که داشتم، استفاده از سرویس‌های واسط رو برای موارد مهمی مثل پرداخت پیشنهاد نمیکنم.
      اعتبارسنجی پرداخت می‌تونه بدون نیاز به سرور انجام بشه. به این صورت که مستقیما کلاینت شما به سرور بازار متصل بشه.
      بنابراین نیاز به واسط حذف میشه و پایداری سیستم پرداختتون هم بالا میره.

دیدگاهتان را بنویسید

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