الانتقال إلى المحتوى الرئيسي
العنصر المدفوع بمال حقيقي هو عنصر متجر يدفع اللاعب ثمنه في App Store أو Google Play. يتقاضى المتجر المبلغ من اللاعب، ثم يسأل Flock المتجرَ هل عملية الشراء حقيقية، ثم يسلّم العنصر. وتستدعي لعبتك الدالة نفسها التي تستدعيها لأي عنصر: Shop.PurchaseAsync(item.Id).
لا تُنهى عملية الشراء في المتجر إلا بعد أن يسلّم Flock العنصر، لذا لا يُضيع تعطّلُ اللعبة أو انقطاعُ الاتصال بينهما ما دفعه اللاعب: يعيد المتجر عملية الشراء عند التشغيل التالي فيسلّمها Flock حينها. وتُسلَّم عملية الشراء الواحدة في المتجر مرة واحدة، مهما أُرسلت من مرات.
تحتاج المشتريات بالمال الحقيقي إلى حزمة تطوير Flock لـ Unity بالإصدار 1.98.0 أو أحدث، وإلى Unity IAP 5 (com.unity.purchasing 5.x) في المشروع. ولا تحتاج مشتريات المحفظة إلى أيٍّ منهما: راجع المتاجر والمخزون. وعلى Android، اجعل Minimum API Level 23 أو أعلى (Player Settings > Other Settings): فمكتبة Google Play Billing في Unity IAP 5 تحتاجه، ومشروع Unity 2021.3 يبدأ بـ 22، فيتوقف بناؤه بخطأ في دمج ملف البيان.

ما الذي تُعدّه

  1. اربط كل متجر بـ Flock من لوحة التحكم، بمفاتيح لعبتك الخاصة.
  2. سعّر العناصر بمال حقيقي وأعطِ كلًّا منها معرّف منتجه في المتجر.
  3. أنشئ المنتجات في المتجر بتلك المعرّفات.
  4. اربط المتجر داخل لعبتك مرة واحدة عند البدء.
  5. تحقّق من الإعداد من داخل اللعبة.
1

اربط المتاجر بـ Flock

افتح Monetization > Payments في لوحة تحكم Flock واربط كل متجر تبيع فيه. يستخدم Flock هذه المفاتيح ليسأل المتجر عن عملية الشراء، ولا تصل أبدًا إلى جهاز اللاعب.
لإنشاء حساب الخدمة:
  1. في Google Cloud console، وفي أي مشروع، فعّل Google Play Android Developer API.
  2. أنشئ هناك حساب خدمة (service account)، وأضف إليه مفتاح JSON. يُنزَّل المفتاح ملفًّا.
  3. في Google Play Console، تحت Users and permissions، ادعُ عنوان البريد الإلكتروني لحساب الخدمة، وامنحه تطبيقك، واسمح له بـ View financial data وManage orders and subscriptions.
  4. الصق النص الكامل لملف JSON في Service account JSON.
قد تستغرق Google وقتًا لتقبل حساب خدمة جديدًا. وإلى أن تقبله، يخبرك التحقّق من الإعداد أدناه بأن المتجر رفض مفاتيحك. وفي اختبارنا، سرى مفعوله بعد دقيقة من إعادة حفظ أحد منتجات التطبيق في Play Console.
وتعرض الصفحة أيضًا عنوان إشعارات لكل متجر. أعطِه للمتجر (App Store Server Notifications في App Store Connect، وreal-time developer notifications في Google Play) ليعلم Flock بعمليات الاسترداد.
2

سعّر العناصر بمال حقيقي

يكون العنصر مدفوعًا بمال حقيقي حين تكون عملته إحدى Real Currencies في إعدادات العملات لإصدار لعبته. ويكون سعره بأصغر وحدة للعملة: 399 بعملة SAR تعني SAR 3.99.وعلى كل عنصر من هذه العناصر، تحت Store product IDs، أدخل معرّف منتجه لكل متجر، تمامًا كما يكتبه المتجر. ويحدّد نوع العنصر نوع المنتج في المتجر:
3

أنشئ المنتجات في المتجر

أنشئ كل منتج بالمعرّف نفسه: في Google Play Console تحت Monetize > Products > One-time products، وفي App Store Connect تحت In-App Purchases لتطبيقك. ثم فعّله. والسعر الذي يراه اللاعب هو ما يحدّده المتجر لبلده.
4

اربط المتجر داخل لعبتك

اربطه مرة واحدة بعد بدء حزمة التطوير، واحتفظ بالاتصال طوال الجلسة. وعلى الهاتف يُعثر على المتجر تلقائيًا، وعلى Windows وmacOS وLinux وWebGL يربط الاستدعاء نفسه الدفع عبر صفحة ويب بدلًا منه (الدفع عبر الويب).
ومن الآن تشتري Shop.PurchaseAsync العناصر المدفوعة بمال حقيقي عبر هذا الاتصال. ومن دونه، ترفض العنصر المدفوع بمال حقيقي قبل إرسال أي شيء، وتطلب منك ربط المتجر.
5

تحقّق من الإعداد

