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

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

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

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

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

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

در صورتی که به دنبال برقراری امنیت پرداخت در برنامه‌های اندروید (java) هستید، به این مطلب مراجعه کنید.

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

 

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

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

برای این کار به بخش امور مالی و فروش در پنل خودتون برید و بعد تب 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 به بازار بفرستید، اما این توکن دسترسی بعد از زمان کوتاهی منقضی میشه. برای همین هر سری ما با استفاده از رفرش توکن باید یک توکن دسترسی جدید بگیریم.

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

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

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

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

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

 

بررسی پرداخت در داخل بازی

اسکریپت زیر رو دانلود کنید و توی پروژتون قرار بدید.

دانلود اسکریپت checkIABValidate

این اسکریپت رو به گیم آبجکت com.bobardo IAB نسبت بدید. بعد مقادیر packageName ، client_id ، client_secret و refresh_token رو وارد کنید.

 

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

 

بعد اسکریپت InAppStore رو باز کنید. و تابع زیر رو بهش اضافه کنید.

private void onPurchaseValidated(bool success, string message, validateResult result)
{
    if (success)
    {
        if (!result.isRefund) // اگر خرید از طرف کافه‌بازار برگشت داده نشده
        {
            // در صورت نیاز میتونید مصرف شدن محصول رو چک کنید
            // if (result.isConsumed) // اگر محصول مصرف شده

            // اینجا محصول رو به کاربر بدید
        }
        else
        {
            Debug.Log("the purchase is refund");
        }
    }
    else
    {
        // error in validating, or purchase is not valid
        // you can let user retry validating the purchase
        Debug.Log(message);
    }

    // hide loading here
}

حالا بعد از اینکه خرید انجام شد توی تابع purchasedSuccessful یا بعد از اینکه بررسی کردید کاربر قبلا یک محصول رو خریده یا نه توی تابع userHasThisProduct کد زیر رو برای بررسی اینکه آیا خرید کاربر معتبر هست مینویسیم:

GetComponent<CheckIABValidate>().check(purchase, onPurchaseValidated);

بعد از این کد بهتره یک لودینگ به کاربر نمایش بدید چون ممکنه اتصال به سرور بازار و بررسی چند ثانیه طول بکشه.

 

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

نتیجه بررسی به تابع onPurchaseValidated ارسال میشه. که پارامتر اول مشخص کننده اینه که آیا ارتباط با سرور موفقیت آمیز بوده و کاربر این محصول رو خریده یا نه. در صورتی که اینترنت کاربر ضعیف باشه یا سرورهای بازار جواب ندن و یا این خرید معتبر نباشه مقدار success برابر false خواهد بود.

پارامتر message نتیجه بررسی رو به صورت پیام نشون میده.

پارامتر result در صورتی که محصول به درستی خریداری شده باشه جزئیات خرید رو شامل میشه.

با متغیر result.isRefund میتونید بفهمید که آیا هزینه خرید به کاربر بازگشت داده شده یا نه.

با متغیر result.isConsumed میتونید بفهمید آیا این محصول مصرف شده یا خیر.

در نهایت میتونید توی تابع onPurchaseValidated در صورت درست بودن نتیجه بررسی و شرط هایی که میذارید، محصول رو به کاربر بدید.

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

نکته مهم: حتما در صورتی که جواب success برابر false بود، برای کاربر امکان تلاش مجدد رو فراهم کنید. (از پروژه نمونه ایده بگیرید)

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

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

 

دانلود

مشاهده پروژه در Github

دانلود پروژه نمونه امنیت پرداخت در کافه بازار (پیاده سازی شده با یونیتی ۵.۴.۲)

دانلود فایل APK پیاده سازی شده جهت تست

 

http://s8.picofile.com/file/8281595742/support_us_banner.jpg

 

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

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

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

 

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

 

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

حجت ریحانه

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

