Получение вебхуков Xsolla

В процессе обработки покупки Xsolla отправляет вебхуки о наступлении различных событий (например, об отмене платежа, подтверждении состава корзины). Вы можете использовать эти вебхуки, чтобы:

  • начислять покупки в инвентарь игрока, если вы используете собственное или стороннее решение;
  • реализовать собственную логику верификации и обработки заказа для логирования информации, начисления наград, предоставления скидок за заказ и т. д.

Для получения вебхуков на стороне BaaS-сервиса добавьте в проект готовые функции, следуя инструкциям для Firebase и PlayFab.

Добавление облачной функции в проект Firebase

  1. Инициализируйте свой проект Firebase.
  2. Импортируйте функцию получения вебхуков, где <WebhookSecretKey>Секретный ключ проекта, который можно найти в Личном кабинете в разделе Настройки проекта > Вебхуки.

Код функции получения вебхуков:

Copy
Full screen
Small screen
const webhookSecretKey = "<WebhookSecretKey>";

exports.webhook = functions.https.onRequest((request, response) => {
  const requestRawBody = request.rawBody.toString("utf-8");
  const crypto = require("crypto");
  const sig = "Signature " + crypto
      .createHash("sha1")
      .update(requestRawBody + webhookSecretKey)
      .digest("hex");
  if (request.headers.authorization !== sig) {
    response.status(401).send();
    return;
  }

  // TODO Replace this block with your game's logic for purchases handling
  switch (request.body.notification_type) {
    case "order_paid": {
      const userId = request.body.user.external_id;
      const skus = request.body.items.map(function(it) {
        return it.sku;
      }).join(", ");
      const price =
          `${request.body.order.amount} ${request.body.order.currency}`;
      functions.logger.log(
          "Order Paid\n",
          `A user ${userId} has just paid ${price} for ${skus}\n`,
          "Full Data\n",
          request.body
      );
      break;
    }
    case "order_canceled": {
      const userId = request.body.user.external_id;
      const orderId = request.body.order.id;
      functions.logger.log(
          "Order Canceled\n",
          `A user ${userId} has just canceled order ${orderId}\n`,
          "Full Data\n",
          request.body
      );
      break;
    }
  }

  response.status(204).send();
});
  1. Реализуйте логику обработки вебхуков.
Примечание
Функция рассчитана для работы с вебхуками о получении состава корзины при покупке и об отмене платежа. Вы можете самостоятельно реализовать обработку других вебхуков о событиях на странице оплаты.
  1. Запустите функцию в боевой среде в соответствии с примером.
  2. В консоли Firebase перейдите в раздел Build > Functions и скопируйте URL функции получения вебхуков.​
  3. Откройте проект в Личном кабинете.
  4. Перейдите в раздел Настройки проекта > Вебхуки.
  5. В поле Сервер для вебхуков укажите URL функции получения вебхуков.

Добавление облачного скрипта в проект PlayFab

Примечание
Сами по себе облачные скрипты PlayFab не поддерживают функции с триггерами HTTP, поэтому для реализации получения вебхуков используются функции Azure.

  1. Подготовьте среду разработки для работы с функциями Azure.
  2. Следуя примеру, добавьте функцию получения вебхуков, где <WebhookSecretKey>Секретный ключ проекта, который можно найти в Личном кабинете в разделе Настройки проекта > Вебхуки.

Код функции получения вебхуков:

Copy
Full screen
Small screen
const webhookSecretKey = "<WebhookSecretKey>";

module.exports = async function (context, request) {
    const requestRawBody = request.rawBody.toString("utf-8");
    const crypto = require("crypto");
    const sig = "Signature " + crypto
        .createHash("sha1")
        .update(requestRawBody + webhookSecretKey)
        .digest("hex");
    if (request.headers.authorization !== sig) {
        context.res = {
            status: 401
        };
        return;
    }

    // TODO Replace this block with your game's logic for purchases handling
    switch (request.body.notification_type) {
        case "order_paid": {
            const userId = request.body.user.external_id;
            const skus = request.body.items.map(function (it) {
                return it.sku;
            }).join(", ");
            const price =
                `${request.body.order.amount} ${request.body.order.currency}`;
            context.log(
                "Order Paid\n" +
                `A user ${userId} has just paid ${price} for ${skus}\n` +
                "Full Data\n" +
                JSON.stringify(request.body)
            );
            break;
        }
        case "order_canceled": {
            const userId = request.body.user.external_id;
            const orderId = request.body.order.id;
            context.log(
                "Order Canceled\n" +
                `A user ${userId} has just canceled order ${orderId}\n` +
                "Full Data\n" +
                JSON.stringify(request.body)
            );
            break;
        }
    }

    context.res = {
        status: 204
    };
}
  1. Реализуйте логику обработки вебхуков.
Примечание
Функция рассчитана для работы с вебхуками о получении состава корзины при покупке и об отмене платежа. Вы можете самостоятельно реализовать обработку других вебхуков о событиях на странице оплаты.
  1. Запустите функцию в боевой среде.
  2. Cкопируйте URL функции.
  3. Перейдите к настройкам проекта в PlayFab.
  4. Зарегистрируйте функцию облачного скрипта.
  5. ​​Откройте проект в Личном кабинете.
  6. Перейдите в раздел Настройки проекта > Вебхуки.
  7. В поле Сервер для вебхуков укажите URL функции получения вебхуков.
Была ли статья полезна?
Спасибо!
Что может сделать страницу еще лучше? Сообщение
Жаль, что так произошло
Расскажите, почему статья не была полезна. Сообщение
Спасибо за обратную связь!
Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
Последнее обновление: 22 января 2024

Нашли опечатку или ошибку в тексте? Выделите ее и нажмите Ctrl+Enter.

Сообщите о проблеме
Мы постоянно улучшаем качество нашей документации. Ваш отзыв поможет нам в этом.
Укажите email-адрес, чтобы мы могли связаться с вами
Спасибо за обратную связь!