Непродлеваемая подписка

Как это работает

Непродлеваемая подписка — это премиумный бонус, который пользователь покупает единоразово. Чтобы получить бонус повторно, пользователь должен снова купить такую подписку.

Основные возможности:

  • Подписку можно продавать неограниченное количество раз.
  • При повторной продаже подписки в инвентаре пользователя количество товаров не меняется, время истечения подписки увеличивается.
  • Вы можете настраивать срок действия подписки в Личном кабинете.

Ограничения:

  • Управление непродлеваемой подпиской возможно только с сервера игры.

Для кого подходит

  • Для партнеров, которые уже подключили Магазин и хотят настроить новый тип товара — подписки.
  • Для партнеров, которые хотят продавать Season Pass, Battle Pass или другие виды товаров, в которых необходимо дать пользователю дополнительные преимущества в игре или дополнительный контент (например, предметы или задания в игре) на ограниченный период времени.

Как настроить

Предварительные действия

Если у вас еще не подключен продукт Магазин, выполните следующие действия:

  1. Создайте Личный кабинет Иксолла.
  2. Перейдите в Проекты и нажмите Создать проект.
  3. Добавьте Название проекта и нажмите Создать.
  4. Перейдите в Настройки проекта > Настройки интеграции и убедитесь, что переключатель Интегрировать методы Commerce API установлен в положение Вкл.

  1. Подключите Магазин к вашему проекту.
  2. Подключите модуль Виртуальные предметы.

Сценарий интеграции

  1. Создайте группу товаров.
  2. Создайте товары:
    1. При создании предмета выберите тип Непродлеваемая подписка.
    2. Укажите срок действия.

  1. Реализуйте получение подписок в каталоге.
  2. Реализуйте получение подписок в инвентаре.
  3. Реализуйте методы для покупки подписки.

Получение подписок в каталоге

Реализуйте вызов метода Get virtual items list, чтобы отобразить полный список виртуальных товаров, добавленных в ваш магазин.

ПРИМЕР

Copy
Full screen
Small screen
var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://store.xsolla.com/api/v2/project/44056/items/virtual_items?locale=en");

xhr.send(data);

//RESPONSE

"items": [
    {
      "attributes": [],
      "description": "Conquer your foes with vindication using the Basic Blaster! ",
      "groups": [
        "all",
        "featured",
        "Xsolla",
        "weapons"
      ],
      "image_url": "https://cdn.xsolla.net/img/misc/images/0c59a7698d4f66c1008b27ee752089b7.png",
      "is_free": false,
      "name": "Xsolla Basic Blaster 1",
      "order": 1,
      "price": {
        "amount": "0.9950000000000000",
        "amount_without_discount": "1.9900000000000000",
        "currency": "USD"
      },
      "sku": "gun_1",
      "type": "virtual_good"

Получение подписок в инвентаре

Используйте метод Get the current user's subscriptions в инвентаре пользователя для предоставления пользователю доступа к дополнительным возможностям.

Покупка подписки

При первой покупке подписка начисляется в инвентарь.

При повторной покупке:

  1. Если подписка активна, к текущему периоду истечения подписки добавляется дополнительное время.
  2. Если подписка неактивна, период истечения подписки устанавливается заново.

Для покупки подписки необходимо реализовать методы ниже.

Get cart

Реализуйте вызов метода Get cart by ID или Get current user’s cart для покупки виртуальных товаров. Cart ID будет использоваться для добавления/удаления товаров.

ПРИМЕР

Copy
Full screen
Small screen
var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://store.xsolla.com/api/v2/project/44056/cart/custom_id?locale=en&currency=USD");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");

xhr.send(data);

//RESPONSE

{
  "cart_id": "custom_id",
  "is_free": true,
  "items": [],
  "price": null
}

Note:
Для быстрой покупки товара без создания корзины используйте метод Create order with specified item.

Create order with all items

  1. Реализуйте вызов метода:
    1. Create order with all items from particular cart, если была получена корзина по ID.
    2. Create order with all items from current cart, если была получена текущая корзина.

Заказу будет присвоен статус New.

  1. Для открытия платежного интерфейса в новом окне используйте ссылку: https://secure.xsolla.com/paystation3/?access_token=ACCESS_TOKEN, где ACCESS_TOKEN — полученный при создании заказа токен.
  2. Для тестирования процесса оплаты:
    1. Используйте URL: https://sandbox-secure.xsolla.com/paystation3/?access_token=ACCESS_TOKEN.
    2. Установите в запросе значение true для параметра sandbox.
    3. Используйте список банковских карт для тестирования.

ПРИМЕР

Copy
Full screen
Small screen
var data = JSON.stringify({
  "currency": "USD",
  "locale": "en",
  "sandbox": false
});

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://store.xsolla.com/api/v2/project/44056/payment/cart/custom_id");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");

xhr.send(data);

//RESPONSE  

{
  "order_id": 641,
  "token": "f4puMEFFDZcx9nv5HoNHIkPe9qghvBQo"
}

Get order

Реализуйте вызов метода Get order, чтобы определить, была ли покупка уже обработана. Возможны следующие статусы заказа:

  • New — заказ создан и еще не оплачен
  • Paid — заказ оплачен
  • Cancelled — заказ отменен
  • Done — заказ оплачен и товар добавлен в инвентарь

Note:
Проверка статуса должна проводиться с определенной периодичностью, так как разовая проверка может произойти раньше, чем заказ перейдет в следующий статус.

ПРИМЕР

Copy
Full screen
Small screen
var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://store.xsolla.com/api/v2/project/44056/order/656");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");

xhr.send(data);

//RESPONSE

{
  "content": {
    "is_free": false,
    "items": [
      {
        "is_free": false,
        "price": {
          "amount": "0.9950",
          "amount_without_discount": "1.9900",
          "currency": "USD"
        },
        "quantity": 123,
        "sku": "gun_1"
      }
    ],
    "price": {
      "amount": "122.3850",
      "amount_without_discount": "122.3850",
      "currency": "USD"
    }
  },
  "order_id": 656,
  "status": "new"
}

Серверное управление подпиской

Начисление

Сервер игры может начислить предмет подписки пользователю с помощью метода начисления.

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

Списание

Сервер игры может отозвать предмет у игрока с помощью метода списания. При списании происходит полное удаление предмета из инвентаря игрока.