Page tree
Skip to end of metadata
Go to start of metadata

ویدئو آموزشی

ویدئو آموزش مقدماتی خرید درون‌برنامه‌ای را می‌توانید اینجا ببینید.

برنامهٔ نمونهٔ TrivialDrive

برنامه نمونه TrivialDrive را از اینجا دانلود کنید و یا در Github مشاهده نمایید.


فصل ۱: فروش محصولات درون‌برنامه‌ای اختصاصی مایکت

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

فصل ۲: آماده‌سازی برنامه برای خرید درون‌برنامه‌ای

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

دانلود برنامه نمونه

در این بخش شما با نحوهٔ پیاده‌سازی خرید درون‌برنامه‌ای در یک برنامه نمونه به نام TrivialDrive آشنا می‌شوید. این مثال شامل کلاس‌هایی برای راه‌اندازی سریع خرید درون‌برنامه‌ای، نوع‌های داده‌ای لازم، و اداره کردن انجام خرید درون‌برنامه‌ای از thread اصلی برنامه است. برنامه نمونه TrivialDrive را از اینجا دانلود کنید و یا در Github مشاهده نمایید. توجه کنید که این برنامه توسط گوگل‌پلی آماده شده است و ما تنها چند تعییر جزئی در آن به وجود آورده‌ایم تا به مایکت متصل شود.

برنامه را در پنل توسعه‌دهندگان بارگذاری نمایید

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

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

برای استفاده از ویژگی‌های خرید درون‌برنامه‌ای نسخه 3، شما باید فایل IInAppBillingService.aidl را به پروژه اندروید خود اضافه کنید. این فایل واسط لازم برای برقراری ارتباط با سرویس مایکت را تعریف می‌کند.
شما می‌توانید فایل IInAppBillingService.aidl را در برنامه نمونه که پیش‌تر بیان شد (TrivialDrive) بیابید. بسته به این که شما یک برنامه جدید می‌سازید یا می‌خواهید در برنامه‌های قبلی خود تغییر ایجاد کنید، از دستورالعمل زیر برای اضافه کردن سرویس خرید درون‌برنامه‌ای استفاده کنید.

پروژه‌ی جدید

برای اضافه کردن سرویس خرید درون‌برنامه‌ای به پروژه جدید خود:

  • فایل‌های برنامه نمونه TrivialDrive را در برنامه جدید خود کپی کنید.
  • نام package فایل‌هایی که کپی کردید را تغییر دهید تا از نام package برنامه شما استفاده شود.
  • فایل AndroidManifest.xml را باز کنید و نام بسته (Package) را به نام بسته پروژه خود تغییر دهید.
  • در صورت نیاز کدهای import را در فایل‌های java تصحیح کنید تا پروژه‌تان درست کامپایل شود.
  • کدهای مثال را تغییر دهید تا برنامه خود را بسازید. به یاد داشته باشید کلید عمومی برنامه خود را از پنل توسعه‌دهندگان در MainActivity.java کپی کنید.

پروژه‌های موجود

برای اضافه کردن سرویس خرید درون‌برنامه‌ای در برنامهٔ موجود:

  •  فایل IInAppBillingService.aidl را در پروژه اندروید خود کپی کنید.
  • اگر از Eclipse استفاده می‌کنید: فایلIInAppBillingService.aidl را در پوشه /src پروژه import کنید.
  • اگر در محیطی به غیر از Eclipse در حال توسعه هستید: پوشه‌ای با این آدرس بسازید /src/com/android/vending/billing و فایل IInAppBillingService.aidl را در آن کپی کنید.
  • برنامه خود را build کنید. اگر همه چیز درست باشد یک فایل ساخته شده با نام IInAppBillingService.java در پوشه /gen می‌بینید.
  • کلاس‌های کمکی را از پوشه /util پروژه مثال TrivialDrive بردارید و به پروژه خود اضافه کنید. به یاد داشته باشید که نام package را در این فایل‌ها متناسب با پروژه خود تغییر دهید، تا پروژه درست کامپایل شود.
  • هم اکنون پروژه شما شامل کتابخانه خرید درون‌برنامه‌ای مایکت است.

تنظیم دسترسی

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

 

 

برقراری یک ارتباط با مایکت

شما باید به سرویس خرید درون‌برنامه‌ای مایکت متصل شوید تا بتوانید درخواست‌های خرید را از برنامه خود به مایکت بفرستید. در برنامه نمونه کلاس‌هایی فراهم شده که ایجاد این اتصال را انجام می‌دهند، پس لازم نیست که شما مستقیما این ارتباط را مدیریت کنید.
برای راه‌اندازی ارتباط با مایکت، در متد onCreate یک نمونه از کلاس IabHelper بسازید. در constructor کلاس، مقدار Context مربوط به activity خود، به همراه یک رشته که حاوی کلید عمومی است که قبلاً در پنل توسعه‌دهندگان مایکت ساخته شده، را بدهید.

 

 

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

 

در قدم بعد، با صدا زدن متد startSetup از نمونه IabHelperی که ساختید عملیات اتصال را اجرا کنید. این متد را به صورت ناهمزمان (Asynchronous) اجرا می‌شود، یعنی در انتظار تمام شدن عملیات نمی‌ماند و بلافاصله خارج می‌شود. به این متد یک نمونه از OnIabSetupFinishedListener را به عنوان شنونده بدهید، تا به محض اینکه IabHelper عملیات راه‌اندازی را به پایان رساند آن را صدا بزند. در بخشی از عملیات راه‌اندازی، IabHelper همچنین بررسی می‌کند که آیا خرید درون‌برنامه‌ای نسخه 3 توسط مایکت پشتیبانی می‌شود یا خیر. اگر خرید درون‌برنامه‌ای پشتیبانی نشود یا هر خطایی رخ دهد، به شنونده OnIabSetupFinishedListener اطلاع داده می‌شود و یک نمونه از IabResult حاوی پیغام خطا داده می‌شود.

 

اگر نصب با موفقیت انجام شده باشد، شما می‌توانید از mHelper برای برقراری ارتباط با سرویس مایکت استفاده کنید. هنگامی که برنامه شما باز شد، کار خوبی‌ست که به مایکت کوئری بزنید تا بفهمید چه محصولاتی را یک کاربر خریده است. در فصل ۴ درباره این مطلب بحث شده است.

 

