استخدام Google Play Billing Library مع Unity

يضيف المكوّن الإضافي لنظام الفوترة في Google Play خدمات ومواد عرض مدمجة في Unity لعمليات الشراء داخل التطبيقات، والتي تُعرف باسم Unity IAP، وذلك لمنح لعبتك جميع الميزات الأحدث في Google Play Billing Library. يوضّح هذا الدليل كيفية إعداد مشروعك لاستخدام المكوّن الإضافي. يوضّح هذا الدليل أيضًا كيفية تنفيذ ميزات Google Play Billing Library في لعبتك باستخدام Unity.

إعداد المكوّن الإضافي لنظام الفوترة في Google Play

لإعداد المكوّن الإضافي، يُرجى إكمال الخطوات الواردة في كلّ قسم من الأقسام المرتبطة التالية:

  1. فعِّل طبقة التجريد لنظام IAP في Unity.
  2. نزِّل المكوّن الإضافي واستورِده.
  3. ضبط إعدادات إنشاء المكوّن الإضافي
  4. فعِّل المكوّن الإضافي.

تفعيل طبقة التجريد لنظام IAP في Unity

تم إنشاء المكوّن الإضافي لنظام "الفوترة في Google Play" استنادًا إلى طبقة تجريد مضمّنة في Unity IAP، لذا عليك تفعيل طبقة التجريد هذه قبل تنزيل المكوّن الإضافي واستيراده. لتفعيل طبقة التجريد في Unity IAP، اتّبِع الخطوات التالية:

  1. أكمِل جميع الخطوات الواردة في الدليل التعليمي التالي حول Unity: إعداد مشروعك لخدمات Unity.
  2. أكمِل جميع الخطوات الواردة في الدليل التعليمي التالي حول Unity: تفعيل خدمة IAP في Unity.

تنزيل المكوّن الإضافي واستيراده

يتم شحن المكوّن الإضافي كحزمة Unity بتنسيق .unitypackage. لتنزيل المكوّن الإضافي واستيراده، اتّبِع الخطوات التالية:

  1. نزِّل أحدث إصدار من Google Play Plugins for Unity من صفحة الإصدارات على GitHub في المستودع.
  2. من شريط قوائم Unity، انقر على مواد العرض > استيراد حزمة > حزمة مخصّصة.

  3. ابحث عن مكان تنزيل ملف .unitypackage واختَره.

  4. في مربّع الحوار استيراد حِزمة Unity، اترك جميع مواد العرض محدّدة وانقر على استيراد.

بعد استيراد الحزمة، تتم إضافة مجلد جديد باسم GooglePlayPlugins (في ملف ‎"مواد العرض") إلى مواد عرض مشروعك. يحتوي هذا المجلد على جميع مواد عرض Google Play Billing Library للمكوّن الإضافي.

ضبط إعدادات الإنشاء

بما أنّ المكوّن الإضافي يمدّد Unity IAP، سيواجه Unity تعارضات ولن يتم إنشاء حزمة APK لنظام التشغيل Android ما لم تتم إزالة بعض التبعيات القديمة والمتداخلة في Unity IAP من عملية الإنشاء. يوفّر المكوّن الإضافي طريقة تلقائية لإزالة المكتبات المتضاربة من مشروعك. لحلّ هذه التعارضات، اتّبِع الخطوات التالية:

  1. من شريط قوائم Unity، اختَر Google > الفوترة في Play > إعدادات الإصدار.

  2. في نافذة "إعدادات إصدار نظام الفوترة في Play"، انقر على إصلاح. يؤدي ذلك إلى حلّ التعارض ونقل ملفات Unity IAP المتعارضة إلى دليل احتياطي. بعد النقر على إصلاح، يتغيّر الزر إلى استعادة، ويمكنك النقر عليه لمحاولة استعادة الملفات الأصلية المتضاربة.

تفعيل المكوّن الإضافي

