Panduan
Jual item
Salin halaman
Jual sesuatu di aplikasi Anda untuk $LIA, end to end. Lembar pembayaran di halaman Anda, lalu konfirmasi dan kirimkan di server Anda, tanpa kehilangan apa pun jika halaman dimuat ulang.
Anda'akan menjual "3 nyawa tambahan" untuk 5 LIA. Orang tersebut membayar pada Lia'bagian berbagi, server Anda memeriksa pembayaran dengan Lia, menambahkan nyawa, dan menandai pembayaran sebagai terkirim.
#1. Tambahkan produk
Tanyakan kepada tim Lia untuk menambahkan produk ke aplikasi Anda: id extra-lives, nama "3 nyawa tambahan", harga 5. Server Anda dapat memeriksanya'ada di sini:
curl https://api.lialabs.org/api/apps/v1/products -H "Authorization: Bearer $LIA_KEY"#2. Di halaman Anda: bayar, lalu beri tahu server Anda
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. Di server Anda: periksa, kirim, tandai
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 });
});Bagian penting:
- Pemain berasal dari
/session/verify, tidak pernah dari halaman. - Biaya berasal dari
GET /charges/:id: pemainnya, produknya, dan statusnya adalah Lia's. - Bantuan sekali per id pembayaran, di database Anda sendiri, jadi retry, webhook, dan halaman dapat'tidak memberikannya dua kali. Lakukan dalam satu transaksi dengan merekam id pembayaran.
- Kirim setelah memberikan. Jika server Anda mati di antara dua, biaya tetap
paiddan Anda'Anda akan melihatnya lagi (di bawah), dan pemeriksaan satu kali per pengisian mencegah pemberian ganda.
#4. Jangan pernah kehilangan satu pun
Halaman dapat memuat ulang atau kehilangan koneksi antara pembayaran dan server Anda. Menyusul saat aplikasi Anda dibuka, dan saat pembayaran tiba tanpa pay() menunggu:
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. Atau kirim dari webhook
Jika server Anda memberikan item tanpa halaman (menambahkan koin ke akun, misalnya), gunakan charge.paid webhook juga. Periksa biaya dengan GET /charges/:id, berikan sekali per id charge, lalu kirimkan. Dengan halaman dan webhook, mana yang datang lebih dulu akan dikirimkan dan yang lain menemukannya sudah selesai.
#Kapan Anda bisa'tidak mengirimkan
Jika sesuatu yang Anda jual bisa't diberikan (habis, akun telah hilang), kembalikan $LIA:
await lia("POST", `/charges/${charge.id}/refund`);Orang tersebut mendapatkan harga penuh kembali dan biaya pengembalian dapat't akan dikirimkan. Beri tahu mereka di halaman Anda.
#Uji itu
Dengan kunci uji Anda dan aplikasi Anda dalam mode uji, beli sebagai penguji: lembaran tersebut menyatakan Uji, tidak ada pergerakan $LIA, dan semuanya terjadi secara nyata. Lihat Pengujian.
Diterjemahkan otomatis. Bahasa Inggris adalah sumber kebenaran. Baca dalam Bahasa Inggris