مهم: به یاد داشته باشید زمانی که کارتان با activityتان تمام شد اتصال با سرویس مایکت را قطع کنید. اگر از سرویس جدا نشوید، این اتصال باز باقی می‌ماند و ممکن است باعث کاهش کارایی دستگاه شود. برای جداشدن از سرویس و آزاد سازی منابع سیستم‌تان، متد dispose از IabHelper را هنگام از بین رفتن activityتان فراخوانی کنید.


 

فصل ۳: ساخت محصولات برای فروش

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

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

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

دریافت جزئیات محصولات موجود

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

 

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

 

برای دریافت جزئیات محصول از نمونه IabHelper که دارید متد queryInventoryAsync (Boolean, List, QueryInventoryFinishedListener) را فراخوانی کنید.
  • اولین آرگومان ورودی نشان می‌دهد که آیا جزئیات محصول باید دریافت شود یا خیر (باید مقدارش true باشد)
  • آرگومان List شامل یک یا چند شناسه محصول (SKU نیز نام دارد) است که می‌خواهید کوئری بزنید (جزئیات آنها را می‌خواهید).
  • در نهایت آرگومان QueryInventoryFinishedListener یک شنونده را مشخص می‌کند که بعد از به پایان رسیدن کار فراخوانی می‌شود و پاسخ کوئری را بررسی می‌کند.
اگر شما از کلاس‌های فراهم شده در برنامه مثال استفاده کنید، کلاس‌ها مدیریت thread پس‌زمینه برای درخواست‌های خرید درون‌برنامه‌ای را انجام می‌دهند، بنابراین شما می‌توانید به راحتی از thread اصلی برنامه خود کوئری بزنید.
نمونه کد زیر نشان می‌دهد که چگونه می‌توانید جزئیات مربوط به دو محصول با شناسه‌های SKU_APPLE و SKU_BANANA را دریافت کنید. البته با این فرض که این شناسه‌ها را در پنل توسعه‌دهندگان مایکت تعریف کرده‌اید.
 

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

فصل ۴: خرید محصولات

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

خرید محصول

برای شروع عملیات خرید از برنامه خود، متدlaunchPurchaseFlow(Activity, String, int, OnIabPurchaseFinishedListener, String) را از نمونه IabHelper فراخوانی کنید. شما باید این فراخوانی را از thread اصلی Activity خود انجام دهید. توضیحی درباره متد launchPurchaseFlow در ادامه آمده:

  • اولین آرگومان Activity‌ای است که متد را صدا زده.
  • آرگومان دوم شناسه محصول (SKU نیز می‌نامیم) است. مطمئن شوید که شناسه محصول را می‌دهید نه نام محصول را. شما باید قبلاً این محصول را در پنل توسعه‌دهندگان مایکت تعریف کرده باشید، در غیر این صورت قابل شناسایی نخواهد بود.
  • آرگومان سوم مقدار یک «کد درخواست» است. این مقدار می‌تواند هر عدد صحیح مثبتی باشد. مایکت این کد درخواست را به همراه نتیجه خرید، به متد onActivityResult در Activity صدا زننده برمی‌گرداند.
  • آرگومان چهارم یک شنونده است که زمانی که عملیات خرید کامل شد آگاه می‌شود و پاسخ فرستاده شده از مایکت را بررسی می‌نماید.
  • پنجمین آرگومان رشته‌ای به نام «developer payload» است که شما می‌توانید با استفاده از آن اطلاعات تکمیلی درباره سفارش خود بفرستید (می‌تواند یک رشته خالی باشد). به طور معمول از این رشته به عنوان یک نشانه استفاده می‌شود که منحصرا این درخواست خرید را شناسایی می‌کند. اگر شما این رشته را مقداری دهی کنید، مایکت به همراه پاسخ خرید این رشته را نیز برمی‌گرداند. متعاقبا، هر زمان که کوئری در مورد این محصول بزنید، مایکت این رشته را به همراه سایر جزئیات محصول برمی‌گرداند.
توصیه امنیتی: بهتر است از یک رشته استفاده کنید که به برنامه شما کمک کند تا کاربری که خرید را انجام داده تعیین هویت کند، بدین صورت شما بعدا می‌توانید مطمئن شوید که این یک خرید معتبر توسط آن کابر باشد (در اینجا منظور از «کاربر» کاربر برنامه شماست نه کاربر مایکت، البته در صورتی که برنامه شما امکان ساختن حساب کاربری داشته باشد. برنامه شما به مشخصات کاربر مایکت دسترسی ندارد). برای محصولات قابل استفاده، شما می‌توانید یک رشته تصادفی تولید استفاده کنید، اما برای محصولات غیر قابل مصرف شما باید از یک رشته استفاده کنید که بتوانید کاربر را منحصرا شناسایی کنید.

 

مثال زیر نشان می‌دهد که شما چگونه می‌توانید یک درخواست خرید برای یک محصول با شناسه SKU_GAS بسازید، با استفاده از مقدار دلخواه 10001 برای کد درخواست، و یک رشته developer payload کد شده.

 

اگر سفارش خرید موفقیت آمیز باشد، پاسخی که از مایکت آمده در یک شی Purchase ذخیره می‌شود و به شنونده (Listener) داده می‌شود.

 

مثال زیر نشان می‌دهد که شما چگونه می‌توانید پاسخ دریافتی از مایکت را در شنونده (Listener) بررسی کنید، با توجه به اینکه آیا سفارش خرید با موفقیت به پایان رسیده است، و اینکه آیا کاربر «بنزین» یا «ارتقا ویژه» (Premium Upgrade) حساب کاربری خریده است. در این مثال، بنزین یک محصول درون‌برنامه‌ای است که می‌تواند چندین بار خریداری شود، بنابراین شما باید محصول خریده شده را مصرف کنید تا کاربر بتواند دوباره آن را بخرد. برای یادگیری نحوه مصرف محصول خریده شده بخش «مصرف یک محصول خریده شده» را در زیر ببینید. محصول «ارتقا ویژه» تنها یکبار قابل خرید است بنابراین شما نباید آن را مصرف کنید. کار خوبی‌ست که بلافاصله UI (رابط کاربری) را به روزرسانی کنید تا کاربران بتوانند محصولات خریداری شده خود را ببینند.

 
توصیه امنیتی: وقتی که شما پاسخ خرید را از مایکت دریافت می‌کنید، حتما امضای (Signature) داده‌های دریافتی، orderId و رشته developerPayload در شی Purchase را بررسی کنید، تا مطمئن شوید که همان مقادیر مورد انتظار شما هستند. باید کنترل کنید که orderId دارای یک مقدار منحصر به فرد که قبلا ندیده‌اید، و رشته developerPayload مطابق با همان چیزی‌ست که قبلاً با درخواست خرید فرستاده‌اید. حتی برای امنیت بیشتر می‌توانید این بررسی‌ها را به جای دستگاه کاربر روی سرور خودتان انجام دهید.

 

