LiaDesenvolvedores

Guias

Venda algo no seu app por $LIA, do início ao fim. A planilha de pagamento no seu site, depois confirme e entregue no seu servidor, sem perder nada se a página for recarregada.

Você'vender "3 vidas extras" para 5 LIA. A pessoa paga em Lia'folha, seu servidor verifica a cobrança com Lia, adiciona as vidas e marca a cobrança como entregue.

#1. Adicione o produto

Peça à equipe Lia para adicionar um produto ao seu app: id extra-lives, nome "3 vidas extras", preço 5. Seu servidor pode verificá-lo'aí:

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

#2. No seu página: pague, depois diga ao seu 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. No seu servidor: verifique, entregue, marque-o

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

As partes importantes:

  • O jogador vem de /session/verify, nunca a partir da página.
  • A cobrança vem de GET /charges/:id: seu jogador, produto e status são Lia's.
  • Conceda uma vez por ID de carga, no seu próprio banco de dados, então um retry, um webhook e a página podem'dê-o duas vezes. Faça isso em uma transação única com o registro do ID da cobrança.
  • Entregue após conceder. Se o seu servidor morrer entre os dois, a cobrança permanece paid e você'verá novamente (abaixo), e sua verificação uma vez por carga impedirá um dobro de concessão.

#4. Nunca perca nenhum

A página pode recarregar ou perder a conexão entre o pagamento e o seu servidor. Recupere quando o seu aplicativo for aberto, e quando uma cobrança chegar sem um 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. Ou entregue por meio de um webhook

Se o seu servidor der itens sem a página (adicionando moedas a uma conta, por exemplo), use o charge.paid webhook também. Verifique a cobrança com GET /charges/:id, conceda uma vez por ID de carga, depois entregue. Com a página e o webhook, o que chegar primeiro entrega e o outro encontra-o feito.

#Quando você puder'não entregar

Se algo que você vendeu puder'não seja dado (esgotou, a conta foi excluída), devolva o $LIA:

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

A pessoa recebe o preço total de volta e uma cobrança reembolsada pode'não seja entregue. Diga a eles na sua página.

#Teste-o

Com sua chave de teste e seu app em teste, compre-o como testador: a planilha diz Teste, nenhuma movimentação de $LIA, e tudo mais acontece de verdade. Veja Testando.

Traduzido automaticamente. O inglês é a fonte de verdade. Leia em inglês

Digite para pesquisar todas as páginas, métodos e endpoints.