LiaDéveloppeurs

Guides

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

shop.js
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

server.js
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 paid et 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

Tapez pour rechercher sur toutes les pages, méthodes et points de terminaison.