کوئری محصولات خریداری شده

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

 

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

 

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

مصرف یک محصول خریده شده

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

 

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

 

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

 

برای مصرف یک خرید، از نمونه IabHelper که دارید متد consumeAsync(Purchase, OnConsumeFinishedListener) را فراخوانی کنید. اولین آرگومان همان محصولی‌ست که قرار است مصرف شود. دومین آرگومان یک OnConsumeFinishedListener است که بعد از به پایان رسیدن عملیات مصرف محصول صدا زده می‌شود و پاسخ دریافتی از مایکت را بررسی می‌کند. صدا زدن این متد از thread اصلی مشکلی ندارد.
در این مثال، یک فقره از محصول «بنزین» که کاربر در برنامه شما خریده است، مصرف می‌شود.

 

 

 

مثال زیر چگونگی پیاده‌سازی OnConsumeFinishedListener را نشان می‌دهد.

چک کردن محصولات قابل مصرف در آغاز برنامه

این امر مهم است که محصولات قابل مصرف را زمانی که کاربر برنامه را باز می‌کند بررسی کنید. به طور معمول، شما اول برای محصولاتی که کاربر خریده به سرویس خرید درون‌برنامه‌ای کوئری می‌زنید (با استفاده از queryInventoryAsync)، سپس اشیا مصرف شدنی Purchase را از Inventory می‌گیرید. اگر برنامه شما فهمید که محصول مصرف کردنی‌ای وجود دارد که کاربر آن را خریده، باید بلافاصله یک درخواست مصرف به مایکت بفرستد و در صورت موفقیت آمیز بودن محصول را به کاربر ارائه دهد. می‌توانید به عنوان مثالی از پیاده‌سازی این چک کردن به برنامه نمونه TrivialDrive نگاهی بیندازید.

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


فصل ۵: نمای کلی خرید درون‌برنامه‌ای

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

API خرید درون‌برنامه‌ای

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

 

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

 

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

ویژگی‌های خرید درون‌برنامه‌ای

  • درخواست‌ها از طریق یک API ساده فرستاده می‌شوند که به شما این امکان را می‌دهد مشخصات محصول را بخواهید، محصولی را سفارش دهید، و به راحتی لیست محصولاتی که کاربر صاحب آنهاست را بگیرید.
  • تمام خریدها توسط مایکت مدیریت می‌شوند. یعنی مایکت مالکیت کاربر بر محصولات را ثبت می‌کند. کاربر نمی‌تواند صاحب چندین نمونه از یک محصول باشد، در هر نقطه‌ای در زمان تنها یک نمونه را می‌توان در اختیار داشت.
  • محصولات مصرف شدنی که خریده شده‌اند را می‌توان مصرف کرد. زمانی که محصولی مصرف شد به وضعیت «بی صاحب» برمی‌گردد و دوباره می‌توان آن را از مایکت خرید.

محصولات درون‌برنامه‌ای

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

پنل مایکت برای توسعه‌دهندگان

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

نحوه خرید در مایکت

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

 

مهم: کاربر باید در برنامه مایکت یک حساب کاربری داشته باشد تا بتواند از خرید درون‌برنامه‌ای استفاده کند.

 

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

تغییراتی که در TrivialDrive اعمال کرده‌ایم

برای کمک به شما در راه‌اندازی خرید درون‌برنامه‌ای، ما یک برنامه مثال برای شما آماده کرده‌ایم که نحوه استفاده از خرید درون‌برنامه‌ای درون یک بازی را نشان خواهد داد. این برنامه که TrivialDrive نام دارد همان برنامه‌ای است که Google Play برای خرید درون‌برنامه‌ای خود به عنوان مثال استفاده می‌کند، ما تنها دو تغییر کوچک در کد برنامه دادیم تا به جای کار کردن با سرویس Google Play از سرویس خرید درون‌برنامه‌ای مایکت استفاده کند. به این ترتیب شما نیز می‌توانید کدهای آماده‌ای که برای کار با سرویس خرید درون‌برنامه‌ای Google Play نوشته شده‌اند را به سرعت تغییر دهید تا برای کار با مایکت سازگار شوند. در واقع دلیل اصلی که API سرویس خرید درون‌برنامه‌ای مایکت مانند Google Play پیاده‌سازی شده همین است. تغییرات اعمال شده روی برنامه اصلی به این صورت هستند:

 

تغییر اول: در فایل AndroidManifest.xml این خط را حذف کنید:

 

 

و به جای آن این خط را قرار دهید:

 

 

تغییر دوم: در کلاس IabHelper این دو خط را حذف کنید:

 

و آنها را با کد دو خط زیر جایگزین کنید:

 

در پروژه‌ای که ما در اختیار شما قرار می‌دهیم این تغییرات اعمال شده است.
بازی TrivialDrive نشان می‌دهد که چگونه از API خرید درون‌برنامه‌ای استفاده کنید و محصولات را برای یک بازی رانندگی بخرید و مصرف کنید. همچنین شامل کلاس‌هایی‌ست که عملیات‌های خرید درون‌برنامه‌ای را آسان‌تر می‌کنند مثلا تایید امضای داده‌ها به صورت خودکار.

 

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

 



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

فصل ۶: نمای کلی API

API خرید درون‌برنامه‌ای طوری طراحی شده تا به راحتی آن را به برنامه خود اضافه کنید.

محصولات

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