تسأل CheckSetupAsync المتجرَ وخادمَ Flock هل كل شيء في مكانه، دون شراء أي شيء. وتحتاج إلى لاعب مسجَّل دخوله، وترمي FlockAuthException من دونه، لذا شغّلها من زر للمطوّر بعد تسجيل الدخول أثناء الإعداد.

اعرض سعر المتجر

اعرض السعر الذي يعطيه المتجر، وهو بعملة اللاعب ومع ضرائبه، بدل سعر العنصر في Flock.
وتكون قيمة GetPrice هي null حين لا يجد المتجر المنتج. والأسعار في التعليق أمثلة فقط: فالنص هو نص المتجر نفسه. وفي الدفع عبر صفحة ويب يعطي GetPrice سعر العنصر نفسه، ولا تكون قيمته null أبدًا.

الشراء

كل الحالات باختصار: وإن ألغيتَ CancellationToken الخاص بالاستدعاء، تستمر عملية الشراء في المتجر، ويُبلغ عنها PurchaseCompleted بعد الدفع. وإن سجّل اللاعب خروجه ومربع حوار المتجر مفتوح، ينتهي الاستدعاء كذلك بالإلغاء، وتُسلَّم عملية الشراء في المتجر بعد الدفع إلى اللاعب الذي اشتراها عند تسجيل دخول لاحق، أو عبر استعادة المشتريات.

استعادة المشتريات

يستعيد اللاعب على هاتف جديد، أو بعد إعادة التثبيت، عناصره ذات المرة الواحدة بزر استعادة المشتريات. ابدأها من زر بعد أن يسجّل اللاعب الدخول إلى Flock: فمن دون لاعب مسجَّل دخوله ترمي RestoreAsync الاستثناء FlockAuthException. وفي App Store تطلب أيضًا من اللاعب تسجيل الدخول إلى المتجر.
وعملية الشراء التي سُلّمت من قبل لا تمنح شيئًا مرة أخرى. وتعود العناصر ذات المرة الواحدة إلى لاعب Flock الذي اشتراها، لذا يجب أن يسجّل اللاعب الدخول إلى حساب Flock نفسه (فتسجيل الدخول بالجهاز مرتبط بالجهاز؛ اربط الحساب ليحتفظ بمشترياته عبر الأجهزة). راجع ربط الحسابات.

مشتريات تنتهي لاحقًا

تنتهي بعض المشتريات بعد الاستدعاء: دفعة تُسوّى لاحقًا، أو عملية شراء قاطعها تعطّل أو انقطاع اتصال. يعيد المتجر كلًّا منها حين تتصل به اللعبة؛ وما إن يُسجّل اللاعب دخوله حتى يسلّمها Flock ويُبلغ عنها PurchaseCompleted. وما تعذّر فيه الوصول إلى Flock يُرسَل من جديد في التشغيل التالي، أو فورًا حين يضغط اللاعب استعادة المشتريات. اشترك في PurchaseCompleted قبل أن يحتاجه أي شيء آخر، واستخدمه لتحديث المتجر والمحفظة.

إيقاف بيع عنصر

اجعل العنصر، أو متجره، غير نشط في لوحة التحكم. فلا تعرضه قراءات المتجر للاعبين من فورها، ويتحقّق PurchaseAsync مع Flock قبيل نافذة المتجر مباشرة، فإن كانت اللعبة لا تزال تعرض العنصر رُفض الشراء بـ ShopItemNotForSale ولا يقتطع المتجر شيئًا. أما عملية الشراء التي دفعها اللاعب فتُسلَّم مع ذلك: إذ تحتفظ اللعبة بالمنتجات التي باعتها، فتُسلَّم عملية الشراء غير المكتملة لعنصر غير نشط عند التشغيل التالي، وتعيد الاستعادة العناصر التي تُشترى مرة واحدة.

اختبر قبل الإطلاق

  • في المحرّر، تحدّد منصة البناء ذلك: فإن اخترت Android أو iOS أجاب المتجر الوهمي لـ Unity IAP. وعلى منصة بناء أخرى، سمِّ المتجر الذي تختبر به: FlockStore.ConnectAsync(new FlockStoreOptions { PaymentProvider = PaymentProviders.GooglePlay }). ويعمل التحقّق من الإعداد هناك ويختبر مفاتيحك، لكن Flock يرفض مشتريات المتجر الوهمي، فتنتهي عملية الشراء في المحرّر دون تسليم.
  • Google Play: ارفع بناءً إلى مسار internal testing، وأضف المختبرين تحت License testing في Play Console، وثبّت اللعبة من رابط الاختبار في Play Store. ولا تُحتسب مشتريات المختبر.
  • App Store: استخدم مختبر Sandbox من App Store Connect على جهاز.

الإيرادات

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

حين يفشل شيء

يذكر Message لكل فشل ما الخطأ، وفي سطر Fix: كيف تصلحه. وهذه رموز عملية الشراء في المتجر:

Unity IAP 4

تحتفظ اللعبة التي تعمل بـ Unity IAP 4.x بشيفرة الشراء الخاصة بها، وتسلّم كل عملية شراء إلى Flock عبر Shop.RedeemStoreReceiptAsync، ولا تُنهيها في المتجر إلا بعد أن تعود. والملف Docs~/recipes/FlockUnityIap4Store.cs في حزمة التطوير نسخة جاهزة تنسخها.