Использование Внутриигрового магазина с BaaS-авторизацией

Вы можете использовать Внутриигровой магазин для продажи внутриигровых товаров совместно с системой авторизации BaaS-сервисов. При этом сценарий взаимодействия будет следующим:

  1. Пользователь авторизуется в вашем приложении через систему авторизации BaaS-сервиса.
  2. BaaS-сервис запрашивает у серверов Иксоллы Pay Station access token, передавая идентификатор пользователя.
  3. Сервер Иксоллы возвращает Pay Station access token в BaaS-сервис.
  4. BaaS-сервис передает Pay Station access token приложению.
  5. Приложение использует Pay Station access token для взаимодействия с серверами Иксоллы с помощью API.

Для получения Pay Station access token добавьте в ваш проект готовые функции, следуя инструкциям для Firebase и PlayFab.

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

  1. Инициализируйте свой проект Firebase.
  2. Импортируйте функцию получения Pay Station access token, где:
    • <MerchantID>ID продавца, который можно найти в Личном кабинете в разделе Настройки проекта > Оповещения.
    • <ProjectID>ID проекта, который можно найти в Личном кабинете в разделе Настройки проекта > ID проекта.
    • <ApiKey>Ключ API, который можно найти в Личном кабинете в разделе Настройки компании > Ключ API.

Код функции получения Pay Station access token:

Copy
Full screen
Small screen
const merchantId = "<MerchantID>";
const projectId = "<ProjectID>";
const apiKey = "<ApiKey>";

exports.getXsollaAccessToken = functions.https.onCall((data, context) => {
  if (!context.auth) {
    throw new functions.https.HttpsError(
        "failed-precondition",
        "The function must be called while authenticated."
    );
  }

  const userId = context.auth.uid;
  const userEmail = context.auth.token.email || null;

  const authHeader = Buffer.from(`${merchantId}:${apiKey}`).toString("base64");

  const postData = JSON.stringify(
      {
        "user": {
          "id": {
            "value": userId,
          },
          "email": {
            "value": userEmail,
          },
        },
        "settings": {
          "project_id": Number(projectId),
        },
      }
  );

  const options = {
    hostname: "api.xsolla.com",
    port: 443,
    path: `/merchant/v2/merchants/${merchantId}/token`,
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": postData.length,
      "Authorization": `Basic ${authHeader}`,
    },
  };

  return new Promise( (resolve, reject) => {
    const req = https.request(options, (res) => {
      if (res.statusCode != 200) {
        reject(
            new functions.https.HttpsError("internal", "Token not received")
        );
      }
      let body = [];
      res.on("data", (d) => {
        body.push(d);
      });
      res.on("end", () => {
        try {
          body = JSON.parse(Buffer.concat(body).toString());
        } catch (e) {
          reject(
              new functions.https.HttpsError("internal", "Malformed response")
          );
        }
        resolve({
          "token": body.token,
        });
      });
    });
    req.on("error", (e) => {
      reject(new functions.https.HttpsError("internal", "Internal error"));
    });

    req.write(postData);
    req.end();
  });
});

  1. Запустите функцию в боевой среде в соответствии с примером.
  2. Добавьте клиентскую логику для вызова функции из приложения. Укажите имя функции — getXsollaAccessToken, передача параметров не требуется.
  3. В приложении реализуйте методы для работы с API самостоятельно или воспользуйтесь SDK Иксоллы.

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

  1. Создайте JS-файл с кодом функции получения Pay Station access token, где:
    • <MerchantID>ID продавца, который можно найти в Личном кабинете в разделе Настройки проекта > Оповещения.
    • <ProjectID>ID проекта, который можно найти в Личном кабинете в разделе Настройки проекта > ID проекта.
    • <your_authorization_basic_key> — пара ID продавца:ключ API, закодированная по стандарту Base64. Ключ API указан в Личном кабинете в разделе Настройки компании > Ключ API.

Note
Если вы уже используете облачные скрипты в вашем проекте, добавьте функцию получения Pay Station access token в конец кода.