محصولات مصرف شدنی و نشدنی:

  1. محصولات مصرف شدنی: شما معمولا محصولاتی که چندین بار خریدن آنها معنی دارد را مصرف شدنی تعریف می‌کنید. این محصولات معمولا مزایای موقتی دارند، مانند سکه و پول در بازی، یا سوخت. تا زمانی که کاربر خرید را مصرف نکند مایکت اجازه خرید دوباره این محصول را به او نمی‌دهد و پس از مصرف است که می‌تواند دوباره اقدام به خرید این محصول نماید. برای اطلاع از نحوه مصرف محصول به بخش «مصرف کردن محصولات» در زیر مراجعه نمایید.
  2. محصولات مصرف نشدنی: این نوع محصولات قابل مصرف نیستند یعنی کابر فقط یک بار آنها را می‌خرد و برنامه شما برای همیشه مزایای آن را برای کاربر فراهم می‌کند. مانند حساب کاربری ویژه یا فعال کردن امکانی خاص در یک برنامه که به صورت پیش فرض غیر فعال است. برنامه شما بعد از اینکه کاربر این نوع محصول را خرید باید سرویس مربوط به آن را به کاربر بدهد، و نیازی به مصرف کردن محصول نیست.

خرید محصولات

تصویر 2. مراحل اساسی برای یک درخواست خرید

 

روند یک خرید معمولاً به این صورت خواهد بود:
  1. برنامه شما یک درخواست isBillingSupported به مایکت میفرستد تا مشخص شود که مایکت از خرید درون‌برنامه‌ای که در برنامه شما وجود دارد پشتیبانی می‌کند یا خیر.
  2. زمانی که برنامه شما شروع به کار می‌کند و یا کاربر login می‌کند، زمان مناسبی‌ست تا لیست محصولاتی که کاربر خریده است را به دست آوریم. برای اینکار یک درخواست getPurchases بفرستید. اگر درخواست موفقیت آمیز باشد، مایکت یک Bundle برمی‌گرداند شامل یک لیست از شناسه محصولاتی که خریده شده، یک لیست از جزئیات هر خرید، و یک لیست از امضای دیجیتال هر محصول.
  3. غالبا شما نیاز دارید که محصولات دیجیتالی خود را به کاربران خود معرفی کنید. برای اینکه مشخصات محصولاتی که در مایکت تعریف کرده‌اید را به دست آورید، یک درخواست getSkuDetails ارسال کنید. کوئری که می‌زنید یک لیست حاوی شناسه محصولات از شما می‌خواهد. اگر درخواست موفقیت‌آمیز باشد، مایکت یک Bundle حاوی جزئیات محصولات شامل قیمت، عنوان، توضیحات را به برنامه شما برمی‌گرداند.
  4. اگر محصولی باشد که کاربر نخریده باشد، شما می‌توانید آن را به وی بفروشید. برای شروع روند خرید برنامه شما یک درخواست getBuyIntent ارسال می‌کند که در پارامترهای آن شناسه محصول مورد نظر مشخص شده.
  5. برنامه مایکت یک Bundle حاوی یک PendingIntent برمی‌گرداند که برنامه شما از آن برای باز کردن رابط گرافیکی مربوط به خرید استفاده می‌کند.
  6. برنامه شما PendingIntent را با فراخوانی متد startIntentSenderForResult راه‌اندازی می‌کند.
  7. هنگامی که مراحل پرداخت به اتمام رسید (یعنی کاربر محصول را با موفقیت خرید یا روند خرید را لغو کرد)، مایکت در پاسخ یک Intent به متد onActivityResult می‌فرستد. مقدار resultCode در ورودی onActivityResult نشان می‌دهد که خرید موفقیت آمیز بوده یا لغو شده است. Intentی که در پاسخ می‌آید حاوی اطلاعات محصول خریده شده است، شامل یک رشته purchaseToken که توسط مایکت برای این تراکنش خرید به صورت منحصر به فرد تولید شده، و امضای دیجیتالی خرید، که با کلید خصوصی شما امضا شده.

برای یادگیری بیشتر API و پاسخ‌های برگشتی از سرور به فصل ۸ مراجعه کنید.

مصرف کردن محصولات

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

 

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

 

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

 

در برنامه نمونه هر دو نوع این محصولات وجود دارند و می‌توانید نحوه پیاده‌سازی استفاده از محصولات را آنجا ببینید.

مدیریت خرید محصولات مصرف شدنی

مراحل اصلی خرید یک محصول مصرف شدنی در زیر آمده است:

  1. روند خرید را با فراخوانی getBuyIntent آغاز کنید.
  2. یک Bundle پاسخ از مایکت بگیرید که نشان می‌دهد آیا عملیات خرید با موفقیت انجام شده یا خیر.
  3. در صورتی موفقیت‌آمیز بودن خرید، با صدا زدن consumePurchase آن را مصرف کنید.
  4. یک کد پاسخ از مایکت بگیرید که نشان می‌دهد مصرف محصول با موفقیت ثبت شد یا خیر.
  5. اگر مصرف موفقیت‌آمیز بود، اثر مربوط به آن را در برنامه ارائه دهید.

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

  1. ارسال یک درخواست getPurchases برای کوئری زدن محصولاتی که کاربر مالک آنهاست (یعنی خریداری شده‌اند اما مصرف نشده‌اند).
  2. اگر هر محصول مصرف شدنی وجود دارد، آنها را با صدا زدن consumePurchase مصرف کنید. این مرحله لازم است چرا که ممکن است عملیات خرید را کامل انجام داده باشد، اما قبل از اینکه فرصت فرستادن درخواست مصرف داشته باشد ارتباطش قطع شده یا به هر دلیلی متوقف شده.
  3. یک پاسخ از مایکت دریافت کنید که نشان می‌دهد مصرف محصول ثبت شده سات یا خیر.
  4. اگر مصرف موفقیت‌آمیز بود، اثر محصول را در برنامه خود اعمال کنید.

فصل ۷: پیاده‌سازی خرید درون‌برنامه‌ای

خرید درون‌برنامه‌ای مایکت API ساده‌ای برای شما فراهم کرده تا به راحتی بتوانید امور خرید را مدیریت کنید. در ادامه نحوه ارسال درخواست از برنامه شما به سرویس خرید درون‌برنامه‌ای نشان داده شده.
 
