LiaРазработчики

Руководства

Продайте что-нибудь в вашем приложении за $LIA, от начала до конца. Таблица оплаты на вашей странице, затем подтвердите и доставьте на вашем сервере, ничего не теряя, если страница перезагружается.

Вы'вы продадите "3 дополнительных жизней" для 5 LIA. Человек платит на Lia'доля, ваш сервер проверяет оплату с помощью Lia, добавляет жизни и отмечает оплату как выполненную.

#1. Добавьте продукт

Спросите у команды Lia добавить продукт в ваше приложение: идентификатор extra-lives, имя "3 дополнительных жизней", цена 5. Ваш сервер может проверить это'там:

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

#2. На вашей странице: оплатите, а затем скажите своему серверу

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. На вашем сервере: проверьте, доставьте, отметьте

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

Важные части:

  • Игрок приходит из /session/verify, никогда не с страницы.
  • Сбор средств происходит от GET /charges/:id: его игрок, продукт и статус Lia's.
  • Выдать один раз на идентификатор оплаты, в вашей собственной базе данных, так что повторная попытка, вебхук и страница могут'не давать дважды. Сделайте это в одной транзакции с записью идентификатора платежа.
  • Доставка после предоставления. Если ваш сервер упадет между двумя, оплата останется paid и вы'вы увидите это снова (ниже), и ваша проверка один раз в зарядку предотвращает двойную выплату.

#4. Никогда не теряйте один

Страница может перезагрузиться или потерять соединение между оплатой и вашим сервером. Догоняйте, когда ваше приложение открывается, и когда платеж приходит без pay() ожидание:

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. Или доставьте через вебхук

Если ваш сервер предоставляет предметы без страницы (добавляет монеты на счет, например), используйте charge.paid вебхук также. Проверьте оплату с GET /charges/:id, выдается один раз на идентификатор зарядки, затем доставляется. С обеими страницей и вебхуком, какой бы ни пришел первым, доставляется, а другой находит его выполненным.

#Когда вы можете'не доставлять

Если то, что вы продали, может't быть получено (товар распродан, аккаунт удален), верните $LIA:

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

Человек получает полную цену обратно, и возвращенная оплата может't быть доставлено. Скажите им на вашей странице.

#Проверьте это

С вашим тестовым ключом и вашим приложением в тестовом режиме, купите его как тестировщик: лист говорит «Тест», нет $LIA операций, и всё остальное происходит в реальности. См. Тестирование.

Автоматически переведено. Английский — источник истины. Читать на английском

Введите, чтобы искать по каждой странице, методу и точке окончания.