Магазин и игровые услуги
Операции вызываются через persisted documentId. Идентификаторы предложений, расчётов, заказов и платежей непрозрачны: клиент сохраняет полученное значение и не разбирает его. Авторизованные операции используют выбранный в сессии игровой сервер, а гостевые операции принимают gameServerId.
Покупка всегда состоит из расчёта и подтверждения. Браузер передаёт предложение, количество, разрешённый выбор и получателя, но не отправляет цену, скидку или состав выдачи. Каждый requestId, orderRequestId и paymentRequestId создаётся клиентом в формате UUIDv7 и отвечает за идемпотентность своей операции.
Операции
Список и карточка ранее оформленных покупок описаны в Истории покупок.
Магазин
documentId | Авторизация | Вход | Результат |
|---|---|---|---|
shopOffers | Bearer session | first, after, categoryId, accountLogin | ShopOfferConnection! |
shopOffer | Bearer session | offerId, accountLogin | ShopOffer! |
shopCategories | Bearer session | first, after | ShopCategoryConnection! |
guestShopOffers | Публичная | gameServerId, first, after, categoryId | ShopOfferConnection! |
guestShopOffer | Публичная | gameServerId, offerId | ShopOffer! |
guestShopCategories | Публичная | gameServerId, first, after | ShopCategoryConnection! |
prepareShopPurchase | Bearer session | input: PrepareShopPurchaseInput! | ShopQuote! |
purchaseShop | Bearer session | input: PurchaseShopInput! | ShopPurchase! |
prepareGuestShopPurchase | Публичная | input: PrepareGuestShopPurchaseInput! | ShopQuote! |
confirmFreeGuestShopPurchase | Публичная | input: ConfirmFreeGuestPurchaseInput! | ShopPurchase! |
prepareGuestShopCheckout | Публичная | input: PrepareGuestShopCheckoutInput! | StorefrontExternalPaymentPreparation! |
startGuestShopCheckout | Публичная | input: ExecuteGuestShopCheckoutInput! | StorefrontExternalPaymentExecution! |
retryGuestShopCheckout | Публичная | input: ExecuteGuestShopCheckoutInput! | StorefrontExternalPaymentExecution! |
Игровые услуги
documentId | Авторизация | Вход | Результат |
|---|---|---|---|
gameServiceOffers | Bearer session | first, after, categoryCode | GameServiceOfferConnection! |
gameServiceOffer | Bearer session | offerId | GameServiceOffer! |
gameServiceCategories | Bearer session | first, after | GameServiceCategoryConnection! |
prepareGameServicePurchase | Bearer session | input: PrepareGameServicePurchaseInput! | GameServiceQuote! |
purchaseGameService | Bearer session | input: PurchaseGameServiceInput! | GameServicePurchase! |
При нулевой итоговой сумме purchaseShop и purchaseGameService подтверждают заказ без списания. В результате paymentId равен null, а paymentStatus равен NOT_REQUIRED. paymentRequestId в этих операциях служит ключом подтверждения.
Каталог магазина
shopOffers
Описание
Возвращает доступные игроку предложения текущего сервера. Цена уже учитывает применимые акции, реферальную скидку и VIP. Поле availability содержит состояние и прогресс лимитов. Пагинация выполняется курсором из pageInfo.endCursor.
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
first | Int! | да | Размер страницы. |
after | ID | нет | Курсор предыдущей страницы. |
categoryId | ID | нет | Непрозрачный ID категории. |
accountLogin | String | нет | Свой игровой аккаунт для расчёта лимита аккаунта. |
Пример обмена
{
"documentId": "shopOffers",
"variables": {
"first": 24,
"after": null,
"categoryId": null,
"accountLogin": "eternal_main"
}
}
{
"data": {
"shopOffers": {
"items": [
{
"id": "019bf3dd-b08b-7000-8000-000000000205",
"sku": "STARTER_CHOICE",
"name": "Набор на выбор",
"description": "Выберите одну награду.",
"imageReference": "/styles/default/cabinet/images/items/soulshot-ticket.png",
"categoryId": "019bf3dd-b08b-7000-8000-000000000206",
"pricingMode": "SELECTION",
"deliveryModes": [
"ACCOUNT_CHARACTER",
"WAREHOUSE"
],
"selectionLimitCount": 1,
"items": [
{
"assetReference": "57",
"quantity": 250000,
"enchantLevel": 0,
"selectionKey": "adena",
"quantitySelectable": true,
"maximumQuantityMultiplier": 4
}
],
"price": {
"base": {
"units": "400",
"decimal": "4.00",
"currencyCode": "USD",
"currencyScale": 2
},
"effective": {
"units": "288",
"decimal": "2.88",
"currencyCode": "USD",
"currencyScale": 2
},
"adjustments": [
{
"code": "launch-sale",
"source": "SALE",
"percentage": 20,
"amount": {
"units": "80",
"decimal": "0.80",
"currencyCode": "USD",
"currencyScale": 2
}
}
],
"fromPrice": true,
"hasSavings": true
},
"selectionPrices": [],
"availability": {
"status": "AVAILABLE",
"available": true,
"startsAt": "2026-09-01T00:00:00Z",
"endsAt": "2026-10-01T00:00:00Z",
"globalLimit": {
"windowSeconds": 86400,
"maximumPurchases": 100,
"currentPurchases": 2,
"remainingPurchases": 98,
"evaluated": true,
"nextAvailableAt": null
},
"customerLimit": null,
"gameAccountLimit": null,
"gameAccountSelectionRequired": false
},
"sortOrder": 10
}
],
"pageInfo": {
"endCursor": null,
"hasNextPage": false
}
}
}
}
Для одной карточки используйте shopOffer с offerId. shopCategories возвращает id, локализованное name, sortOrder и курсор. Публичные варианты guestShopOffers, guestShopOffer и guestShopCategories возвращают те же представления, но дополнительно требуют gameServerId и не принимают accountLogin.
Связанные типы
Покупка с баланса
prepareShopPurchase
Описание
Проверяет предложение, получателя, выбранные позиции и лимиты, затем создаёт короткоживущий расчёт. Для ACCOUNT_CHARACTER передаются свой аккаунт и персонаж, для DIRECT_CHARACTER - персонаж, для WAREHOUSE получатель не требуется.
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
input.requestId | ID! | да | Новый UUIDv7 расчёта. |
input.offerId | ID! | да | Непрозрачный ID предложения. |
input.quantity | Int! | да | Количество единиц предложения. |
input.deliveryMode | PlayerShopDeliveryMode! | да | ACCOUNT_CHARACTER, DIRECT_CHARACTER или WAREHOUSE. |
input.accountLogin | String | условно | Свой аккаунт для ACCOUNT_CHARACTER. |
input.characterName | String | условно | Персонаж для игровой доставки. |
input.selectedItems | [ShopPurchaseSelectionInput!]! | да | Разрешённый выбор; пустой список для набора. |
Пример обмена
{
"documentId": "prepareShopPurchase",
"variables": {
"input": {
"requestId": "019bf3dd-b08b-7000-8000-000000000201",
"offerId": "019bf3dd-b08b-7000-8000-000000000205",
"quantity": 2,
"deliveryMode": "ACCOUNT_CHARACTER",
"accountLogin": "eternal_main",
"characterName": "Hero",
"selectedItems": [
{
"selectionKey": "adena",
"quantityMultiplier": 2
}
]
}
}
}
{
"data": {
"prepareShopPurchase": {
"id": "019bf3dd-b08b-7000-8000-000000000207",
"offer": {
"id": "019bf3dd-b08b-7000-8000-000000000205",
"name": "Набор на выбор",
"pricingMode": "SELECTION"
},
"quantity": 2,
"selectedItems": [
{
"selectionKey": "adena",
"quantityMultiplier": 2
}
],
"deliveryItems": [
{
"assetReference": "57",
"quantity": 1000000,
"enchantLevel": 0
}
],
"unitAmount": {
"units": "1200",
"decimal": "12.00",
"currencyCode": "USD",
"currencyScale": 2
},
"subtotal": {
"units": "2400",
"decimal": "24.00",
"currencyCode": "USD",
"currencyScale": 2
},
"adjustments": [
{
"code": "vip-rank",
"kind": "DISCOUNT",
"source": "VIP",
"amount": {
"units": "480",
"decimal": "4.80",
"currencyCode": "USD",
"currencyScale": 2
}
}
],
"total": {
"units": "1920",
"decimal": "19.20",
"currencyCode": "USD",
"currencyScale": 2
},
"hasSavings": true,
"delivery": {
"mode": "ACCOUNT_CHARACTER",
"accountLogin": "eternal_main",
"characterName": "Hero"
},
"expiresAt": "2026-09-03T12:15:00Z"
}
}
}
Пример показывает ключевые поля вложенного offer; persisted документ возвращает его полное представление из каталога.
purchaseShop
Описание
Создаёт заказ по действующему расчёту и оплачивает его с баланса. Повтор с теми же идентификаторами возвращает тот же результат; изменение данных под тем же идентификатором завершается конфликтом.
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
input.orderRequestId | ID! | да | UUIDv7 создания заказа. |
input.paymentRequestId | ID! | да | Отдельный UUIDv7 списания. |
input.quoteId | ID! | да | Действующий расчёт. |
Пример обмена
{
"documentId": "purchaseShop",
"variables": {
"input": {
"orderRequestId": "019bf3dd-b08b-7000-8000-000000000202",
"paymentRequestId": "019bf3dd-b08b-7000-8000-000000000203",
"quoteId": "019bf3dd-b08b-7000-8000-000000000207"
}
}
}
{
"data": {
"purchaseShop": {
"orderId": "019bf3dd-b08b-7000-8000-000000000208",
"quoteId": "019bf3dd-b08b-7000-8000-000000000207",
"orderStatus": "FULFILLED",
"paymentId": "019bf3dd-b08b-7000-8000-000000000209",
"paymentStatus": "PAID",
"total": {
"units": "1920",
"decimal": "19.20",
"currencyCode": "USD",
"currencyScale": 2
},
"createdAt": "2026-09-03T12:01:00Z"
}
}
}
Гостевая покупка
Гостевой сценарий использует три последовательных шага: расчёт и проверку персонажа, создание заказа с доступными способами оплаты, запуск выбранного способа. Клиент не передаёт произвольный URL возврата или цену.
prepareGuestShopPurchase
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
input.gameServerId | Int! | да | Выбранный игровой сервер. |
input.requestId | ID! | да | UUIDv7 расчёта. |
input.offerId | ID! | да | Предложение с гостевой доставкой. |
input.quantity | Int! | да | Количество. |
input.characterName | String! | да | Проверяемый персонаж-получатель. |
input.payerEmail | String! | да | Электронная почта плательщика. |
input.selectedItems | [ShopPurchaseSelectionInput!]! | да | Выбор позиций или пустой список. |
Пример обмена
{
"documentId": "prepareGuestShopPurchase",
"variables": {
"input": {
"gameServerId": 7,
"requestId": "019bf3dd-b08b-7000-8000-000000000201",
"offerId": "019bf3dd-b08b-7000-8000-000000000205",
"quantity": 1,
"characterName": "Hero",
"selectedItems": []
}
}
}
{
"data": {
"prepareGuestShopPurchase": {
"id": "019bf3dd-b08b-7000-8000-000000000207",
"quantity": 1,
"selectedItems": [],
"deliveryItems": [
{
"assetReference": "57",
"quantity": 250000,
"enchantLevel": 0
}
],
"subtotal": {
"units": "1200",
"decimal": "12.00",
"currencyCode": "USD",
"currencyScale": 2
},
"adjustments": [],
"total": {
"units": "1200",
"decimal": "12.00",
"currencyCode": "USD",
"currencyScale": 2
},
"hasSavings": false,
"delivery": {
"mode": "GUEST_CHARACTER",
"accountLogin": null,
"characterName": "Hero"
},
"expiresAt": "2026-09-03T12:15:00Z"
}
}
}
Ответ также содержит полные offer и unitAmount, как у авторизованного расчёта.
prepareGuestShopCheckout
Описание
Создаёт ожидающий оплаты заказ и возвращает только доступные для точной суммы способы с отдельным платёжным расчётом каждого способа.
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
input.gameServerId | Int! | да | Тот же игровой сервер. |
input.orderRequestId | ID! | да | UUIDv7 заказа. |
input.paymentRequestId | ID! | да | UUIDv7 платёжного намерения. |
input.quoteId | ID! | да | Действующий Shop-расчёт. |
input.characterName | String! | да | Тот же персонаж. |
input.payerEmail | String! | да | Та же почта плательщика. |
input.payerCountry | String | нет | Двухбуквенный код страны, если известен. |
Пример обмена
{
"documentId": "prepareGuestShopCheckout",
"variables": {
"input": {
"gameServerId": 7,
"orderRequestId": "019bf3dd-b08b-7000-8000-000000000202",
"paymentRequestId": "019bf3dd-b08b-7000-8000-000000000203",
"quoteId": "019bf3dd-b08b-7000-8000-000000000207",
"characterName": "Hero",
"payerCountry": "DE"
}
}
}
{
"data": {
"prepareGuestShopCheckout": {
"orderId": "019bf3dd-b08b-7000-8000-000000000208",
"quoteId": "019bf3dd-b08b-7000-8000-000000000207",
"orderStatus": "PENDING_PAYMENT",
"intent": {
"id": "019bf3dd-b08b-7000-8000-000000000210",
"status": "OPEN",
"expiresAt": "2026-09-03T12:10:00Z"
},
"methods": [
{
"id": "019bf3dd-b08b-7000-8000-000000000211",
"code": "bank_card",
"name": "Банковская карта",
"iconAssetId": null,
"paymentQuote": {
"id": "019bf3dd-b08b-7000-8000-000000000212",
"paymentAmount": {
"units": "1700",
"decimal": "17.00",
"currencyCode": "EUR",
"currencyScale": 2
},
"destinationAmount": {
"units": "1920",
"decimal": "19.20",
"currencyCode": "USD",
"currencyScale": 2
},
"payerFee": {
"units": "50",
"decimal": "0.50",
"currencyCode": "EUR",
"currencyScale": 2
},
"expiresAt": "2026-09-03T12:05:00Z"
}
}
]
}
}
}
startGuestShopCheckout
Описание
Запускает выбранный способ оплаты. action.kind определяет единственное действие клиента: REDIRECT, FORM_POST, QR_CODE, DEEP_LINK или WAIT. Неподходящие поля действия равны null.
retryGuestShopCheckout принимает тот же тип входа и возвращает тот же тип результата. Для повторной попытки используется новый requestId, а orderId, quoteId, получатель и выбранный платёжный расчёт остаются связанными с подготовленным заказом.
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
input.gameServerId | Int! | да | Игровой сервер заказа. |
input.requestId | ID! | да | UUIDv7 запуска или повторной попытки. |
input.orderId | ID! | да | Подготовленный заказ. |
input.quoteId | ID! | да | Связанный Shop-расчёт. |
input.characterName | String! | да | Проверенный персонаж. |
input.payerEmail | String! | да | Почта плательщика. |
input.methodProfileId | ID! | да | methods[].id. |
input.paymentQuoteId | ID! | да | methods[].paymentQuote.id. |
Пример обмена
{
"documentId": "startGuestShopCheckout",
"variables": {
"input": {
"gameServerId": 7,
"requestId": "019bf3dd-b08b-7000-8000-000000000204",
"orderId": "019bf3dd-b08b-7000-8000-000000000208",
"quoteId": "019bf3dd-b08b-7000-8000-000000000207",
"characterName": "Hero",
"methodProfileId": "019bf3dd-b08b-7000-8000-000000000211",
"paymentQuoteId": "019bf3dd-b08b-7000-8000-000000000212"
}
}
}
{
"data": {
"startGuestShopCheckout": {
"orderId": "019bf3dd-b08b-7000-8000-000000000208",
"quoteId": "019bf3dd-b08b-7000-8000-000000000207",
"orderStatus": "PENDING_PAYMENT",
"intent": {
"id": "019bf3dd-b08b-7000-8000-000000000210",
"status": "PROCESSING",
"expiresAt": "2026-09-03T12:10:00Z"
},
"attempt": {
"id": "019bf3dd-b08b-7000-8000-000000000213",
"status": "REQUIRES_CUSTOMER_ACTION",
"expiresAt": "2026-09-03T12:05:00Z"
},
"action": {
"kind": "FORM_POST",
"expiresAt": "2026-09-03T12:05:00Z",
"redirect": null,
"formPost": {
"url": "https://pay.example/checkout",
"fields": [
{
"name": "invoice",
"value": "checkout-123"
},
{
"name": "signature",
"value": "signed-value"
}
]
},
"qrCode": null,
"deepLink": null,
"wait": null
}
}
}
}
Игровые услуги
gameServiceOffers
Описание
Возвращает локализованные игровые услуги текущего сервера. Поля услуги типизированы как TEXT, OPTION или COLOR; допустимые варианты, ограничения текста и цена каждого варианта приходят в ответе.
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
first | Int! | да | Размер страницы. |
after | ID | нет | Курсор следующей страницы. |
categoryCode | String | нет | Код категории. |
Пример обмена
{
"documentId": "gameServiceOffers",
"variables": {
"first": 24,
"after": null,
"categoryCode": "character"
}
}
{
"data": {
"gameServiceOffers": {
"items": [
{
"id": "019bf3dd-b08b-7000-8000-000000000104",
"name": "Смена имени персонажа",
"description": "Изменяет имя выбранного персонажа.",
"imageReference": "/styles/default/cabinet/images/items/lucky-coin.png",
"category": {
"code": "character",
"name": "Услуги для персонажа",
"description": "Операции для выбранного персонажа."
},
"targetKind": "CHARACTER",
"fields": [
{
"code": "newCharacterName",
"kind": "TEXT",
"required": true,
"name": "Новое имя",
"description": "Введите новое имя персонажа.",
"textConstraint": {
"policy": "ALPHANUMERIC_NAME",
"minimumLength": 3,
"maximumLength": 16
},
"options": [],
"sortOrder": 10,
"determinesPrice": false
}
],
"price": {
"base": {
"units": "1000",
"decimal": "10.00",
"currencyCode": "USD",
"currencyScale": 2
},
"effective": {
"units": "800",
"decimal": "8.00",
"currencyCode": "USD",
"currencyScale": 2
},
"adjustments": [
{
"code": "vip-rank",
"source": "VIP",
"percentage": 20,
"amount": {
"units": "200",
"decimal": "2.00",
"currencyCode": "USD",
"currencyScale": 2
}
}
],
"fromPrice": false,
"hasSavings": true
},
"availability": {
"status": "AVAILABLE",
"available": true,
"startsAt": "2026-09-01T00:00:00Z",
"endsAt": "2026-10-01T00:00:00Z"
},
"sortOrder": 10
}
],
"pageInfo": {
"endCursor": null,
"hasNextPage": false
}
}
}
}
gameServiceOffer возвращает одно полное предложение по offerId. gameServiceCategories возвращает code, локализованные name и description, sortOrder и курсор.
Связанные типы
prepareGameServicePurchase
Описание
Создаёт расчёт услуги для выбранного получателя и значений формы. Используйте его до указанного срока действия.
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
input.requestId | ID! | да | UUIDv7 расчёта. |
input.offerId | ID! | да | Непрозрачный ID услуги. |
input.target.accountLogin | String! | да | Свой игровой аккаунт. |
input.target.characterName | String | условно | Обязателен для цели CHARACTER. |
input.fields | [GameServiceFieldValueInput!]! | да | Значения по опубликованной схеме полей. |
Пример обмена
{
"documentId": "prepareGameServicePurchase",
"variables": {
"input": {
"requestId": "019bf3dd-b08b-7000-8000-000000000101",
"offerId": "019bf3dd-b08b-7000-8000-000000000104",
"target": {
"accountLogin": "eternal_main",
"characterName": "Hero"
},
"fields": [
{
"fieldCode": "newCharacterName",
"value": "NewHero"
},
{
"fieldCode": "titleColor",
"value": "blue"
}
]
}
}
}
{
"data": {
"prepareGameServicePurchase": {
"id": "019bf3dd-b08b-7000-8000-000000000105",
"offer": {
"id": "019bf3dd-b08b-7000-8000-000000000104",
"name": "Смена имени персонажа",
"targetKind": "CHARACTER"
},
"fieldValues": [
{
"fieldCode": "newCharacterName",
"value": "NewHero"
},
{
"fieldCode": "titleColor",
"value": "blue"
}
],
"target": {
"kind": "CHARACTER",
"accountLogin": "eternal_main",
"characterName": "Hero"
},
"unitAmount": {
"units": "1200",
"decimal": "12.00",
"currencyCode": "USD",
"currencyScale": 2
},
"subtotal": {
"units": "1200",
"decimal": "12.00",
"currencyCode": "USD",
"currencyScale": 2
},
"adjustments": [
{
"code": "vip-rank",
"kind": "DISCOUNT",
"source": "VIP",
"amount": {
"units": "240",
"decimal": "2.40",
"currencyCode": "USD",
"currencyScale": 2
}
}
],
"total": {
"units": "960",
"decimal": "9.60",
"currencyCode": "USD",
"currencyScale": 2
},
"hasSavings": true,
"expiresAt": "2026-09-03T12:15:00Z"
}
}
}
Пример показывает ключевые поля вложенного offer; фактический ответ содержит полную опубликованную схему услуги.
purchaseGameService
Описание
Создаёт заказ по действующему расчёту, списывает баланс и выполняет игровую операцию. Клиент не повторяет динамические поля в этой мутации: они уже зафиксированы расчётом.
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
input.orderRequestId | ID! | да | UUIDv7 заказа. |
input.paymentRequestId | ID! | да | Отдельный UUIDv7 списания. |
input.quoteId | ID! | да | Действующий расчёт услуги. |
Пример обмена
{
"documentId": "purchaseGameService",
"variables": {
"input": {
"orderRequestId": "019bf3dd-b08b-7000-8000-000000000102",
"paymentRequestId": "019bf3dd-b08b-7000-8000-000000000103",
"quoteId": "019bf3dd-b08b-7000-8000-000000000105"
}
}
}
{
"data": {
"purchaseGameService": {
"orderId": "019bf3dd-b08b-7000-8000-000000000106",
"quoteId": "019bf3dd-b08b-7000-8000-000000000105",
"orderStatus": "FULFILLED",
"paymentId": "019bf3dd-b08b-7000-8000-000000000107",
"paymentStatus": "PAID",
"total": {
"units": "960",
"decimal": "9.60",
"currencyCode": "USD",
"currencyScale": 2
},
"createdAt": "2026-09-03T12:01:00Z"
}
}
}
Бесплатная гостевая покупка
confirmFreeGuestShopPurchase
Подтверждает выбранную покупку с нулевой итоговой суммой. Вызывайте после явного нажатия Купить, используя действующий расчёт из подготовки гостевой покупки. Получать способы оплаты и запускать платёж для неё не нужно.
Поле input | Тип | Значение |
|---|---|---|
gameServerId | Int! | Выбранный игровой сервер. |
orderRequestId | ID! | UUIDv7 создания заказа. |
confirmationRequestId | ID! | Другой UUIDv7 подтверждения. |
quoteId | ID! | ID действующего расчёта с нулевым итогом. |
characterName | String! | Получатель из расчёта, до 64 символов. |
payerEmail | String! | Email из расчёта, до 254 символов. |
{
"documentId": "confirmFreeGuestShopPurchase",
"variables": {
"input": {
"gameServerId": 1,
"orderRequestId": "019bf3dd-b08b-7000-8000-000000000310",
"confirmationRequestId": "019bf3dd-b08b-7000-8000-000000000311",
"quoteId": "019bf3dd-b08b-7000-8000-000000000312",
"characterName": "Asterion",
}
}
}
{
"data": {
"confirmFreeGuestShopPurchase": {
"orderId": "019bf3dd-b08b-7000-8000-000000000313",
"quoteId": "019bf3dd-b08b-7000-8000-000000000312",
"orderStatus": "CONFIRMED",
"paymentId": null,
"paymentStatus": "NOT_REQUIRED",
"total": {
"units": "0",
"decimal": "0.000",
"currencyCode": "ELX",
"currencyScale": 3
},
"createdAt": "2026-09-13T10:00:00Z"
}
}
}
При повторе сохраните оба идентификатора и остальные поля без изменений. Если расчёт истёк, подготовьте новый. Результат имеет тип ShopPurchase; paymentId равен null, а paymentStatus равен NOT_REQUIRED. CONFIRMED означает принятое подтверждение, но ещё не завершённую выдачу.
Ошибки
| Код | Значение |
|---|---|
UNAUTHENTICATED | Для авторизованной операции нет действующей сессии. |
STOREFRONT_INVALID_REQUEST | Поля запроса не соответствуют текущему контракту. |
STOREFRONT_SCOPE_UNAVAILABLE | Текущий проект или игровой сервер недоступен. |
STOREFRONT_ACCOUNT_UNAVAILABLE | Аккаунт не принадлежит игроку или недоступен. |
STOREFRONT_CHARACTER_UNAVAILABLE | Персонаж не найден или не принадлежит выбранному аккаунту. |
STOREFRONT_FEATURE_UNAVAILABLE | Игровая услуга сейчас недоступна. |
STOREFRONT_OFFER_UNAVAILABLE | Предложение недоступно по состоянию, периоду или лимиту. |
STOREFRONT_REFRESH_REQUIRED | Расчёт, заказ или платёжный расчёт устарел; начните шаг заново. |
STOREFRONT_INSUFFICIENT_BALANCE | На выбранном балансе недостаточно средств. |
STOREFRONT_PAYMENT_DEBT | Погасите задолженность выбранного баланса, затем начните новую покупку. |
STOREFRONT_CONFLICT | Идентификатор операции повторно использован с другими данными. |
STOREFRONT_METHODS_UNAVAILABLE | Для гостевого заказа нет доступного способа оплаты. |
STOREFRONT_RATE_LIMITED | Превышено ограничение частоты публичных запросов. |
STOREFRONT_UNAVAILABLE | Операция временно недоступна. |
Полные структуры ответов приведены в типах данных модулей.