توجه: برای دیدن یک پیاده‌سازی کامل و نحوه اجرای درست، فصل ۲ را ببینید. در آن بخش یک مثال کامل برای نحوه پیاده‌سازی خرید درون‌برنامه‌ای شرح داده شده، که حاوی کلاس‌های کمکی برای انجام وظایف کلیدی است، مانند راه‌اندازی اولیه، ارسال درخواست‌ها، بررسی پاسخ‌های مایکت، و مدیریت threadهای پس‌زمینه تا بتوانید خرید درون‌برنامه‌ای را از activity اصلی خود صدا بزنید.
 

قبل از شروع، توصیه می‌شود که فصل ۵ را برای آشنایی با مفاهیم اصلی بخوانید تا پیاده‌سازی برای شما راحت‌تر شود.
برای پیاده‌سازی خرید درون‌برنامه‌ای در برنامه‌تان شما باید موارد زیر را انجام دهید:
  1. کتابخانه خرید درون‌برنامه‌ای را به برنامه خود اضافه کنید.
  2. فایل AndroidManifest.xml را بروزرسانی کنید.
  3. یک ServiceConnection بسازید و آن را به IInAppBillingService متصل کنید.
  4. درخواست‌های خرید درون برنامه را از برنامه خود به IInAppBillingService بفرستید.
  5. پاسخ‌های دریافتی از مایکت را بررسی کنید.

اضافه کردن فایل AIDL به برنامه

IInAppBillingService.aidl یک فایل AIDL است که رابطی برای سرویس خرید درون‌برنامه‌ای مایکت تعریف می‌کند. شما از این رابط برای برقراری ارتباط با مایکت استفاده می‌کنید.

دریافت فایل AIDL:

  1. برنامه نمونه TrivialDrive را از اینجا دانلود کنید و یا در Github مشاهده نمایید.
    فایل را در آدرس /src/com/android/vending/billing/IInAppBillingService.aidl پیدا می‌کنید.


اضافه کردن فایل AIDL به پروژه:

  1. فایل IInAppBillingService.aidl را در پروژه خود کپی کنید.
  • اگر از محیط Eclipse استفاده می‌کنید:
      1. اگر قبلا پروژه خود را ساخته‌اید آن را در Eclipse باز کنید، در غیر این صورت یک Android Application Project جدید بسازید.
      2. در پوشه /src روی File > New > Package کلیک کنید تا یک package جدید ایجاد کنید و نام آن را com.android.vending.billing قرار دهید.
      3. فایل IInAppBillingService.aidl را که در مرحله قبل گرفته‌اید در بسته src/com.android.vending.billing/ کپی کنید.
  • اگر از محیطی غیر از Eclipse استفاده می‌کنید: پوشه /src/com/android/vending/billing را در پروژه خود بسازید و فایل IInAppBillingService.aidl را که گرفته‌اید در این پوشه کپی نمایید. فایل AIDL در پروژه خود قرار دهید و به وسیله ابزار Ant پروژه خود را build تا فایل IInAppBillingService.java ساخته شود.
  1. برنامه خود را build کنید. حال باید فایلی با نام IInAppBillingService.java در پوشه /gen خود داشته باشید. دقت کنید که شما این فایل را دستی نمی‌سازید بلکه بعد در طی build کردن ساخته می‌شود.

بروزرسانی Manifest برنامه

خرید درون‌برنامه‌ای وابسته به برنامه مایکت است، که همه ارتباطات بین برنامه شما و سرور مایکت را مدیریت خواهد کرد. برای استفاده از برنامه مایکت برنامه شما باید مجوز مناسب را درخواست کند. شما می‌توانید این کار را با اضافه کردن مجوز ir.mservices.market.BILLING به فایل AndroidManifest.xml انجام دهید. در صورتی که برنامه شما مجوز خرید درون‌برنامه‌ای را درخواست نکرده باشد، درخواست‌اش برای ارتباط با مایکت پذیرفته نمی‌شود و برنامه شما با خطا مواجه می‌شود.

 

شما می‌توانید برای برنامه خود اجازه‌های لازم را با قرار دادن کد زیر در فایل AndroidManifest.xml صادر کنید: 

ساخت یک ServiceConnection

برنامه شما برای ارتباط با مایکت باید یک ServiceConnection داشته باشد استفاده کند. برنامه شما حداقل باید موارد زیر را انجام دهد:

  • اتصال به IInAppBillingService.
  • ارسال درخواست‌ها به برنامه مایکت.
  • مدیریت پاسخ‌ها که برای هر درخواست بر‌می‌گردد.

متصل شدن به IInAppBillingService

برای برقراری ارتباط با سرویس خرید درون‌برنامه‌ای مایکت، یک ServiceConnection را برای متصل شدن activity خود به IInAppBillingService پیاده‌سازی کنید. متدهای onServiceDisconnected و onServiceConnected را override کنید تا یک نمونه از IInAppBillingService را بعد از ایجاد اتصال دریافت کنید.

 

در متد OnCreate از activity خود، اتصال را با فراخوانی متد bindService برقرار کنید. به ورودی آن یک Intent که به سرویس خرید درون‌برنامه‌ای اشاره می‌کند، و یک نمونه از ServiceConnection که ساخته‌اید را بدهید.


شما هم اکنون می‌توانید از mService برای برقراری ارتباط با مایکت استفاده کنید.

مهم: یادتان باشد در انتهای کار اتصال با سرویس حتما قطع کنید. اگر این اتصال را قطع نکنید، اگر این اتصال باز بماند ممکن است باعث کاهش کارایی دستگاه کابر شود. مثال زیر نحوه قطع نمودن اتصال از یک ServiceConnection به نام mServiceConn را با overrid کردن متد OnDestroy در activity نشان می‌دهد.

 

 

برای پیاده‌سازی کامل یک ServiceConnection که به IInAppBillingService متصل می‌شود، فصل ۲ و مثال‌هایش را ببینید.

فرستادن درخواست‌های خرید درون‌برنامه‌ای

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

کوئری محصولات موجود برای خرید:

