از کتابخانه صورت‌حساب Google Play با Unity استفاده کنید

افزونه‌ی پرداخت گوگل پلی (Google Play Billing) سرویس‌ها و دارایی‌های داخلی یونیتی برای خریدهای درون‌برنامه‌ای، به نام Unity IAP ، را گسترش می‌دهد تا بازی شما را با تمام جدیدترین ویژگی‌های کتابخانه‌ی پرداخت گوگل پلی (Google Play Billing Library) مجهز کند. این راهنما نحوه‌ی راه‌اندازی پروژه‌ی شما برای استفاده از این افزونه را توضیح می‌دهد. این راهنما همچنین نحوه‌ی پیاده‌سازی ویژگی‌های کتابخانه‌ی پرداخت گوگل پلی را در بازی شما در یونیتی شرح می‌دهد.

افزونه پرداخت گوگل پلی را تنظیم کنید

برای راه‌اندازی افزونه، مراحل موجود در هر یک از این بخش‌های مرتبط را انجام دهید:

  1. لایه انتزاعی Unity IAP را فعال کنید .
  2. افزونه را دانلود و وارد کنید .
  3. تنظیمات ساخت افزونه را پیکربندی کنید .
  4. افزونه را فعال کنید .

فعال کردن لایه انتزاعی Unity IAP

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

  1. تمام مراحل آموزش Unity زیر را انجام دهید: پروژه خود را برای Unity Services تنظیم کنید .
  2. تمام مراحل آموزش Unity زیر را انجام دهید: سرویس Unity IAP را فعال کنید .

افزونه را دانلود و وارد کنید

این افزونه به عنوان یک بسته Unity با فرمت .unitypackage ارائه می‌شود. برای دانلود و وارد کردن افزونه، این مراحل را دنبال کنید:

  1. آخرین نسخه افزونه‌های گوگل پلی برای یونیتی را از صفحه انتشارهای مخزن در گیت‌هاب دانلود کنید.
  2. از نوار منوی Unity، روی Assets > Import Package > Custom Package کلیک کنید.

  3. فایل .unitypackage ‎ را از کجا دانلود کرده‌اید، پیدا کنید و آن را انتخاب کنید.

  4. در پنجره‌ی «وارد کردن بسته‌ی یونیتی» ، تمام فایل‌ها را انتخاب شده رها کنید و روی «وارد کردن» کلیک کنید.

پس از وارد کردن بسته، یک پوشه جدید به نام GooglePlayPlugins (در ریشه پوشه Assets) به دارایی‌های پروژه شما اضافه می‌شود. این پوشه شامل تمام دارایی‌های کتابخانه پرداخت گوگل پلی برای افزونه است.

پیکربندی تنظیمات ساخت

از آنجا که این افزونه، Unity IAP را توسعه می‌دهد، Unity با تداخل مواجه می‌شود و نمی‌تواند یک APK اندروید بسازد، مگر اینکه برخی از وابستگی‌های قدیمی‌تر و همپوشانی‌دار در Unity IAP از ساخت حذف شوند. این افزونه روشی خودکار برای حذف کتابخانه‌های متضاد از پروژه شما ارائه می‌دهد. برای حل این تداخل‌ها، این مراحل را دنبال کنید:

  1. از نوار منوی Unity، Google > Play Billing > Build Settings را انتخاب کنید.

  2. در پنجره Play Billing Build Settings، روی Fix کلیک کنید. این کار تداخل را برطرف می‌کند و فایل‌های IAP یونیتیِ تداخل‌دار را به یک پوشه پشتیبان منتقل می‌کند. پس از کلیک روی Fix ، دکمه به Restore تغییر می‌کند که می‌توانید برای بازیابی فایل‌های اصلی و تداخل‌دار روی آن کلیک کنید.

افزونه را فعال کنید

برای فعال کردن افزونه، پیاده‌سازی Unity IAP از Google Play را با افزونه Google Play Billing جایگزین کنید. برای مثال، هنگام استفاده از Unity IAP Purchaser Script ، باید StandardPurchaseModule که به سازنده IAP ارسال می‌شود را تغییر دهید تا از Google.Play.Billing.GooglePlayStoreModule استفاده کند:

// Create a builder using the GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());