Код функции получения Pay Station access token:

Copy
Full screen
Small screen
handlers.GetXsollaAccessToken = function (args) {

    // TODO replace with production credentials
    const merchantId = <MerchantID>; // Merchant ID from the Publisher Account
    const projectId = <ProjectID>; // Project ID from the Publisher Account
    const authHeader = '<your_authorization_basic_key>' // Base64(merchant_id:api_key)

    const headers = {
        "Authorization": `Basic ${authHeader}`
    };

    const body = {
        user: {
            id: {
                value: currentPlayerId
            },
            playfab_id: {
                value: currentPlayerId
            }
        },
        settings: {
            project_id: projectId
        }
    };

    const url = `https://api.xsolla.com/merchant/v2/merchants/${merchantId}/token`;
    const httpMethod = "post";
    const content = JSON.stringify(body);
    const contentType = "application/json";

    const response = JSON.parse(http.request(url, httpMethod, content, contentType, headers));

    if ('token' in response) {
        return {
            "token" : response.token
        }
    } else {
        return {
            "error_message" : response.message
        }
    }
}

  1. Перейдите к настройкам проекта в PlayFab.
  2. Загрузите файл облачного скрипта.
  3. Запустите облачный скрипт в боевой среде.
  4. Добавьте клиентскую логику для вызова функции из приложения. Укажите имя функции — GetXsollaAccessToken, передача параметров не требуется.

Пример вызова функции получения Pay Station access token:

Copy
Full screen
Small screen
kotlin
  • kotlin
  • C#
  • C++
val tokenRequest = PlayFabClientModels.ExecuteCloudScriptRequest()
tokenRequest.FunctionName = "GetXsollaAccessToken"
val res = PlayFabClientAPI.ExecuteCloudScript(tokenRequest)
val result = res.Result.FunctionResult as Map<*, *>
val token = result["token"]
val errorMessage = result["error_message"]
var tokenRequest = new ExecuteCloudScriptRequest{
  FunctionName = "GetXsollaAccessToken"
};

PlayFabClientAPI.ExecuteCloudScript(
  tokenRequest,
  scriptResult =>
  {
     var functionResult = scriptResult.FunctionResult as Dictionary<string, string>;
     var token = functionResult["token"];
  },
  playfabError => { Debug.LogError($"GetXsollaAccessToken error: {playfabError.ErrorMessage}"); });
void UMyClass::GetXsollaToken()
{
    FClientExecuteCloudScriptRequest tokenRequest;
    tokenRequest.FunctionName = TEXT("GetXsollaAccessToken");

    UPlayFabClientAPI::FDelegateOnSuccessExecuteCloudScript onSuccess;
    onSuccess.BindUFunction(this, "OnTokenRecieved");

    UPlayFabClientAPI::FDelegateOnFailurePlayFabError onFailure;
    onSuccess.BindUFunction(this, "OnError");

    UPlayFabClientAPI::ExecuteCloudScript(tokenRequest, onSuccess, onFailure, nullptr);
}

void UMyClass::OnTokenRecieved(FClientExecuteCloudScriptResult result, UObject* customData)
{
    const FString& token = result.FunctionResult->GetStringField(TEXT("token"));

    // do something with a token
}

void UMyClass::OnError(FPlayFabError error, UObject* customData)
{
    // handle errors
}

Note
В примере для выполнения запроса к облачному скрипту используются методы PlayFab SDK. Вы можете реализовать запрос и обработку ответа самостоятельно без добавления PlayFab SDK в ваш проект.

  1. В приложении реализуйте методы для работы с API самостоятельно или воспользуйтесь SDK Иксоллы.

Была ли статья полезна?
Спасибо!
Что может сделать страницу еще лучше? Сообщение
Жаль, что так произошло
Расскажите, почему статья не была полезна. Сообщение
Спасибо за обратную связь!
Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
Оценить страницу
Оценить страницу
Что может сделать страницу еще лучше?

В другой раз

Спасибо за обратную связь!

Полезные ссылки

Последнее обновление: 18 октября 2021

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

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