در برنامه‌تان، شما می‌توانید اطلاعات ریز محصول‌تان را از مایکت درخواست کنید. برای فرستادن چنین درخواستی، ابتدا یک Bundle بسازید که حاوی یک ArrayList از شناسه محصولات با کلید ITEM_ID_LIST است.


 
برای دریافت این اطلاعات از مایکت، متد getSkuDetails را فراخوانی کنید و به عنوان نسخه خرید درون‌برنامه‌ای مقدار «3»، نام بسته برنامه (packange name)، نوع خرید ("inapp") و Bundleی که ساختید را بدهید.


 
اگر درخواست موفقیت‌آمیز باشد، Bundleی که برگردانده می‌شود یک کد پاسخ BILLING_RESPONSE_RESULT_OK (0) خواهد داشت.

 

 

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

 

 

برای دیدن *همه‌ی* کدهای پاسخ از مایکت، فصل ۸ را مطالعه نمایید.

 

نتایج کوئری در یک ArrayList با کلید DETAILS_LIST و اطلاعات خرید در یک رشته دیگر با فرمت JSON ذخیره شده است. برای مشاهده جزئیات محصول که برگردانده می شود به فصل ۸ مراجعه کنید.

 

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

 

 

خرید یک محصول

برای شروع یک درخواست خرید در برنامه‌تان، متد getBuyIntent در سرویس خرید درون‌برنامه‌ای را فراخوانی کنید. به این متد ورودی‌های، نسخه API خرید درون‌برنامه‌ای (3)، نام بسته برنامه‌تان (package name)، شناسه محصول، نوع خرید ("inapp") و یک رشته developerPayload، را بدهید. از رشته developerPayload برای مشخص کردن هر اطلاعات اضافی که مایلید مایکت به همراه اطلاعات خرید برای شما برگرداند، استفاده می‌شود.

 

 

اگر درخواست موفقیت‌آمیز باشد، Bundleی که برگردانده می‌شود حاوی کد پاسخ BILLING_RESPONSE_RESULT_OK (0) و یک PendingIntent است که شما می‌توانید از آنها برای آغاز عملیات خرید استفاده نمایید. برای مشاهده تمامی کدهای پاسخی که ممکن است از مایکت دریافت کنید به فصل ۸ مراجعه نمایید. پس از آن یک PendingIntent از Bundle برگردانده شده با کلید BUY_INTENT استخراج کنید.


 
برای تکمیل عملیات خرید، متد startIntentSenderForResult را فراخوانی کنید و از PendingIntentی که ایجاد نموده‌اید استفاده نمایید. در این مثال، از مقدار دلخواه 1001 برای کد درخواست استفاده شده.

 

مایکت پاسخی به PendingIntentتان به متد onActivityResult برنامه‌ی شما می‌فرستد. متد onActivityResult یک کد نتیجه Activity.RESULT_OK (1) یا Activity.RESULT_CANCELED (0) را خواهد داشت. برای مشاهده سایر اطلاعاتی که در Intent وجود دارد، فصل ۸ را ببینید.

 

اطلاعات خرید برای سفارش یک رشته با فرمت JSON است که با کلید INAPP_PURCHASE_DATA در Intent پاسخ قرار دارد، به عنوان مثالی از چنین رشته JSONی:


 
در ادامه مثال قبل، شما کد پاسخ، داده‌های خرید و امضای دیجیتالی را در Intent پاسخ دریافت می‌کنید.

 

 
توصیه امنیتی: وقتی که شما یک درخواست خرید ارسال می‌کنید، یک رشته‌ی token بسازید که به طور منحصر به فرد این درخواست خرید را مشخص کند و آن را در developerPayload قراد دهید. شما می‌توانید از یک رشته‌ای که تصادفی تولید شده به عنوان token استفاده کنید. هنگامی که شما پاسخ خرید را از مایکت دریافت می‌کنید مطمئن شوید که امضای دیجیتالی، orderId، و رشته developerPayload داده‌های بازگشتی را بررسی می‌کنید. برای امنیت بیشتر، شما باید این کار را بر روی سرورهای امن خود انجام دهید. اطمینان حاصل کنید که orderId یک مقدار منحصر به فرد باشد و شما قبلا آن را پردازش نکرده‌اید و رشته developerPayload با tokenی که قبلاً با درخواست خرید فرستاده‌اید مطابقت داشته باشد.

 

کوئری محصولات خریده شده

برای بازیابی اطلاعات خریدهای کاربر از برنامه‌تان، متد getPurchases را فراخوانی کنید و به عنوان ورودی ، شماره نسخه‌ی API درون‌برنامه‌ای (3)، نام بسته برنامه‌تان (package name) و نوع خرید ("inapp") را بدهید.

 

سرویس مایکت تنها برای کاربری که در حال حاضر در برنامه مایکت وارد شده کار می‌کند. اگر درخواست موفقیت آمیز باشد، Bundle برگشتی کد پاسخ 0 خواهد داشت. همچنین Bundle پاسخ حاوی یک لیست از شناسه محصول، یک لیست از جزئیات سفارش هر خرید و همچنین امضاهای دیجیتال هر خرید می‌باشد.
به منظور بهبود عملکرد سرویس خرید درون‌برنامه‌ای، وقتی برای بار اول getPurchase را فراخوانی می‌کنید فقط تا سقف معینی محصول متعلق به کاربر را بر می‌گرداند (برای مثال ۷۰۰ تا). اگر کاربر تعداد محصولاتی که خریداری کرده بیشتر باشد، مایکت یک رشته token که بر روی کلید INAPP_CONTINUATION_TOKEN منطبق شده را در Bundle پاسخ قرار می‌دهد تا به شما نشان دهد کاربر محصولات بیشتری برای نمایش دارد و می‌توانید آنها را بازیابی کنید. سپس برنامه شما getPurchases را فرا می‌خواند و این token را به عنوان آرگومان ورودی به آن می‌دهد. مایکت بازگرداندن token های دنباله دار را تا زمانی که تمام محصولاتی که متعلق به کاربر است ارسال نشده ادامه می‌دهد.

 

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

مصرف نمودن یک خرید

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

 

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

 

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

 

برای ثبت مصرف یک خرید، متد consumePurchase را فراخوانی نمایید و مقدار رشته purchaseToken (که خریدی را مشخص می‌کند که قرار است مصرف شود) را به عنوان ورودی به آن بدهید. purchaseToken بخشی از داده‌ای است که در INAPP_PURCHASE_DATA به وسیله مایکت بعد از یک خرید موفق برگردانده می‌شود. در این مثال، شما مصرف محصولی را که با purchaseToken در متغیر token مشخص می‌شود، مصرف می‌کنید.


 

 

