LiaDesarrolladores

Guías

Vende algo en tu app por $LIA, de extremo a extremo. La hoja de pago en tu página, luego confirma y entrega en tu servidor, sin perder nada si la página se recarga.

Tú'vender "3 vidas extra" para 5 LIA. La persona paga en Lia's hoja, su servidor comprueba el cargo con Lia, agrega vidas y marca el cargo como entregado.

#1. Agregar el producto

Pida al equipo de Lia que agregue un producto a su app: id extra-lives, nombre "3 vidas extra", precio 5. Su servidor puede verificarlo'ahí:

curl https://api.lialabs.org/api/apps/v1/products -H "Authorization: Bearer $LIA_KEY"

#2. En su página: pague, luego dígale a su servidor

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. En tu servidor: comprueba, entrega, márcalo

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 });
});

Las partes importantes:

  • El jugador proviene de /session/verify, nunca desde la página.
  • La tarifa proviene de GET /charges/:id: su reproductor, producto y estado son Lia's.
  • Conceder una vez por id de carga, en su propia base de datos, así que un reintento, un webhook y la página pueden'dárselos dos veces. Hágalo en una transacción con el registro del identificador de cargo.
  • Entrega después de conceder. Si su servidor falla entre las dos, el cargo permanece paid y tú'lo verá de nuevo (abajo), y su verificación una vez por carga evita un doble regalo.

#4. Nunca pierdas uno

La página puede recargarse o perder su conexión entre pagar y tu servidor. Atrás cuando tu aplicación se abra, y cuando un cargo llegue sin un pay() esperando:

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. O entrega desde un webhook

Si su servidor entrega artículos sin la página (añadiendo monedas a una cuenta, por ejemplo), use la charge.paid webhook también. Comprueba la carga con GET /charges/:id, otorgar una vez por ID de carga, y luego entregar. Con la página y el webhook, el que llegue primero se entrega y el otro lo encuentra ya hecho.

#Cuándo puedes'entregar

Si algo que vendiste puede't ser dado (se agotó, la cuenta se fue), devuelva el $LIA:

await lia("POST", `/charges/${charge.id}/refund`);

La persona recibe el precio completo de vuelta y un cargo reembolsado puede't ser entregado. Díselo en su página.

#Pruébalo

Con tu clave de prueba y tu app en prueba, cómprala como probador: la hoja dice Prueba, no hay movimientos de $LIA, y todo lo demás ocurre de verdad. Ver Pruebas.

Traducido automáticamente. El inglés es la fuente de verdad. Leer en inglés

Escribe para buscar en cada página, método y punto final.