لتفعيل المكوّن الإضافي، استبدِل عملية تنفيذ Google Play في Unity IAP بأحد مكوّنات "الفوترة في Google Play" الإضافية. على سبيل المثال، عند استخدام Unity IAP Purchaser Script، يمكنك تغيير StandardPurchaseModule الذي يتم تمريره إلى أداة إنشاء عمليات الشراء داخل التطبيق لاستخدام Google.Play.Billing.GooglePlayStoreModule:

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

إذا كانت لعبتك تستخدم نص الشراء نفسه على منصات متعددة، يجب إضافة عملية التحقّق من النظام الأساسي للتأكّد من أنّ Unity ستستمر في استخدام حلّها الخاص لعمليات الشراء داخل التطبيق على المنصات الأخرى:

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

إذا كنت تنشر لعبتك على متاجر تطبيقات Android أخرى غير "متجر Google Play"، عليك استبدال عملية تنفيذ ميزة "الشراء داخل التطبيق" التلقائية في Unity عند اختيار "متجر Google Play" فقط:

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

تنفيذ ميزات Google Play Billing Library في لعبتك

يُوسّع المكوّن الإضافي لخدمة "الفوترة في Google Play" خدمات Unity IAP، ما يتيح لك استخدام IDEمَثيل Unity APIs لإدارة سير العمل الشائع للشراء. يُرجى العِلم أنّ هناك بعض التغييرات البسيطة في سلوك واجهة برمجة التطبيقات بسبب الاختلافات بين Google Play Billing Library وتنفيذ ميزة IAP العادي في Unity لمتاجر التطبيقات الأخرى. إذا كنت مبتدئًا في استخدام واجهات برمجة تطبيقات Unity IAP، يمكنك الاطّلاع على القسم "إنشاء نص شراء" في الدليل التعليمي لـ Unity IAP للاطّلاع على مثال على كيفية تنفيذ مسارات الشراء الأساسية.

تتضمّن Google Play Billing Library أيضًا بعض الميزات الفريدة لمتجر Google Play. ويمكنك الوصول إلى هذه الميزات من خلال واجهة موسّعة. توضّح باقي أقسام هذا القسم كيفية تنفيذ ميزات "مكتبة الفوترة في Google Play" المميزة هذه في لعبتك.

تفعيل عمليات الشراء المؤجّلة

يتيح Google Play عمليات الشراء المؤجلة، والتي تُعرف أيضًا باسم المعاملات في انتظار المراجعة أو عمليات الشراء في انتظار المراجعة، حيث يمكن للمستخدمين إنشاء عملية شراء وإكمالها لاحقًا باستخدام النقود في المحال.

لتفعيل عمليات الشراء المؤجلة، استخدِم أداة إنشاء عمليات الشراء داخل التطبيق لتعديل إعدادات وحدتك من خلال استدعاء طريقة 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.
    });

إرسال أرقام تعريف الحسابات المشوشة إلى Google Play

يمكنك إرسال أرقام تعريف حسابات المستخدمين المشوشة إلى Google Play لتسهيل رصد حالات إساءة الاستخدام، مثل رصد ما إذا كانت العديد من الأجهزة تُجري عمليات شراء على الحساب نفسه في فترة زمنية قصيرة.

لتمرير رقم تعريف حساب مشوَّه، استخدِم طريقة SetObfuscatedAccountId() من Extensions 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);

إرسال أرقام تعريف الملفات الشخصية المشفَّرة إلى Google Play

يمكنك إرسال معرّف ملف شخصي مشوّه إلى Google Play لتسهيل رصد عمليات النصب، مثل رصد ما إذا كانت العديد من الأجهزة تُجري عمليات شراء على الحساب نفسه في فترة زمنية قصيرة. يشبه ذلك إرسال معرّف حساب مستخدم مشوَّه. في كلتا الحالتَين، يمثّل المعرّف مستخدمًا واحدًا، ولكنّ معرّف الملف الشخصي يتيح لك تحديد مستخدم واحد بشكل فريد على مستوى ملفات شخصية متعددة يمتلكها في تطبيق واحد. بعد إرسال معرّف ملف شخصي مشوّه إلى Google Play، يمكنك استرجاع هذا المعرّف لاحقًا في إيصال الشراء.