هشدار: متد consumePurchase را در thread اصلی برنامه خود فراخوانی نکنید. اگر این کار را کنید باعث ایجاد درخواست شبکه‌ای (اینترنتی) در برنامه شما می‌شود و آن را مسدود کند. در عوض یک thread جداگانه بسازید و متد consumePurchase را درون آن فراخوانی نمایید.

 

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

 

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

 

محصولات اشتراکی

مایکت از اشتراک پشتیبانی می‌کند. در آینده نزدیک مستند این نوع خرید درون‌برنامه‌ای منتشر خواهد شد. برای اطلاعات بیشتر در این زمینه می‌توانید از تیم پشتیبانی مایکت به آدرس ایمیل developer@myket.ir کمک بگیرید.

برنام خود را ایمن کنید

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

 

توجه: برای فهمیدن کلید عمومی برنامه خود، در پنل توسعه‌دهندگان مایکت اینجا را ببینید.

 

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

 

برا ی کسب اطلاعات بیشتر فصل ۹ را ببینید. 

فصل ۸: مرجع API

در این فصل اطلاعات کامل ورودی‌ها و خروجی‌های متدهای API خرید درون‌برنامه‌ای آورده شده.

کدهای بازگشتی از سرور

جدول زیر لیست تمام کدهایی است که مایکت به برنامه شما می‌فرستد. تمام کدهای پاسخ یک عدد هستند که مایکت در Bundleی که به عنوان پاسخ برمی‌گرداند در کلید RESPONSE_CODE آن را قرار می‌دهد. برنامه شما باید تمام این کدها را اداره کند. می‌توانید به برنامه مثال TrivialDrive نگاهی بیاندازید که این کار در آن شده است.

 

جدول 1. خلاصه ای از کدهای پاسخ در *خرید درون‌برنامه‌ای*

کد بازگشتی

مقدار

توضیحات

BILLING_RESPONSE_RESULT_OK

0

با موفقفیت انجام شد

BILLING_RESPONSE_RESULT_USER_CANCELED

1

کاربر عملیات را لغو کرد

BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE

3

خرید درون‌برنامه‌ای پشتیبانی نمی‌شود

BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE

4

محصول مورد نظر برای فروش موجود نمی‌باشد

BILLING_RESPONSE_RESULT_DEVELOPER_ERROR

5

پارامترهای ارسال شده به API درست نیستند

BILLING_RESPONSE_RESULT_ERROR

6

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

BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED

7

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

BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED

8

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

 

مرجع API

API خرید درون‌برنامه‌ای در فایل IInAppBillingService.aidl تعریف شده است، که در برنامه نمونه TrivialDrive وجود دارد.

متد getSkuDetails():

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

 

جدول 2: شرح فیلدهای JSON بازگشتی با فراخوانی متد getSkuDetails

کلید

توضیحات

productId

شناسه محصول که SKU نیز نام دارد

type

مقدار «inapp» برای محصولات مصرف شدنی و نشدنی، و مقدار «subs» برای اشتراک. از آنجایی که در حال حاضر اشتراک پیشتیبانی نمی‌شود تنها مقدار درست این فیلد «inapp» می‌باشد.

price

قیمت محصول به ریال

title

عنوان محصول

description

توضیحات درباره محصول

 

متد getBuyIntent():

این متد یک عدد با کلید RESPONSE_CODE و یک PendingIntent برای آغاز خرید محصول با کلید BUY_INTENT را در یک Bundle برمی‌گرداند. مایکت بعد از دریافت PendingIntent واسط کاربری خرید را به کاربر نشان می‌دهد، و نتیجه‌ی کار را به متد onActivityResult در Activity صدا زننده برمی‌گرداند. در Intentی که به onActivityResult داده می‌شود داده‌های خرید وجود دارند. جزئیات این داده‌ها در جدول ۳ ذکر شده‌اند.
جدول 3. *داده‌های بازگشتی بعد از یک درخواست خرید*

 

کلید

توضیحات

RESPONSE_CODE

اگر 0 باشد خرید موفقیت‌آمیز بوده، در غیر اینصورت خطایی رخ داده.

INAPP_PURCHASE_DATA

یک رشته از نوع JSON که حاوی جزئیات سفارش خرید می‌باشد. برای توضیحات فیلدهای این JSON به جدول ۴ مراجعه کنید.

INAPP_DATA_SIGNATURE

رشته‌ای که حاوی امضای دیجیتال رشته بالایی است، که با کلید خصوصی توسعه دهنده امضا شده است. امضای دیجیتال داده‌ها از RSASSA-PKCS1-v1_5 استفاده می‌کند.

جدول ۴ فیلدهای JSON حاوی جزئیات یک سفارش را توصیف می‌کند.

 

جدول 4. شرح فیلدهای JSON برای INAPP_PURCHASE_DATA

فیلد

توضیحات

orderId

شناسه منحصر بفرد تراکنش

packageName

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

productId

شناسه محصول؛ هر محصول شناسه‌ای دارد که شما باید آن را در پنل توسعه‌دهندگان مشخص کنید.

purchaseTime

این فیلد زمان خرید را بر حسب میلی ثانیه نمایش می‌دهد. (از تاریخ 1 ژانویه 1970)

purchaseState

وضعیت خرید سفارش (در حال حاضر فقط یک مقدار دارد):
0: خریده شده

developerPayload

رشته‌ای که توسعه‌دهنده ساخته و حاوی اطلاعات کاملی درباره خرید است. شما می‌توانید این فیلد را هنگامی که یک درخواست getBuyIntent می‌کنید ارسال نمایید.

purchaseToken

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

 

متد getPurchases():

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

 

جدول *5: پاسخ‌های دریافتی از یک درخواست* getPurchases

 

کلید

توضیحات

RESPONSE_CODE

0 اگر درخواست موفقیت‌آمیز باشد، در غیر اینصورت خطایی رخ داده

INAPP_PURCHASE_ITEM_LIST

ArrayList حاوی لیستی از شناسه محصولات

INAPP_PURCHASE_DATA_LIST

