الانتقال إلى المحتوى الرئيسي
في البناء الذي لا متجر هاتف فيه (Windows وmacOS وLinux وWebGL)، يُدفع ثمن العنصر بالمال الحقيقي عبر بوابة الدفع الخاصة بك: Stripe أو Tap أو Moyasar. يدفع اللاعب في صفحة البوابة داخل المتصفح، ويذهب المال مباشرة إلى حسابك لدى البوابة. وتستدعي لعبتك الدالة نفسها التي تستدعيها لأي عنصر: Shop.PurchaseAsync(item.Id).
لا يُسلَّم شيء حتى تؤكد البوابة الدفع. وتُغلَق عملية الدفع التي لم تُدفع بعد ساعة، ولا يُحتسب شيء.
يحتاج الدفع عبر صفحة ويب إلى حزمة تطوير Flock لـ Unity بالإصدار 1.98.0 أو أحدث، ولا يحتاج إلى أي حزمة أخرى. وعلى Android وiOS تدفع الاستدعاءات نفسها عبر متجر الهاتف بدلًا منه: راجع الشراء داخل التطبيق.
1

اربط بوابتك بـ Flock

افتح Monetization > Payments في لوحة تحكم Flock واربط البوابة التي تبيع عبرها بمفاتيحك الخاصة. تبقى المفاتيح على خادم Flock ولا تصل إلى جهاز اللاعب أبدًا. استخدم مفاتيح الاختبار في البوابة أثناء التطوير: تُعلَّم مشترياتها على أنها اختبار وتُستبعد من إيراداتك.
في Stripe، تحت Developers > Webhooks، أضف عنوانًا هو https://api-flock.qwacks.com/v1/shop/webhook/<your game id>/stripe مع هذه الأحداث: checkout.session.completed وcheckout.session.expired وpayment_intent.payment_failed وcharge.refunded وcharge.dispute.closed، ثم الصق سرّ توقيعه في Flock. ومن دونه يُسلَّم الدفع رغم ذلك، خلال نحو 15 دقيقة بدل أن يُسلَّم فورًا.يحتسب Stripe الدفع بعملة العنصر، ويرفض سعرًا أقل من أدنى مبلغ يحتسبه بعملة حسابك (لحساب يسوّي بالدرهم: 2.00 درهم).
الاسترداد أو النزاع الذي يُجرى في لوحة تحكم Stripe أو Moyasar نفسها لا يصل إلى Flock بعد: يبقى الشراء مدفوعًا، ويحتفظ اللاعب بما منحه.
اربط بوابة واحدة، أو سمِّ البوابة المستخدمة في اللعبة حين تكون أكثر من بوابة مفعّلة (أدناه).
2

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

سعّر العنصر بإحدى Real Currencies في إعداد العملات، كما تفعل لعنصر المتجر. والسعر هو ما تحتسبه البوابة: 799 بالريال تعني 7.99 ريال. ولا يحتاج العنصر إلى معرّف منتج في متجر للدفع عبر صفحة ويب.
3

اربطه في لعبتك

اربطه مرة واحدة بعد بدء حزمة التطوير. وفي بناءات Windows وmacOS وLinux وWebGL يربط FlockStore الدفع عبر صفحة ويب تلقائيًا:
تكون قيمة store.IsWebCheckout صحيحة في هذه البناءات، ويعطي store.GetPrice(item.Id).Text سعر العنصر نفسه لتعرضه؛ ولا تكون قيمة GetPrice هي null أبدًا في الدفع عبر صفحة ويب. ويُكتب الرقم بتنسيق جهاز اللاعب، فما SAR 7.99 إلا مثال على شكله.

الشراء

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

WebGL

لا يفتح المتصفح علامة تبويب جديدة إلا لوقت قصير بعد نقرة اللاعب. وتُفتح صفحة الدفع حالما تجهز عملية الدفع، بعد نحو ثانية ونصف من النقرة في اختباراتنا، وقد فتحها متصفح مبني على Chromium (Chrome وEdge). ويسمح Firefox بوقت مماثل، أما Safari فيسمح بنحو ثانية واحدة، فقد يحجب علامة التبويب. ولـ Safari، اعرض زر ادفع الآن خاصًا بك يفتح الصفحة فور النقر عليه:

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

اربط مفاتيح الاختبار في البوابة، ثم اشترِ بإحدى بطاقات الاختبار لديها (بطاقة Stripe 4242 4242 4242 4242 مع أي تاريخ مستقبلي وأي رمز تحقق؛ وبطاقات Tap وMoyasar في وثائقهما). تُسلَّم عملية الشراء التجريبية كأي عملية أخرى، وتُعلَّم على أنها اختبار، وتُستبعد من إيراداتك. واترك عملية دفع دون دفع لترى أنها تُغلق بحالة Expired بعد الساعة.

حين يفشل شيء

تقول Message لكل فشل ما الذي حدث، وكيف تصلحه في سطر Fix:.