لتمرير معرّف ملف شخصي مشوَّه، استخدِم ملف APK لإنشاء تطبيقات التفاعُل مع التطبيقات (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);

تأكيد تغييرات أسعار الاشتراكات

يتيح لك Google Play تغيير سعر اشتراك نشط. على مستخدمي اللعبة تأكيد أي تغيير في السعر قبل أن يسري التغيير. ل مطالبة المستخدمين بتأكيد تغيير السعر في اشتراكاتهم، يمكنك استدعاء الأسلوب 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.
    });

تغييرات في سلوك Unity API

عند استخدام المكوّن الإضافي "الفوترة في Google Play"، تعمل معظم واجهات برمجة التطبيقات بالطريقة نفسها التي تعمل بها واجهة برمجة التطبيقات لنظام الفوترة داخل التطبيقات العادية من Unity في متاجر التطبيقات الأخرى. ومع ذلك، هناك بعض الحالات التي ستتصرف فيها واجهات برمجة التطبيقات بشكل مختلف. يصف هذا القسم اختلافات السلوك هذه.

تحميل المطوّر غير متوافق

أوقف Google Play نهائيًا حمولة المطوّر، وسيستبدلها ببدائل أكثر صلة بالسياق وذات مغزى. لهذا السبب، لن يكون حمولة المطوّر متاحًا. لمزيد من المعلومات عن البدائل، يُرجى الاطّلاع على الصفحة حول حمولة المطوّر.

يمكنك مواصلة استخدام الواجهات نفسها التي تحدّدها عملية تنفيذ ميزة "IAP" العادية في Unity لمتاجر التطبيقات الأخرى، بما في ذلك IStoreController. عند بدء عملية شراء، سيظل بإمكانك استخدام IStoreController واستدعاء الطريقة InitiatePurchase():

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

ومع ذلك، لن يتم تطبيق أيّ حمولة ترسلها (لن تظهر في الإشعار النهائي).

فئة SubscriptionManager غير متوافقة

توفّر Unity IAP فئة SubscriptionManager لإدارة الاشتراكات. لا تتوفّر هذه الفئة لأنّ عملية تنفيذ IAP العادية في Unity تستخدِم الحمولة البرمجية للمطوّر. سيظل بإمكانك إنشاء هذه الفئة، ولكن قد تتلقّى بيانات غير موثوقة عند استخدام أي من methods مثبّتة في الفئة.

هناك تغييرات طفيفة في واجهة برمجة التطبيقات في UpdateSubscription

لا يتيح المكوّن الإضافي لنظام الفوترة في Google Play استخدام الطريقتَين SubscriptionManager.UpdateSubscription() و SubscriptionManager.UpdateSubscriptionInGooglePlayStore() لترقية اشتراكاتك وخفض فئتها. إذا كانت لعبتك تستدعي هذه الطرق، يتم طرح GooglePlayStoreUnsupportedException.

توفّر مكتبة "الفوترة في Google Play" واجهة برمجة تطبيقات بديلة لاستخدامها بدلاً من هذه ال methods. لترقية اشتراك أو الرجوع إلى إصدار سابق منه، يمكنك استدعاء UpdateSubscription() باستخدام وضع تقسيم التكلفة على أساس تناسبي:

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

يمكنك إما تضمين طلب استدعاء هذه الطريقة في عملية التحقّق من النظام الأساسي أو في كتلة معالجة الأخطاء عند رصد GooglePlayStoreUnsupportedException.

لمزيد من المعلومات والأمثلة حول كيفية استخدام وضع تقسيم الرسوم، يُرجى الاطّلاع على مقالة ضبط وضع تقسيم الرسوم.