ArrayList حاوی جزئیات خریدها. جدول ۴ را برای لیستی از جزئیات ذخیره شده در هر INAPP_PURCHASE_DATA این لیست ببینید.

INAPP_DATA_SIGNATURE_LIST

ArrayList حاوی امضای دیجیتال خریدها

INAPP_CONTINUATION_TOKEN

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

فصل ۹: امنیت و طراحی

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

 

بهترین راه‌های بالا بردن امنیت:

 

  • تایید امضا را در سرور انجام دهید

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

  • حفاظت از محتوای رمز گذاری نشده شما


برای جلوگیری از اینکه افراد به این اطلاعات دسترسی پیدا نکنند و آن را به طور غیر قانونی منتشر نکنند آن را در فایل apk بسته نرم افزاری خود قرار ندهید. در عوض، یکی از موارد زیر را انجام دهید:

  • از سرویس Real-time برای انتقال دادن محتوای خود استفاده کنید، با استفاده از این سرویس می‌توانید مطالب خود را هر زمان که خواستید به روز رسانی کنید، یعنی مطالب جدید در اختیار کاربر قرار دهید.
  • از یک سرور برا ی انتقال محتوای خود استفاده کنید.

هنگامی که شما محتوا را از یک سرور یا یک سرویس Real-time دریافت کنید، شما می‌توانید مطالب را در حافظه دستگاه یا آن بر روی کارت SD دستگاه ذخیره کنید. حال اگر شما برای ذخیره‌ی محتوا از کارت SD استفاده کرده‌اید، لازم است از یک کلید رمزنگاری منحصر به فرد استفاده کنید و آن را ذخیره کنید.

  • کدهای خود را Obfuscate کنید.
شما باید کدی را که برای پرداخت ایجاد کرده‌اید رااز هم پاشیده و مبهم کنید تا افرادی که از طریق مهندسی‌ معکوس می‌خواهند به محتوا و بقیه قسمت‌های برنامه‌ی شما دسترسی پیدا کنند را سخت کنید. برای این کار به شما بسته ای که باعث این کار می‌شود را پیشنهاد می‌کنیم: Proguard

 

علاوه بر این به شما پیشنهاد می‌کنیم که موارد زیر را نیز استفاده کنید:
  • رشته‌ها را در زمان اجرا بسازید.
  • استفاده از روشهای درون خطی در بقیه روشها.
  • از Java Reflection برای فراخوانی روشها استفاده کنید.
اگر از این روش‌ها استفاده کنید، افرادی که به برنامه شما حمله می‌کنند کاهش خواهند یافت و با خیال راحت تری می‌توانید روش درون خرید را پیادده سازی کنید. مورد دیگر اینکه اگر از Proguard برای بهم ریختن کدتان استفاده می‌کنید، باید به فایل خود خط زیر را باید اضافه کنید:

  
 حال اگر از برنامه نمونه استفاده میکنید تا حد ممکن تمام قسمت‌های آن را تغییر دهید:
  • برنامه نمونه خرید درون‌برنامه‌ای به طور عمومی منتشر شده و هر کسی‌ می‌تواند آن را دانلود کند و این موضوع حاکی از این است که حمله کنندگان به راحتی می‌توانند به وسیله مهندسی‌ معکوس به برنامه شما حمله کنند. اما اگر شما از کد نمونه همان طور که بوده استفاده کنید و آن را تغییر ندهید به مشکل برخواهید خورد. حال تا آنجا که ممکن است سعی کنید برنامه خود را تغییر دهید.
  • افرادی که به برنامه‌ها حمله می‌کنند اکثراً ابتدا و انتهای آن را بررسی می‌کنند، پس پیشنهاد می‌کنیم بیشتر از هر قسمت دیگری ابتدا و انتهای برنامه خود را تغییر دهید.
  • استفاده از noncesهای تصادفی امن: Nonces نباید قابل پیش بینی و یا مورد استفاده مجدد قرار گیرد. شما می‌توانید همیشه از یک مولد عدد تصادفی cryptographically امن (مانند SecureRandom) برای تولید nonces استفاده کنید. با استفاده از این روش می‌توانید حملاتی که به برنامه شما می‌شود را کاهش دهید.
  • استفاده از developer payload هنگام ارسال درخواست خرید: در نسخه3 API، شما می‌توانید یک developer payload کنار ارسال درخواست خرید خود به مایکت ارسال نمایید. developer payload یک رشته است که به طور معمول هنگام خرید یک شناسه منحصر به فرد را در نظر می‌گیرد حال شما باید این رشته را برای احراز هویت کاربر که خرید را از برنامه شما انجام داده به مایکت ارسال نمایید بعد از اتمام خرید این رشته همراه با پاسخ خرید به شما برمی‌گرداند. پس از ارسال این رشته از سوی مایکت به شما آن را بررسی نمایید و مطمئن شوید که این رشته همتنی است که شما آن را به مایکت ارسال نموده بودید. برای انجام این موضوع بهتر است برای حفظ امنیت آن را بر روی سرور خود انجام دهید.
  • بر علیه افرادی که علامت تجاری کپی رایت برنامه شما را نقض می‌کنند: اگر شما برنامه یا محصول خود را که در مایکت توزیع می‌کنید، مشاهده کردید افراد دیگری در جای دیگری به طور غیر قانونی اقدام به عرضه برنامه شما می‌کنند به طور قاطعانه پیگیر این موضوع شوید.
  • پیاده‌سازی یک برنامه revocability برای محتوای باز: اگر شما در حال استفاده از یک سرور راه دور برای ارائه و یا مدیریت محتوای خود استفاده می‌کنید، همیشه دسترسی‌ها و خریدها را بررسی کنید. و اگر فردی را دیدید که دسترسی او کمی مبهم و با مشکل است، اجازه دسترسی او را لغو نمایید.
  • حفاظت از کلید عمومی مایکت: برای اینکه کلید عمومی خود را از دید کاربران مخرب و هکرها دور نگه دارید و آن را امن نگاه دارید، می‌توانید رشته را در زمان اجرا بسازید یا از دست بردن در بیت‌ها (برای مثال، XOR با برخی از رشته‌های دیگر) برای مخفی کردن کلید واقعی خود استفاده کنید تا هیچ هکر یا کاربر مخربی به کلید عمومی شما دسترسی پیدا نکنند.
  • No labels