نیواد چیست؟
در این مطلب در مورد وب سرویس های اندرویدی نیواد صحبت خواهیم کرد.
امروزه با گسترش فناوری و افزایش سریع استفاده از گوشی های تلفن هوشمند در سراسر جهان، نیاز به تولید برنامه های موبایلی نیز افزایش پیدا کرده است(نیواد ارائهدهنده خدمات Backend as a Service). برنامه هایی که هدفشان رشد سطح زندگی افراد، کمک به سلامت خانواده، سرگرمی و … می باشد. این شرایط، فرصت رشدی برای برنامه نویسان برنامه های موبایلی فراهم کرده است تا ایده های خود را اجرایی کنند، همانطور که شاهد افزایش تعداد برنامه های موبایلی در بازارهای داخل و خارج کشور هستیم. در این شرایط، مسایلی مانند امنیت، وقت و هزینه برای برنامه نویسان صاحب ایده اهمیت دوچندان پیدا میکند. هدف نیواد رسیدگی به این مسایل و فراهم آوردن محیطی ست که شما بدون دغدغه درباره ی مسایل دیگر، تنها به گسترش برنامه های خود فکر کنید.
تیم نیواد متشکل از افرادیست که خود برنامه نویس های برنامه های موبایلی بوده و از نزدیک با مشکلاتی که شما هنگام توسعه ی برنامه های خود روبرو هستید، مواجه بوده اند و حالا این افراد دور هم جمع شده اند تا این مشکلات را برای همیشه از پیش پای برنامه نویسان موبایلی بردارند. نگرانی های امنیتی شما را برطرف کنند، قسمتهای خسته کننده اما ضروری ای که برای توسعه ی هر برنامه ای لازم است را به صورت آماده در اختیار شما قرار دهند و با این همه تضمین میکنند که بهترین خدمات را با کمترین قیمت دریافت خواهید نمود .
خدمات ابری نیواد بر روی سرورهای پرسرعت ارائه میشود. این خدمات که شامل امن سازی پرداخت درون برنامه ای، سرویس پوش نوتیفیکیشن، ذخیره سازی ابری اطلاعات، مدیریت کاربران و ده ها خدمت دیگر است، در اکثر برنامه ها و بازی ها مورد نیاز است. چنانکه با سرشماریها و بررسی های انجام گرفته بیش از پنجاه درصد از زمان تولید و توسعه ی یک برنامه ی موبایل صرف برنامه نویسی قسمت هایی از کد میشود که کاملا ضروری ست اما نیاز به وقت و هزینه ی زیاد دارد و باید حتما توسط افراد متخصص انجام گیرد. با استفاده از خدمات نیواد، از وجود یک متخصص آماده استفاده کنید و با خیال راحت به برنامه نویسی خود ادامه دهید.
راهنمای بسته پرداخت :
بستهی پرداخت و proguard
درصورتی که از proguard استفاده میکنید rule های زیر را به فایل تنظیمات proguard تان اضافه کنید:
-keep class io.nivad.** { *; }
-keep class com.auth0.jwt.** { *; }
-dontwarn org.**
-dontwarn javax.**
-dontwarn com.auth0.jwt.**
معنای اصطلاحات پر کاربرد در پرداخت درون برنامهای
شناسهی کالا
نامهای دیگر: sku و product id
عبارتی است حداکثر ۱۰۰ حرفی و غیر تکراری که محصولات مختلف را از هم متمایز میکند. این عبارت را کاربر نمیبیند و فقط در برنامه نویسی کاربرد دارد. معمولا عباراتی مانند my.game.100.coins و awesome_app_remove_ads یا eshterake_mahane_app را به عنوان شناسهی محصول به کار میبرند.
محصول خریدنی مصرف شدنی
نامهای دیگر:consumable product
محصولات مصرف شدنی محصولاتی هستند که کاربران میتوانند چندبار آنها را بخرند. مثلا سکه در بازیها محصول مصرف شدنی محسوب میشود. برای این محصولات در تابع onProductPurchased و تابع onPurchaseHistoryRestored متد consumePurchase را صدا بزنید. در صورتی که مقدار بازگشتی این تابعtrueبود محصول را به کاربر بدهید. به عنوان مثال کد زیر وقتی که کاربر محصولی با شناسهی my.game.100.coins را خریداری کند به مقدار متغیر coins عدد ۱۰۰ را اضافه میکند.
private void processCoinPurchase() {
if (mNivadBilling.isPurchased(“my.game.100.coins”)) {
boolean success = mNivadBilling.consumePurchase(“my.game.100.coins”);
if (success) {
coins += 100;
}
}
}
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
if (“my.game.100.coins”.equals(productId)) {
processCoinPurchase();
}
}
@Override
public void onPurchaseHistoryRestored() {
processCoinPurchase();
}
.مصرف یک محصول باعث میشود کاربر بتواند دوباره آن محصول را خریداری کند.
محصول خریدنی غیر مصرف شدنی
نامهای دیگر:unconsumable product و محصول خریدنی مصرف نشدنی!
محصولات مصرف نشدنی در پنل بازار تفاوتی با محصولات مصرف شدنی ندارند و هردو در دستهی «خریدنی» قرار میگیرند. تفاوت محصولات مصرف شدنی و غیر مصرف شدنی در این است که برای این محصولات متد consumePurchase را صدا نمیکنیم. صدا کردن این تابع باعث ایجاد خطا نمیشود بلکه مفهوم «مصرف شدنی» و «غیر مصرف شدنی» بودن مربوط به ماهیت محصول است. محصولاتی مانند ارتقای برنامه به نسخهی کامل یا حذف تبلیغات که کاربر فقط باید یک بار آنها را خریداری کند غیر مصرف شدنی محسوب میشوند.
پس از هر بار باز شدن برنامه و صدا شدن تابع onPurchaseHistoryRestored این محصولات در لیست محصولات تحت مالکیت کاربر باقی میمانند. با تابع isPurchased میتوان از وجود یا عدم یک محصول در لیست محصولات تحت مالکیت کاربر مطلع شد.
نکته محصولات مصرف شدنی و غیرمصرفی
محصولاتی که خریداری شده اند تا زمانی که consume (مصرف) نشده باشند در لیست محصولات تحت مالکیت کاربر باقی میمانند. بنابراین ممکن است تابع onProductPurchased و onPurchaseHistoryRestored برای یک محصول بیش از یک بار صدا زده شوند. این خبر خوبی برای محصولات غیر مصرف شدنی است اما دربارهی محصولات مصرف شدنی باید توجه داشته باشید که در این مواقع اثر خرید را در برنامهتان اعمال نکنید و آن را به پس از صدا زدن متد consumePurchase موکول کنید. در غیر این صورت ممکن است اثر یک خرید بیش از یک بار در برنامه اعمال شود. (مثلا کاربر یک بار ۱۰۰ سکه بخرد ولی ۴ بار ۱۰۰ سکه به پولش در بازی اضافه شود)
نکته حفظ محصول پس از حذف و نصب دوبارهٔ اپلیکیشن
اگر کاربر محصولی را بخرد و آن را مصرف نکنید، پس از پاک کردن برنامه هم آن محصول تحت مالکیت کاربر باقی میماند. اگر کاربر دوباره اپلیکیشن یا بازی شما را نصب کند و اقدام به خرید این محصولات بکند بدون اینکه مجدداً پولی از حساب کاربر کسر شود تابع onProductPurchased صدا زده میشود.
استفادهاز کتابخانهٔ پرداخت نیواد در Unity 3D
برای پیادهسازی پرداخت درونبرنامهای و مدل اقتصادی بازی از کتابخانهٔ کامل و قدرتمند سوملا (soomla) استفاده شده است
برای پیادهسازی پرداخت درونبرنامهای و مدل اقتصادی بازی از کتابخانهٔ کامل و قدرتمند سوملا (soomla) استفاده شده است و تمام متدها و API آن در دسترس شما قرار دارد؛ لذا برای اطلاعات بیشتر میتوانید به مطالبی که دربارهٔ کتابخانهٔ سوملا در اینترنت به زبانهای فارسی و انگلیسی موجود است نیز مراجعه کنید
این کتابخانه با هر دو نسخهٔ ۴ و ۵ محیط Unity سازگار است و از کافهبازار برای پردازش خریدها استفاده میکند. با وارد کردن Nivad Application ID و Billing Secret که از پنل نیواد میتوانید آنها را برای بازیتان دریافت کنید، سرویس امنیت پرداخت نیواد فعال میشود.
خلاصهٔ فرایند
ابتدا، لازم است که بسته های unity3d-store و pre-baked را دانلود کنید.
از این لینک بسته های soomla-unity3d-core.unitypackage و soomla-unity3d-store.unitypackage را دانلود کنید: unity3d-store-bazaar v1.13.0
هر دو بسته ی یونیتی را به پروژه یونیتی خود اضافه کنید.
در منوی یونیتی بر روی Window > Soomla > Edit Setting کلیک کنید و مقدار “Soomla Secret “ و ”Public Key” را تغییر دهید:
ارائه دهنده خدمات پرداخت خود را انتخاب کنید – این میتواند Google play , بازار , Amazoon , App Store یا WP باشد.
Soomla Seccret – یک آرایه رمزنگاری شده که شما ایجاد میکنید تا امنیت داده شما را فراهم کند.
کلید عمومی Public Key – لازم است که شما کلید عمومی (RSA) که از مارکت گرفتهاید را وارد کنید.
شناسه نرم افزاری نیواد (Nivad Application id) – در صورتی که شما تیک گزینه ی حفاظت از تقلب نیواد را زده باشید
رمز پرداخت نیواد (Nivad Billing Secret) – در صورتی که شما تیک گزینه ی حفاظت از تقلب نیواد را زده باشید
پیاده سازی خودتان از IstoreAssets را برای توصیف اجزای بازی خود ایجاد کنید.
به عنوان یک مثال ساده, مثال موجود در انتهای متن را ببینید.
به SoomlaStore با کلاسی که ایجاد کردهاید مقداردهی کنید:
SoomlaStore.Initialize(new YourStoreAssetsImplementation());
SoomlaStore را در آغاز تابع MonoBehaviour مقدار دهی کنید و نه در تابع Awake
Soolma, درواقع MonoBehaviour خاص خودش را دارد و نیاز دارد تا قبل از مقداردهی”بیدار” بشود.
SoomlaStore را تنها زمانی که نرمافزار شما لود میشود مقداردهی کنید
شما به یک Event Handler نیاز خواهید داشت تا شما را در مورد Eventهای پرداخت درون برنامهای مطلع کند. توضیحات بیشتر درباره Event Handler در ادامه آمده است.
تمام شد، اکنون شما همه ملزومات ذخیره سازی وتوانایی پرداخت درون برنامهای را دارید.
Unity & Android
راه اندازی سرویس IAB در پس زمینه
اگر شما storefront خود را درون بازی پیادهسازی کرده اید، توصیه میشود که سرویس IAB را در پس زمینه هنگامی که فروشگاه باز است باز کنید و هنگامی که بسته است، ببندید.
//راه اندازی سرویس Iab
SoomlaStore.StartIabServiceInBg();
// متوقف کردن سرویس Iab
SoomlaStore.StopIabServiceBg();
این اقدام ضروری نیست, بازی شما بدون آن هم کار خواهد کرد اما ،ما آن را به دلیل افزایش کارایی بیشنهاد میدهیم.
نحوهٔ انجام خرید
برای خرید آیتمها دو متد تعبیه شده است که تمام نیازهای بازیها را پوشش میدهد: PurchaseWithMarket و PurchaseWithVirtualItem.
PurchaseWithMarket یک متد برای خرید است که به کاربران اجازه میدهد VirtualItem ها را از بازار، گوگل پلی، آمازون یا اپ استور خریداری کنند. PurchaseWithVirtualItem یک متد دیگر است که به کاربران شما اجازه میدهد که یک VirtualItem را با VirtualItem دیگری بخرند. مثلاً خرید یک شمشیر با ۱۰۰ الماس.
برای معین کردن متدی که VirtualItem مجازی گوناگون شما (… goods, coins) خریداری میشوند، شما نیاز دارید تا پیادهسازی خود از IstoreAsset را انجام دهید. (گام ۴ در «خلاصهٔ فرایند» در بالا)
یک مثال:
بیاید فرض کنیم شما یک VirtualCurrencyPack دارید تابع TEN_COINS_PACK را فرا میخوانید و یک VirtualCurrency تابع COIN_CURRENCY را فرا میخوانید:
VirtualCurrencyPack TEN_COINS_PACK = new VirtualCurrencyPack(
“10 Coins”, // name
“A pack of 10 coins”, // description
“10_coins”, // item id
10, // number of currencies in the pack
COIN_CURRENCY_ITEM_ID, // the currency associated with this pack
new PurchaseWithMarket(“com.soomla.ten_coin_pack”, 1.99)
);
اکنون میتوانید از StoreInventory برای خرید یک VirtualCurrencyPack استفاده کنید
StoreInventory.buyItem(TEN_COINS_PACK.ItemId);
و تمام شد! unity3d-store می داند که چگونه برای شما به بازار ، گوگل پلی و یا به اپ استور متصل شود و کاربران شما را به سیستم خریدشان برای تکمیل فرایند خرید هدایت میکند. فراموش نکنید که eventهای فروشگاه را register کنید تا از موفق بودن یا نبودن خریدها آگاه شوید (به بخش Event Handling رجوع کنید)
Storage & Meta-Data
زمانی که SoomlaStore را initialize میکنید، دو کلاس دیگر نیز به طور خودکار initialize میشوند: StoreInventory و StoreInfo :
StoreInventory یک کلاس convenience که به شما امکان اجرای عملیات در VirtualCurrencyها و VirtualGoodها را می دهد.از آن برای ایجاد موجودی VirtualItemها در بازی استفاده کنید. ( از ItemIdهای آنها استفاده کنید)
StoreInfo جایی است که تمام اطلاعات متادیتا مختص بازی در آن بازیابی میشود. این کلاس با پیادهسازی از IstoreAssets مقدار دهی می شود. و میتوان از آن برای بازیابی اطلاعات مربوط به خصوصیات بازی استفاده کرد.
on-device storage به طور رمز نگه داری شده در دیتابیس SQLite ذخیره سازی می شود.
مثال استفاده
گرفتن VirtualCurrency با itemId:
VirtualCurrency coin = (VirtualCurrency) StoreInfo.GetItemByItemId(“currency_coin”);
به کاربر ده واحد از یک virtual currency با itemIdی “currency_coin” تعلق بدهید.
StoreInventory.GiveItem(“currency_coin”, 10);
۱۰ عدد virtual good با temIdی “green_hat” را از کاربر کسر کنید:
StoreInventory.TakeItem(“green_hat”, 10);
دریافت موجودی green hatها (virtual good با itemIdی “green_hat”)
int greenHatsBalance = StoreInventory.GetItemBalance(“green_hat”);
Event Handling
SOOMLA اجازه میدهد تا Event های فروشگاه را دریافت کنید و جزییات رفتاری اپلیکیشن خود را با Event ها پیادهسازی کنید.
نکته :رفتار خود را به رفتار پیشفرض پیادهسازی شده توسط SOOMLA اضافه کنید. رفتار SOOMLA را جایگزین نکنید!
کلاسهای Event جایی است که تمام Event به واسطه آن اجرا می شوند. به عنوان مثال برای دریافت Event مربوط به خرید موفق یک آیتم از فروشگاه از این کد میتوانید استفاده کنید:
StoreEvents.OnMarketPurchase += onMarketPurchase; public void onMarketPurchase(PurchasableVirtualItem pvi, string payload, Dictionary<string, string> extra) { // pvi آیتم مجازی خریدنی (PurchasableVirtualItem)ای است که با موفقیت خریده شده. // … منطق خاص مورد نیازتان … }
دقت کنید که:Event Handler ها را پیش از initialize کردن SoomlaStore باید initialize کنید. لذا در صورتی که از Event Handling استفاده میکنید این کد:
StoreEvents.OnSoomlaStoreInitialized += onSoomlaStoreInitialized;
باید حتما پیش از این کد بیاید:
Soomla.SoomlaStore.Initialize(new Soomla.Example.MuffinRushAssets());
راهنمای بستهی پرداخت در اندروید
کتابخانهی پرداخت نیواد در دو حالت ایمن و عادی قابل استفاده است.
حالت عادی اپلیکیشن یا بازی شما را از هک شدن پرداخت درون برنامهای با لاکی پچر و… حفاظت نمیکند اما استفاده از آن نسبت به نمونهای که بازار و مایکت و سایر مارکتهای اندرویدی فراهم کرده اند (Trivial Drive) بسیار راحتتر است.
حالت ایمن کتابخانهی پرداخت با اتصال به نیواد و کافه بازار طبق پروتکلهای امنیتی از پیش تعریف شده، بدون اینکه لازم باشد کد خاصی بنویسید صحت پرداختها را چک میکند و در صورتی که کاربری تلاشی برای هک پرداخت درون برنامهای بکند، تلاش وی بی نتیجه خواهد ماند و محصول به کاربر تعلق نمیگیرد. برای استفاده از حالت ایمن داشتن حساب کاربری نیواد لازم است.
استفاده از کتابخانهی پرداخت رایگان است.
راه اندازی پرداخت درون برنامهای
گام اول: دریافت کلید RSA از بازار
یک نسخهی apk از اپلیکیشنتان را در پنل بازار بارگزاری کنید. پس از آپلود کامل برنامه به بخش «پرداخت درونبرنامهای» وارد شوید و با کلیک روی دکمهای که در بخش «کلید RSA» قرار داده شده است کلید مربوط به برنامهی خود را دریافت کنید. این کلید را در جایی کپی و پیست کنید تا بعدا در برنامه استفاده شود.
نکته :جزئیات اطلاعات برنامه در این مرحله اهمیتی ندارند
لزومی ندارد که اطلاعات اپلیکیشنتان را به صورت کامل وارد کنید یا فایل apkی که بارگزاری میکنید نسخهی نهایی و کامل برنامه باشد. این اطلاعات در آینده قابل ویرایش هستند.
گام دوم: افزودن کتابخانهی نیواد
با اضافه کردن خطوط زیر به فایل build.gradle و سپس sync کردن gradle کتابخانهی نیواد به پروژهتان اضافه خواهد شد.
repositories {
jcenter()
maven { url ‘http://repo.nivad.io:8081/artifactory/list/libs-release’ }
}
dependencies {
compile ‘io.nivad.billing:library:+’
compile ‘com.auth0:java-jwt:2.1.0’
}
وارد Activity که میخواهید در آن پرداخت را اضافه کنید شوید و به خط تعریف کلاس عبارت implements BillingProcessor.IBillingHandler را اضافه کنید. قبل از تابع onCreate متغیر mNivadBilling را از نوع BillingProcessor تعریف کنید و در انتهای onCreate آن را به شکل زیر مقدار دهی کنید.
private BillingProcessor mNivadBilling; // تعریف متغیر
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNivadBilling = new BillingProcessor(this, “Bazaar RSA Key”, “Nivad Application ID”, “Nivad Application Secret”, MarketName.CAFE_BAZAAR, this); // مقدار دهی در انتهای onCreate
}
بجای پارامتر دوم کلید RSA ای که در گام نخست از بازار دریافت کرده اید را وارد کنید. پارامترهای سوم و چهارم را هم با مقادیری که از پنل مدیریتی نیواد دریافت کردهاید مقدار دهی کنید. Application ID و Application Secret را میتوانید در پنل مدیریتی، بخش پرداخت امن بیابید.
پارامتر پنجم نام مارکتی است که سرویس پرداخت باید به آن متصل شود. مارکتهای پشتیبانی شده کافه بازار و مایکت هستند.
نکته :حالت غیر امن نیواد (توصیه نمیشود)
در صورتی که میخواهید از حالت عادی (غیر ایمن) کتابخانهی پرداخت استفاده کنید پارامترهای سوم و چهارم (Nivad Application ID و Nivad Application Secret) را حذف کنید و بجای آنها null قرار دهید.
به انتهای کلاس چهار متد زیر را اضافه کنید:
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
}
@Override
public void onBillingError(int errorCode, Throwable error) {
}
@Override
public void onBillingInitialized() {
}
@Override
public void onPurchaseHistoryRestored() {
}
تابع onActivityResult را مانند کد زیر ایجاد کنید
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mNivadBilling.handleActivityResult(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data);
}
برای آزاد کردن حافظهی گوشی پس از اتمام عملیات پرداخت، متد onDestroy را نیز به صورت زیر به کلاس اضافه کنید:
@Override
public void onDestroy() {
if (mNivadBilling != null)
mNivadBilling.release();
super.onDestroy();
}
گام سوم: اضافه کردن Permission ها
دو اجازهی زیر را به فایل AndroidManifest.xml اضافه کنید.
نکته : پرمیژنها در حالت غیر ایمن (توصیه نمیشود)
در صورتی که از حالت ایمن کتابخانه استفاده نمیکنید فقط اجازهی اول (PAY_THROUGH_BAZAAR) لازم است.
<uses-permission android:name=”com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR” />
<uses-permission android:name=”android.permission.INTERNET” />
<uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE” />
اگر از مایکت استفاده میکنید بجای اجازهٔ کافه بازار باید از permission مایکت استفاده کنید:
<uses-permission android:name=”ir.mservices.market.BILLING” />
اکنون اپلیکیشن یا بازی شما آمادهی خرید است.
انجام یک خرید
برای آغاز فرایند خرید و هدایت کاربر به بازار باید از متدهای purchase و subscribe استفاده کنید. این دو متد به عنوان پارامتر ورودی به ترتیب Activity (معمولا this) و شناسهی محصول(productId یا sku) را دریافت میکنند.
شناسهٔ محصول چیست؟
شناسهی محصول رشتهی منحصر به فردی است که محصولات مختلف را از یکدیگر متمایز میکند. این شناسه را در بخش «پرداخت درونبرنامهای» در پنل بازار زمانی که محصولات و اشتراکهای اپلیکیشنتان را تعریف میکنید خودتان تعیین میکنید. شناسهی محصول حداکثر 100 حرف میتواند داشته باشد و قابل تغییر نیست.
مثال
mNivadBilling.purchase(this, “product_1000_coins”);
mNivadBilling.subscribe(this, “monthly_subscription”);
برای مصرف یک محصول مصرف شدنی از متد consumePurchase استفاده کنید. این متد به عنوان پارامتر ورودی شناسهی محصول را دریافت میکند.
پارامتر سوم این متدها (Webhook Payload) اختیاری است و رشتهای است که در بدنهٔ وبهوک پرداخت به سرور شما پاس داده میشود. برای اطلاعات بیشتر دربارهٔٔ وبهوکهای نیواد میتوانید به صفحهٔ راهنمای webhookهای نیواد مراجعه کنید.
برای چک کردن اینکه کاربر یک محصول (یا اشتراک) را خریداری کرده باید از متدهای isPurchased و isSubscribed استفاده کنید.
در این جاا شما کمی با نیواد ارائهدهنده خدمات Backend as a Service آشنا شدید جهت مطالعه واستفاده از خدمات نیواد کلیک فرمائید