اگر بازی شما از اسکریپت خرید یکسانی برای چندین پلتفرم استفاده می‌کند، باید یک بررسی پلتفرم اضافه کنید تا مطمئن شوید که یونیتی همچنان از راهکار IAP خود برای سایر پلتفرم‌ها استفاده خواهد کرد:

ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android)
{
  builder = ConfigurationBuilder.Instance(
      Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
  builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}

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

ConfigurationBuilder builder;
if (Application.platform == RuntimePlatform.Android
       && SelectedAndoidAppStore == AppStore.GooglePlay)
{
  builder = ConfigurationBuilder.Instance(
      Google.Play.Billing.GooglePlayStoreModule.Instance());
}
else
{
  builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
}

ویژگی‌های کتابخانه پرداخت گوگل پلی را در بازی خود پیاده‌سازی کنید

افزونه‌ی پرداخت درون‌برنامه‌ای گوگل پلی، سرویس‌های IAP یونیتی را توسعه می‌دهد، بنابراین می‌توانید از همان APIهای یونیتی برای مدیریت گردش‌های کاری خرید رایج استفاده کنید. توجه داشته باشید که به دلیل تفاوت‌های بین کتابخانه‌ی پرداخت درون‌برنامه‌ای گوگل پلی و پیاده‌سازی استاندارد IAP یونیتی برای سایر فروشگاه‌های برنامه، تغییرات جزئی در رفتار API وجود دارد. اگر با APIهای IAP یونیتی تازه‌کار هستید، برای مثالی از نحوه‌ی پیاده‌سازی جریان‌های خرید اولیه، به بخش «ایجاد اسکریپت خرید» در آموزش IAP یونیتی مراجعه کنید.

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

فعال کردن خریدهای معوق

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

برای فعال کردن خریدهای معوق، از سازنده‌ی IAP خود برای تغییر پیکربندی ماژول خود با فراخوانی متد EnableDeferredPurchase() استفاده کنید:

// Create a builder using a GooglePlayStoreModule.
var configurationBuilder =
    ConfigurationBuilder.Instance(Google.Play.Billing.GooglePlayStoreModule.Instance());
// Enable deferred purchases
configurationBuilder.Configure<Google.Play.Billing.IGooglePlayConfiguration>()
    .EnableDeferredPurchase();

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

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Set the deferred purchases callback.
_playStoreExtensions.SetDeferredPurchaseListener(
    delegate(Product product)
    {
        // Do not grant the item here. Instead, record the purchase and remind
        // the user to complete the transaction in the Play Store.
    });

شناسه‌های حساب کاربری مبهم را به گوگل پلی ارسال کنید

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

برای ارسال شناسه حساب مبهم‌سازی‌شده، متد SetObfuscatedAccountId() را از API افزونه‌ها فراخوانی کنید:

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Pass an obfuscated account ID.
_playStoreExtensions.SetObfuscatedAccountId(obfuscatedAccountId);

شناسه‌های پروفایل مبهم را به گوگل پلی ارسال کنید

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

برای ارسال یک شناسه پروفایل مبهم، از سازنده IAP خود برای تغییر پیکربندی ماژول خود با فراخوانی متد SetObfuscatedProfileId() استفاده کنید:

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

// Pass an obfuscated profile ID.
_playStoreExtensions.SetObfuscatedProfileId(obfuscatedProfileId);

تغییرات قیمت اشتراک‌ها را تأیید کنید

گوگل پلی به شما اجازه می‌دهد قیمت اشتراک فعال را تغییر دهید . کاربران بازی شما باید هرگونه تغییر قیمت را قبل از اعمال تغییر، تأیید کنند. برای اینکه کاربران را به تأیید تغییر قیمت اشتراک خود ترغیب کنید، متد ConfirmSubscriptionPriceChange() را فراخوانی کنید:

// Get the plugin extensions for the Google Play Store.
_playStoreExtensions =
    extensions.GetExtension<Google.Play.Billing.IGooglePlayStoreExtensions>();

_playStoreExtensions.ConfirmSubscriptionPriceChange(productId,
    delegate (bool success)
    {
        // Returns whether the user has accepted the new price or not.
    });

تغییرات در رفتار API یونیتی

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

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

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

شما می‌توانید همچنان از همان رابط‌هایی که توسط پیاده‌سازی استاندارد IAP یونیتی برای سایر فروشگاه‌های برنامه تعریف شده‌اند، از جمله IStoreController استفاده کنید. هنگام شروع خرید، همچنان می‌توانید از IStoreController استفاده کرده و متد InitiatePurchase() را فراخوانی کنید:

public void InitiatePurchase(Purchasing.Product product, string payload);

با این حال، هر بار پرداختی که وارد کنید، اعمال نخواهد شد (در رسید نهایی نمایش داده نمی‌شود).

SubscriptionManager پشتیبانی نمی‌شود

Unity IAP کلاس SubscriptionManager برای مدیریت اشتراک‌ها ارائه می‌دهد. از آنجا که پیاده‌سازی استاندارد Unity IAP از این کلاس از developer payload استفاده می‌کند، این کلاس پشتیبانی نمی‌شود. شما هنوز می‌توانید این کلاس را ایجاد کنید، اما ممکن است هنگام استفاده از هر یک از متدهای getter کلاس، داده‌های غیرقابل اعتمادی دریافت کنید.

UpdateSubscription تغییرات کوچکی در API دارد

افزونه‌ی Google Play Billing از متدهای SubscriptionManager.UpdateSubscription() و SubscriptionManager.UpdateSubscriptionInGooglePlayStore() برای ارتقا و کاهش اشتراک‌های شما پشتیبانی نمی‌کند. اگر بازی شما این متدها را فراخوانی کند، خطای GooglePlayStoreUnsupportedException رخ می‌دهد.

کتابخانه پرداخت گوگل پلی یک API جایگزین برای استفاده به جای این متدها ارائه می‌دهد. برای ارتقا یا کاهش اشتراک، متد UpdateSubscription() با استفاده از حالت تناسب فراخوانی کنید:

void UpdateSubscription(Product oldProduct, Product newProduct,
           GooglePlayStoreProrationMode prorationMode = GooglePlayStoreProrationMode.Unknown);

می‌توانید این فراخوانی متد را با بررسی پلتفرم یا در یک بلوک catch هنگام وقوع خطای GooglePlayStoreUnsupportedException قرار دهید.

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