Guides
Vendre un article
Copier la page
Vendez un article dans votre application pour $LIA, du début à la fin. La feuille de paiement dans votre page, puis confirmez et livrez sur votre serveur, sans perte si la page se recharge.
Vous'je vendrai "3 vies supplémentaires" pour 5 LIA. La personne paie sur Lia'la feuille, votre serveur vérifie la charge avec Lia, ajoute les vies, et marque la charge comme livrée.
#1. Ajouter le produit
Demandez à l'équipe Lia d'ajouter un produit à votre application : identifiant extra-lives, nom "3 vies supplémentaires", prix 5. Votre serveur peut le vérifier'il y a :
curl https://api.lialabs.org/api/apps/v1/products -H "Authorization: Bearer $LIA_KEY"#2. Dans votre page : payer, puis dire à votre serveur
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. Sur votre serveur : vérifiez, envoyez, marquez-le
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 });
});Les parties importantes :
- Le joueur vient de
/session/verify, jamais depuis la page. - La charge provient de
GET /charges/:id: son lecteur, produit et statut sont Lia's. - Attribution d'un seul crédit par identifiant de charge, dans votre propre base de données, donc une nouvelle tentative, un webhook et la page peuvent'ne le donnez pas deux fois. Faites-le en une seule transaction en enregistrant l'ID de la charge.
- Livraison après accord. Si votre serveur tombe entre les deux, la charge reste
paidet vous'vous le verrez à nouveau (ci-dessous), et votre vérification une fois par charge empêche un double crédit.
#4. Ne perdez jamais un seul
La page peut se recharger ou perdre sa connexion entre le paiement et votre serveur. Rattrapez-vous lorsque votre application s'ouvre, et lorsque une charge arrive sans pay() en attente :
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. Ou envoyez depuis un webhook
Si votre serveur fournit des articles sans la page (ajouter des pièces à un compte, par exemple), utilisez le charge.paid webhook aussi. Vérifiez la charge avec GET /charges/:id, octroyer une fois par identifiant de charge, puis livrer. Avec la page et le webhook, le premier qui arrive est livré et l'autre constate qu'il est déjà fait.
#Quand vous pouvez'ne pas livrer
Si quelque chose que vous avez vendu peut'ne pas être donné (il est épuisé, le compte a disparu), rendez le $LIA :
await lia("POST", `/charges/${charge.id}/refund`);La personne récupère le prix intégral et un remboursement peut'ne pas être livré. Dites-le-leur sur votre page.
#Testez-le
Avec votre clé de test et votre application en test, achetez-la en tant que testeur : la feuille indique Test, aucun $LIA ne se déplace, et tout le reste se passe en vrai. Voir Tests.
Traduit automatiquement. L'anglais est la source de vérité. Lire en anglais