الدروس
بيع عنصر
نسخ الصفحة
بيع شيء في تطبيقك مقابل $LIA، من البداية إلى النهاية. ورقة الدفع في صفحتك، ثم تأكيد التسليم على خادمك، دون فقدان أي شيء إذا تم إعادة تحميل الصفحة.
أنت'سوف تبيع "3 حياة إضافية" لـ 5 LIA. الشخص يدفع على Lia'ورقة المشارك، يتحقق خادمك من الرسوم باستخدام Lia، ويضيف الأرواح، ويعتبر الرسوم مُسلَّمة.
#1. أضف المنتج
اسأل فريق Lia لإضافة منتج إلى تطبيقك: معرّف extra-lives, الاسم "3 حياة إضافية", سعر 5. يمكن لخادمك التحقق منه'هنا:
curl https://api.lialabs.org/api/apps/v1/products -H "Authorization: Bearer $LIA_KEY"#2. في صفحتك: ادفع، ثم أخبر خادمك
async function buyExtraLives() {
let charge;
try {
charge = await Lia.pay("extra-lives");
} catch (error) {
if (error.code === "cancelled") return; // they changed their mind
Lia.toast("Couldn't open the payment", { tone: "error" });
return;
}
await deliver(charge.chargeId);
}
// Your server checks the charge and gives the lives. Safe to call twice for one charge.
async function deliver(chargeId) {
const { session } = await Lia.session();
const res = await fetch("/api/deliver", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ session, chargeId }),
});
if (!res.ok) return Lia.toast("We'll add it as soon as we can", { tone: "error" });
const { lives } = await res.json();
showLives(lives);
Lia.haptic("success");
}#3. على خادمك: تحقق، وقدم، وعلّمها
import { lia } from "./lia.js"; // the helper from the Server API page
app.post("/api/deliver", async (req, res) => {
// Who is asking: from Lia, not from the page.
const { valid, playerId } = await lia("POST", "/session/verify", { session: req.body.session });
if (!valid) return res.status(401).json({ error: "session" });
// Is this charge real, paid, and theirs?
let charge;
try {
({ charge } = await lia("GET", `/charges/${encodeURIComponent(req.body.chargeId)}`));
} catch (error) {
return res.status(404).json({ error: "no_charge" });
}
if (charge.playerId !== playerId) return res.status(403).json({ error: "not_yours" });
if (charge.status === "refunded") return res.status(409).json({ error: "refunded" });
// Give it once, keyed on the charge id (a second call finds it already given).
const lives = await db.grantOnce(charge.id, playerId, () => db.addLives(playerId, 3));
// Then tell Lia it's delivered (safe to repeat).
await lia("POST", `/charges/${charge.id}/deliver`);
res.json({ lives });
});الأجزاء المهمة:
- اللاعب يأتي من
/session/verify, أبداً من الصفحة. - الرسوم تأتي من
GET /charges/:id: لاعبه، منتجه وحالته هي Lia's. - المنح مرة واحدة لكل معرف دفع, في قاعدة بياناتك الخاصة، لذلك يمكن إعادة المحاولة، والويب هوك والصفحة يمكن'لحدوث
- توصيل بعد منحه. إذا مات خادمك بين الاثنين، يبقى الدفع
paidوأنت'سوف تراه مرة أخرى (أدنى)، وفحصك مرة واحدة لكل شحن يمنع منحًا مزدوجة.
#4. لا تفقد واحدة أبدًا
يمكن للصفحة إعادة التحميل أو فقدان الاتصال بين الدفع وسيرفرك. تابع عندما يفتح تطبيقك، وعندما يصل دفع بدون pay() في الانتظار:
Lia.init().then(async function () {
Lia.ready();
for (const charge of await Lia.charges()) await deliver(charge.chargeId);
});
Lia.onCharge(function (charge) { deliver(charge.chargeId); });#5. أو قم بتوصيله من خلال ويب هوك
إذا قام خادمك بإعطاء العناصر دون الصفحة (مثل إضافة عملات إلى حساب)، استخدم charge.paid الويب هوك كذلك. تحقق من الرسوم مع GET /charges/:id, منح مرة واحدة لكل معرف شحنة، ثم تسليم. مع الصفحة والويب هوك، whichever يصل أولاً يتم تسليمه والآخر يجد أنه تم.
#متى يمكنك'لإيصال
إذا كان ما بعته يمكن'ت يتم إعطاؤها (تم بيعها، الحساب غير موجود)، ارجع $LIA:
await lia("POST", `/charges/${charge.id}/refund`);الشخص يحصل على السعر الكامل مرة أخرى و يمكن أن يتم إرجاع الرسوم'ت يتم توصيلها. أخبرهم في صفحتك.
#جربه
مع مفتاح الاختبار الخاص بك وتطبيقك في الاختبار، اشترِه كمُختبر: تقول الصفحة 'اختبار'، ولا توجد حركات $LIA، وكل شيء آخر يحدث بالفعل. انظر الاختبار.
تم الترجمة تلقائيًا. الإنجليزية هي مصدر الحقيقة. اقرأ باللغة الإنجليزية