96 ديدگاه بر “آموزش مقابله با هک و امنیت پرداخت کافه بازار در یونیتی

  1. سلام خسته نباشید
    عالیه

    فقط یک سوال :
    این GetComponent().check(purchase, onPurchaseValidated); رو من باید داخل case ها فراخوانی کنم ؟
    یا فقط یک بار اول دستورات ؟
    یه خورده بیشتر توضیح بدید که چطوری باید از تابعonPurchaseValidated استفاده کنیم
    الان من باید تو purchasedSuccessful چک کنم که خرید درست انجام شد و محصول رو به پلیر بدم یا داخل تابعonPurchaseValidated ؟

    1. سلام
      تابع purchasedSuccessful بعد از خرید صدا زده میشه، توی این تابع نباید چیزی به کاربر بدید. و فقط اون یک خط کد مربوط به چک کردن خرید رو بنویسید. (و همینطور نمایش لودینگ)
      switch case رو منتقل کنید به تابع onPurchaseValidated.
      تابع onPurchaseValidated بعد از درخواست بررسی اعتبار خرید صدا زده میشه و نتیجه یا مثبته یا منفی. داخل شرط درست بودن محصول رو به کاربر بدید.

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

  2. سلام ببخشید هی پیام میدم کاش
    ای تلگرامی چیزی تو تماس با ما بود که باهم در ارتباط بودیم
    من طبق توضیحات شما case هارو منتقل کردم به تابعتابعonPurchaseValidated ولی سوالی که پیش میاد اینه
    که تو کدوم شرط من باید این case هارو برسی کنم که اگه محصول خریده شد پلیر دریافت کنه
    من تقریبا با تمام پارامتر های result کار کردم ولی نتیجه ای نداشت خرید انجام میشد ولی محصول به پلیر داده نمیشد
    result.isRefund!
    result.isRefund
    result.isConsumed
    result.isConsumed!
    و success
    برسی کردم ولی محصول به پلیر داده نمیشد
    یه عکس از نحوه استفادهhttp://s8.picofile.com/file/8281741384/sdsd.PNG
    بازم ممنون D:

    1. سلام مجدد
      هیچ اشکالی نداره هر سوال و مشکلی داشتید بپرسید.
      متاسفانه بعد از بررسی متوجه شدم یک اشکال کوچیک توی اسکریپت checkIABValidate وجود داره.
      این اسکریپت رو دوباره دانلود کنید. توی صحنه یونیتی لازمه اسم پکیج خودتون رو توی این اسکریپت وارد کنید.
      شما باید در صورتی که success برابر true بود محصول رو بدید به کاربر.
      شرط !result.isRefund برای اینه که اگر خرید کاربر برگشت داده نشده محصول رو بدید. که چیز خیلی مهمی نیست و خیلی کم پیش میاد.
      من به زودی نمونه پروژه این آموزش رو هم قرار میدم تا ابهامات کامل رفع بشه.

  3. سلام مجدد
    مهندس مشکل حل نشد و باز هم خرید انجام میشه ولی محصول به داده نمیشه
    تو شرط success این برسی رو انجام دادم ولی بازم مثل قبل
    باتشکر

    1. سلام
      اگر باز هم جواب نمیده احتمالا یک جای کار رو اشتباه انجام دادید. ممکنه اطلاعات api رو اشتباه وارد کردید یا مشکلات این چنین.
      توی تابع onPurchaseValidated پارامتر message رو ببینید چی برمیگردونه. این میتونه خیلی به رفع مشکل کمک کنه.
      من نمونه پروژه رو خیلی زود آماده میکنم و قرار میدم.

  4. سلام مهندس واقعا دستتون درد نکنه

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

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

  5. با سلام
    اقا برای من همه مراحل رو مو ب مو پیش رفتم و هیچ ایرادی نداشت فقط ۲ چیز:
    ۱-ی ارور زرد رنگ که نوشته تو اسکریپت storehandler ی متغییر unityclass مهرفی شده و شما هییچوقت ازش استفاده نکردی.
    ۲-موقعی که توی بازی روی دکمه ۱ کلیک میکنم و پیغام میده محصول فلان با قیمت فلان… و من رمز حساب کافه بازارمو که میزنم یهو ارور unfortunately میده
    و کار نمیکنه حالا باید چکار کنم؟؟؟

    1. سلام
      اون ارور زرد رنگ مهم نیست، اون متغیر هم چون استفاده نشده میتونه پاک بشه موردی نداره.
      فورس کلوز گرفتن موقع خرید میتونه از اطلاعات نادرستی که توی پلاگین وارد کردید ناشی بشه.
      مثلا اگر public key نادرست وارد بشه فورس کلوز میده.
      مطمئن بشید تمام اطلاعات پرداخت درست وارد شده.
      اگر مشکل حل نشد اطلاع بدید، چون باید لاگ خطای فورس کلوز دیده بشه تا دقیقا مشخص بشه مشکل چیه.
      موفق باشید

  6. با سلام و تشکر از شما
    من سوالی از شما داشتم که مربوط به این مطلب نیست
    می خواستم اگر امکان دارد اسکریپت سی شارپی (در یونیتی) را که به وسیله آن می توان برنامه های در حال اجرا و یا آخرین برنامه اجرا شده را در اندروید مشخص کرد بیان کنید
    هدفم این است که چک کنم در زمان درخواست خرید آیا مثلا کافه بازار اجرا شده و یا نه که اگر اجرا نشده بود تشخیص هک داده شود و مثلا سکه اضافه نگردد

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

  7. با اهدای سلام و ارادت خدمت حضرتعالی و همگاران بزرگوارتان از لطفی که به جامعه توسعه دهندگان در راستای امر امنیت و رونق صنعت بازی سازی داشته اید از شما سپاسگزارم نام جنابعالی و وب سایتتان را در قسمت CREDIT بازی خود قرار داده ام تا حداقل کاری را که نمی تواند کار بزرگ شما را جبران کند انجام داده باشم امیدوارم با فروش خوب بازی خود بتوانم از نظر مادی هم شما عزیزان را حمایت کنم.
    توفیق روز افزون و سربلندی را در تمامی مراحل زندگی برای شما آرزومندم.

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

  8. به نام خدا

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

    1. سلام
      ممنون از لطفتون.
      این احتمال وجود داره که قیمت رو توی پنل صفر گذاشته باشین؟
      در غیر اینصورت ممکنه محصول شما از نوع غیر مصرفی باشه، توی این حالت محصول همیشه در مالکیت شما میمونه و تا مصرف نشه شما نمیتونید مجدد اون رو بخرید. با هر بار درخواست خرید، بازار در صورتی که این محصول توی inventory شما باشه، یک گزارش خرید درست به شما برمیگردونه.
      اگر محصول شما باید این قابلیت رو داشته باشه که چند بار خریده بشه، توی پلاگین اون رو از جنس consumable تعریف کنید.
      موفق باشید

  9. ممنون که پاسخ دادید.
    ولی قیمت براش تعرف کردم ،خرید هم انجام میشه لوله قفلم باز میشه و میشه از محصول استفاده کرد.
    در جفت محصول ها ،هم مصرف شدنی و هم مصرف نشدنی این اتفاق میفته!
    تست کردم محصولم رو در کافه بازار غیر فعال کردم ،خرید صورت نگرفت.

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

  10. بله مهندس حق با شما بود ،با یه حساب جدید در بازار رفتم،درست شد،
    واقعا بابادو رو حرفه ای ساختید .آفرین بر شما

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

  11. واقعا واسه زحماتتون تشکر.

    یه سوال اگه من همین پروژه نمونه امنیت رو داخل پروژه خودم export کنم و مشخصات خودمو وارد کنم که مشکلی پیش نمیاد؟

    1. سلام
      ممنون از لطفتون
      اگر داخل این پروژه نمونه، اطلاعات بازی خودتون رو قرار بدید پروژه باید کاملا درست کار کنه و مشکلی نداشته باشه.
      لازمه اطلاعات کلاینت بازار، اسم پکیج بازی، public key و اسم محصولات خودتون رو وارد کنید.
      بازی شما حتما باید روی کافه بازار آپلود شده باشه و محصولات اونجا تعریف شده باشند.

  12. ببخشید یه سوال.؟
    در کل باید فقط یک بار کدهای public key و client id و client secret و refresh token
    رو از کافه بازار دریافت کنم و بعدش تو همه بازی هام از همین کد ها استفاده کنم؟
    نیاز نیس واسه هر بازی جداگانه تغیرش بدم؟

    1. سلام
      اطلاعات کلاینت شامل client id و client secrret و refresh code تنها یک بار نیاز هست ساخته بشه.
      میتونید ازشون توی بقیه بازی هاتون استفاده کنید.
      اما public key برای هر بازی متفاوت هست که توی پنل و قسمت پرداخت درون برنامه‌ای هر بازی تولید میشه.

  13. ممنون تقزیبا متوجه شدم.
    ببخشید فقظ یه سوال دیگه
    باید بعد از آپلود بازی public key رو دریافت کنم و داخل یونیتی قرار بدم و خروجی بکیرم.درسته؟
    خب اینجوری بازی ای که داخل کافه بازار آپلود کرده بودم و کد public key رو از اول نداره.
    حالا درخواست انتشار بدم و کسی دانلود کنه public key توی اون بازی اولی موجود نیستش
    اینجا رو متوجه نمیشم.

    1. برای اینکه public key رو دریافت کنید باید بازی تون رو توی بازار آپلود کنید. این بازی اصلا لازم نیست نسخه نهایی شما باشه و از اونجایی که هنوز public ley رو دریافت نکردید و توی بازی نذاشتید نباید درخواست انتشار بدید.
      نسخه اولی که آپلود میکنید تنها کافیه داخل فایل manifest توی پروژتون, پرمیشن پرداخت بازار رو داشته باشه.
      بعد از آپلود, public key رو داخل بازی خودتون قرار بدید و در نهایت نسخه نهایی و تکمیل شده بازی رو منتشر کنید و درخواست انتشار بزنید.
      چون بدون public key خرید انجام نمیشه.

  14. با سلام
    ممنون بابت آموزشتون . خیلی عالی بود
    من برای بررسی خرید کد شما رو به سرور خودمون که ویندوز هست منتقل کردم . همه مراحل رو انجام دادم . فقط یه مشکلی وجود داره . برای تست کد یه order id و product id ساختگی به سمت سرورفرستادم . Access_Token به درستی دریافت میشه ولی توی بررسی معتبر بودن خرید Error 404 دریافت میشه مبنی بر اینکه صفحه مورد نظر وجود نداره طبیعتا باید error محصول ناموجود است دریافت بشه . برای بررسی بیشتر من URL دوم که برای بررسی وضعیت خرید هست رو روی مرورگر Chrome تست کردم . پیام درست نمایش داده میشه ( یک Json که بیانگر عدم وجود محصوله ) ولی همین Url رو روی مرورگر Internet Explorer که تست میکنم همون Error ای که توی برنامه سرورمون بود نمایش داده میشه یعنی Error 404 . چطور ممکنه یک Url روی Chrome کار کنه ولی روی Internet Explorer نه .
    میشه لطفا راهنمایی بفرمایید کجای کار ایراد داره.

    1. سلام
      ممنون از لطفتون.
      این مشکل رو تا به حال برخورد نداشتم بهش و دقیقا نمیتونم راهکار بدم. سمت سرور من با php این کار رو انجام میدم و مشکلی پیش نمیاد.
      به نظرم شرایط رو با محصول درست بررسی کنید فقط, و محصول نادرست رو سمت کافه بازار نفرستید یا براتون مهم نباشه که نتیجه چی میشه. چون درخواست ها فقط از بازی شما میاد و از قبل تعیین شده ست. پس عملا اینکه محصول نادرست باشه اتفاق نمیافته.
      باز هم اگر مشکلتون خیلی جدیه میتونید از طریق پشتیبانی کافه بازار پیگیری کنید که چطور حلش کنید.

  15. خواهش میکنم یه وقتی بزارید ، آموزش ویدئویی شو هم بزارید
    اینهمه زحمت کشیدید ، این کارم انجام بدید خیلی ممنون میشیم
    من چند بار انجام دادم بازم ارور گرفتم

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

  16. کاش توی پلاگین یه متد هم برای گرفتن اطلاعات محصول (مثل قیمت) میذاشتید که ما قیمت رو توی بازی هاردکد نکنیم (توی سوملا بود)

    1. سلام
      انشاءالله در اولین فرصت امکانات پلاگین رو تکمیل تر میکنیم.

  17. سلام و عرض ادب
    دست مریزاد به این نظم و دقت کدنویسیتون واقعا نمیدونم چرا وظایف کافه بازارو باید بقیه انجام بدن
    یه آموزش پرداخت با سوملا گرفتم اصلا نفهمیدم یارو چی میگفت اونقدر رو مخ بود باورتون نمیشه ۳۰ ثانیه طول کشید برا اسم تکست مثال اسم gold رو انتخاب کنه و بنویسه!
    یکو نیم ساعت آموزشش بود!
    سرعت اجرای پکیجی که شما نوشتید واقعا عالیه و خیلی روان نوشتید و روان توضیح دادید
    دستتون واقعا درد نکنه.

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

  18. سلام ،
    دوستان من وقتی روی اینترنت WIFI تست میکنم خرید کامل انجام ، مصرف و سکه اضافه میشه. ولی با اینترنت همراه اول خرید انجام ولی ارور میده که مصرف نشده ! و سکه اضافه نمیشه ! متن ارور :
    Failed to consume product. but the purchase was successful. result: Error consuming sku coin_1000 (response: 6)
    بعد وقتی دوباره میام رو WIFI خرید انجام شده با اینترنت موبایل مصرف و سکه اضافه میشه. چندین بار در شرایط مختلف تست کردم و مشکل هنوز وجود داره.
    لطفا اگر امکان دارد شما هم تست و راهنمایی کنین.

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

    2. سلام مجدد،
      خیر، محصول مصرف نمیشه، و همون اروری که بالا گذاشتم میاد. وقتی دوباره روی buy coin (تو پروژه سمپل) میزنم بازم جواب بالا میاد و وقتی روی دکمه has consumed product میزنم میگه operation failed user should login to cafebazaar. :)))) با اینکه تو بازار لاگین هستم و خرید انجام دادم.
      تمام این مراحل با اینترنت wifi درست و کامل انجام میشه! ، حتی همین خرید که مصرف نشده وقتی سوییچ میکنم روی wifi و دکمه buy coin رو میزنم مصرف میشه.
      میشه شما هم رو پروژه های خودتون تست کنین ببینین این مشکل وجود داره یا خیر؟
      ممنون

    3. سلام مجدد
      من این مورد رو تست کردم.
      با برنامه تست پلاگین در هر دو حالت وایفای و دیتا، خرید به درستی انجام و مصرف شد.
      اما این مشکل مصرف نشدن محصول غیرمنتظره نیست. ممکنه به دلیل سرعت کم اینترنت این اتفاق بیافته و بازار نتونه محصول رو مصرف کنه. متاسفانه در این حالت کاری نمیشه کرد و بازار برای حل این مشکل راهکاری ارائه نداده.

    4. خواهش میکنم
      احتمالا طی چند روز آینده یک آپدیت برای پلاگین میدیم که این مشکل حل بشه.
      ممنون میشم توی تست این مشکل به ما کمک کنید.
      با شما از طریق ایمیل تماس میگیرم بعد از انتشار آپدیت.

  19. با سلام
    عملیات خرید رو از پلاگین شما استفاده کردم خرید انجام میشه و منم ویژگی خریداری شده رو اعمال میکنم
    اما الان مه قصد انتشار رو دارم بازار میگه خرید به کاربر تحویل داده نشده
    البته از نسخه ۱.۰ پلاگین شما استفاده کردم
    ممنون میشم راهنمایی کنید

  20. سلام وقتتون بخیر
    اول تشکر میکنم بابت پلاگینی که زحمت کشیدین و یه سوال داشتم ازتون الان موقع خرید خیلی از مواقع ارور ۷ بر میگرده، پول از حساب کم میشه ولی کاربر چیزی نمیگیره، بعضی مواقع ام کار میکنه همه چی به نظر شما مشکل از کجاس؟

    با تشکر

    1. سلام
      با درصد احتمال پایین در برخی گوشی‌های ضعیف یا زمانی که رم گوشی بسیار پر باشه، امکان داره نتیجه خرید از سمت کافه‌بازار به برنامه ارسال نشه.
      این مشکل رو سعی کردیم در نسخه جدید پلاگین رفع کنیم. لطفا از نسخه ۱.۰.۱ پلاگین استفاده کنید. تنها کافیه فایل jar رو جایگزین کنید.

  21. با سلام
    یک سوال راجه به خرید درون برنامه ای توی کافه بازار دارم. ما برای خرید درون برنامه ای توی بازیمون از باباردو استفاده کردیم.
    می خواستم بدونم که شما آیا متدی برای فقط consume کردن دارید ؟
    از اونجایی که امکان داره محصولی خریداری بشه ولی consume نشه، امکانش هست که اگر این اتفاق افتاد از سمت کلاینت متدی که بتونه consume کنه اول محصول رو صدل زد ؟

    با سپاس

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

    2. شما گفتید: کاربر خرید کرده و محصولش مصرف نشده
      کجا Consume میشه و همچنین اتفاقی میافته ؟؟؟

  22. سلام
    من میخوام دستوری بنویسم که اطلاعات یک مورد رو نمایش بده و این کد رو توی کلاس TableRow لازم دارم، چطوری باید بنویسم؟؟

    1. سلام
      به نظر میرسه سوالتون رو جای درستی مطرح نکردید. لطفا به صفحه موضوعی که مدنظرتون هست مراجعه کنید و سوال رو اونجا بپرسید.
      یا در صورتی که فکر میکنید سوالتون با موضوع مرتبط هست، لطفا توضیح بیشتری بدید.

  23. سلام
    ممنون از پلاگینی که در اختیار توسعه دهنده ها قرار دادید و اوپن سورس کردید…به امید اینکه این روحیه در توسعه دهندگان ایرانی بیشتر بشه. (البته اگر پروژه فایل jar رو هم اوپن سورس میگردی شاید دوستان دیگه میتونستند در توسعه این پلاگین کمک کنند)
    فقط برای من سئواله که این فرایند چطور باعت میشه که امکان هک شدن وجود نداشته باشه؟ (چون با این حال برای هک باز هم امکان ایجاد سرویس دهنده fake کافه بازار وجود خواهد داشت.)
    در پلاگینی که شما زحمت کشیدی و امکان پرداخت درون برنامه ای رو فراهم کردی با توجه به اینکه از public key برای رمزگشایی اطلاعات ارسال شده از سوی کافه بازار در هنگام خرید استفاده میشه و تنها زمانی این رمزگشایی انجام میشه که اطلاعات با استفاده از private key توسط بازار رمز شده باشه.در صورتی که این روال پیاده شده باشه امکان هک خیلی پایین میاد.
    آیا این روالی که توضیح دادم وجود داره؟

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

  24. سلام
    من اون پنجره تلاش مجدد برای تابع retryValidatePurchase هم اضافه کردم یه دکمه گذاشتم که کد زیرو صدا میزنه :

    GetComponent().check(currentPurchase, onPurchaseValidated);

    و یه دکمه هم برای بستن پنجره !
    چرا در این تایع از همون کد قبلی استفاده نمیشه :
    GetComponent().check(purchase, onPurchaseValidated);
    یعنی فرق currentPurchase با purchase چیه ؟
    و راهی برای تست این صفحه وجود داره ؟ من با اینترنت ضعیف هم تست کردم با کمی تاخیر کار کرد !

    ممنون بابت همه زحماتتون

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

  25. یه نکته دیگه
    موقع ای که خرید شروع میشه یه لحظه تصویر توسط بازار تیره میشه تا عملیات انجام بشه
    اگه تو این لحظه صفحه لمس بشه خطای ۷ رخ میده و سکه به بازیکن داده نمیشه ولی پول ازش کم میشه
    ولی اگه تو این زمان دوباره همون دکمه پرداخت زده بشه انگار ادامه پرداخت قبلی انجام میشه یعنی سکه اضافه میشه ولی دیگه پول نمیگیره !

    فکر کنم ایراد از بازاره ولی به هر حال ممنون

  26. سلام به تیم عزیز باباردو
    بنده از پرداخت شما استفاده میکنم
    در مواردی پیش اومده که بازیکن سکه یا محصول رو دریافت نکرده و پول ازش کم شده
    مشکل از پلاگین هست یا بازار ؟ چندین موارد شکایت از بازی در این ضمینه داشتم
    لطفا رسیدگی کنید
    تمامی مراحل کار طبق آموزش های شما انجام شده
    باشکر

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

  27. درود بر شما
    با سپاس از نوشته های پرارزش شما در این وبسایت.
    من تازه کار هستم و عذرخواهی میکنم اگر پرسش های پیش پا افتاده میکنم.
    ————–
    ۱. این امکان هست که در یونیتی مقادیر رشته ای رو توسط سی++ با فرمت so ذخیره کنیم تا اگر مهندسی معکوس شد به راحتی به رشته هایی مانند کد RSA نشه دسترسی داشت؟ (در اندروید استودیو از NDK استفاده میکنم واسه این کار).
    ————–
    ۲. شما فرمودید: ( ” برای بررسی خرید از بازار دو راه وجود داره: اول اینکه یک وب سرویس روی سرورتون داشته باشید که نقش واسط رو بازی کنه ” ).
    این پرسش پیش اومد واسم که آیا اطلاعات رد و بدل شده میان اپلیکیشن خودمون و سرور رو نباید رمز نگاری کنیم تا وسط راه دزدیده نشن ؟
    به طور کلی آیا واقعا احتیاج به کدگذاری داده ها هست؟
    ( آیا استفاده از پروتکل https رو پیشنهاد میدید؟)
    ————–
    سپاس از شما
    بدرود

  28. پرسش سوم رو یادم شد ، عذر میخوام.
    ————–
    شما فرمودید : ( ” لازم به ذکر هست که هدف اصلی API توسعه دهندگان اعتبارسنجی خریدها نیست. ممکنه به دلیل قطعی موقت این سیستم خریدها تایید نشن و کاربران محصول رو دریافت نکنن. در این حالت شما باید حتما به کاربران امکان تلاش مجدد برای اعتبارسنجی خرید رو بدید. ” )
    ————–
    ۳. ( ” تلاش مجدد برای اعتبارسنجی خرید ” ) این کار رو چطوری انجام بدم؟

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

      موفق باشید

  29. درود دوباره
    با سپاس از توضیحات شما.
    ————–
    فرض بفرمایید من درون بازی خودمون برای ارتباط با سرور، یه همچین آدرسی دارم :
    http://domain.ir/set_data.php
    یا مثلا
    http://domain.ir/get_data.php
    که یه سری رشته با فرمت JSON رو رد و بدل میکنه.
    ————–
    فرض کنید یه کسی اومده و بازی من رو مهندسی معکوس کرده و به آدرس های بالا دسترسی داره.
    نکته ای که هست اینه که اگه هر کس این آدرس های بالا رو استفاده کنه به راحتی میتونه رشته های JSON من رو داخل مرورگر بزنه و ببینه.
    یعنی اپلیکیشن من تنها جایی نیست که با سرور ارتباط برقرار میکنه بلکه اگر کسی آدرس ها رو داشته باشه، به راحتی میتونه اطلاعات سرور من رو ببینه و دستکاری کنه.
    ————–
    واسه اینکه از این کار جلوگیری بشه چکار باید کرد که تنها سرور با اپلیکشن من ارتباط برقرار کنه نه با هیچ جای دیگه؟
    سپاس از اینکه به پرسش های پیش پا افتاده من پاسخ میدید.

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

  30. پرسش آخر
    اگر امنیت سرور رعایت نشده باشه، آیا فایل های PHP درون سرور قابل دانلود کردن هستن؟
    مثلا دانلود کردن فایل set_data.php

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

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

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

      موفق باشید

  32. با سلام با تشکر از وب سایت خوبتون و پلاگین فوق العاده ای که قرار دادین، من ارتباط رو به خوبی با پلاگین شما برقرار کردم و تمامی خرید هارو انجام میدم فقط این refresh token که زود زود اکسپایر میشه ، پلاگین شما به صورت خودکار رفرش توکن جدید رو دریافت میکنه یا ما باید مقدار دهی کنیم؟
    هدفم از این سوال اینه که یهو برنامه ما بعد چند هفته یا ماه به خاطر نداشتن رفرش توکن قطع نشه
    با سپاس فراوان

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

      موفق باشید

  33. اقا ممنون اما من دیگه دارم ناامید میشم
    سکه اضافه نمیکنه
    مراحل رو هم چندبار کامل رفتم الانم خود پروژه ی شمارو ایمپورت کردم نمیدونم چرا کار نمیکنه
    یونیتیمم ۵.۱ هست

    1. با سلام مجدد بعد از تست نمونه برروی نسخه یونتی ۲۰۱۷.۱ . ایتم خریداری شده اما قست چک کردن توکن انجام نمی شود . در صورت امکان برسی نمایید .

  34. با سلام و خسته نباشید به آقای ریحانه ی عزیز
    در خصوص این پلاگین درون پرداخت شما باید بگم که کارتون عالیه و به راحتی میشه ازش استفاده کرد
    و در چند بازی هم ازش استفاده کردم
    اما این امنیت پرداخت کافه بازار رو من وقتی کداش و کلاس checkIABValidate رو به کدام اضافه میکنم ، وقتی روی دکمه ی خرید میزنم حتی کافه بازار رو هم باز نمیکنه که اطلاعات بسته رو بیاره !! ممنون میشم هرچه زودتر راهنماییم کنید
    با تشکر

  35. با سلام خسته نباشید
    من در پرداخت درون برنامه ای مشکلی دارم که خرید رو انجام میدم میگه که خرید انجام شده ولی در CheckIABValidate وقتی وارد تابع waitForRefreshCode میشه ارور invalid Client Error 401 unauthorized میده مشکل از کجاست تمامه متغیر های refreshtoken client id هم درست وارد شدن میشه لطفا راهنمایی کنید چه چیزی اشتباه است که این ارور رو میده

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

  37. سلام من پروژه نمونه رو دانلود کردم ولی توی یونیتی ۵.۵ error میده
    Exception: JNI: Init’d AndroidJavaClass with null ptr!
    که مربوط به کلاس store handler است

  38. سلام من روی گوشی وقتی تست می کنم error
    Error checking Item unable to find explicit activity class
    {com.bobardo.bazaar.iab.ServiceBillingBazaar$IabActivity اسم پکیج}
    have you declared this activity
    می گیرم ولی فایل منیفست مال خود پروژی نمونه است و مشکلی نداره!

    همین طور بعد این error و میگیرم
    error setup bazar billing not allow to bind to service internet
    {….act=ir.cafebazar.pardakt.inAppBillingservice}

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

پاسخ دهید

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