Платежи
Обрабатывайте разовые платежи игроков.
Поддерживаемые площадки
Площадки без поддержки
Для проверки поддержки покупок на площадке в SDK используйте свойство gp.payments.isAvailable
.
- JavaScript
- Unity
// Проверка поддержки платежей на платформе
if (gp.payments.isAvailable) {
// можно показывать / покупать продукты
}
// Проверка поддержки платежей на платформе
if (GP_Payments.IsPaymentsAvailable()) {
// можно показывать / покупать продукты
}
Правила платежей
Придерживайтесь правил для покупок.
Существуют два типа платежей: одноразовые и постоянные.
Пример одноразовой покупки:
- Купить 1000 золота
- Купить сундук
- Восстановить жизни
Одноразовые покупки необходимо израсходовать (консумировать) сразу же.
Пример постоянной покупки:
- Отключение рекламы
- VIP статус
- Увеличение x5 награды за уровень
Постоянные покупки не нужно расходовать. Как только покупка оплачена - она будет всегда видна пользователю, пока не будет израсходована.
Правила проведения одноразовой покупки
- JavaScript
- Unity
// 1. Производится покупка
await gp.payments.purchase({ tag: 'GOLD_1000' });
// 2. Начисляется награда
gp.player.add('gold', 1000);
// 3. Игрок сохраняется на сервере
await gp.player.sync();
// 4. Покупка консумируется (расходуется)
await gp.payments.consume({ tag: 'GOLD_1000' });
// 1. Производится покупка
GP_Payments.Purchase("EXTRA_GOLD");
// 2. Начисляется награда
GP_Player.Add('gold', 1000);
// 3. Игрок сохраняется на сервере
GP_Player.Sync();
// 4. Покупка консумируется (расходуется)
GP_Payments.Consume("EXTRA_GOLD");
Правила проведения постоянной покупки
- JavaScript
- Unity
// 1. Производится покупка
await gp.payments.purchase({ tag: 'VIP' });
// 2. В нужный момент проверяется наличие покупки
if (gp.payments.has('VIP')) {
// сделать что-нибудь при наличии VIP статуса
}
// 1. Производится покупка
GP_Payments.Purchase('VIP', OnPurchaseSuccess, OnPurchaseError);
private void OnPurchaseSuccess(string productIdOrTag){
if(productIdOrTag == 'VIP')
GP_Player.Set('VIP', true);
}
private void OnPurchaseError() => Debug.Log("PURCHASE: ERROR");
// 2. В нужный момент проверяется наличие покупки
if (GP_Player.GetBool('VIP')) {
// сделать что-нибудь при наличии VIP статуса
}
Покупка продукта
+1-3 RequestЧтобы приобрести покупку, вам необходимо передать ID или тег покупки.
- JavaScript
- Unity
// Покупка по ID
gp.payments.purchase({ id: 17541 });
// Покупка по тегу
gp.payments.purchase({ tag: 'GOLD_1000' });
// Покупка по ID
GP_Payments.Purchase("15234");
// Покупка по тегу
GP_Payments.Purchase("EXTRA_GOLD");
События при покупке продукта
- JavaScript
- Unity
// Успешная покупка
gp.payments.on('purchase', ({ product, purchase }) => {});
// Ошибка если покупка не удалась
gp.payments.on('error:purchase', (error) => {});
public void Purchase() => GP_Payments.Purchase("EXTRA_GOLD", OnPurchaseSuccess, OnPurchaseError);
// Успешная покупка
private void OnPurchaseSuccess(string productIdOrTag) => Debug.Log("PURCHASE: SUCCESS: " + productIdOrTag);
// Ошибка если покупка не удалась
private void OnPurchaseError() => Debug.Log("PURCHASE: ERROR");
Метод покупки с promises
- JavaScript
- Unity
const result = await gp.payments.purchase({ id: 17541 });
/**
* Данные продукта
* @type {Product}
*/
result.product;
/**
* Данные покупки
* @type {PlayerPurchase}
*/
result.purchase;
Не реализовано
Расходование (консумирование) покупки
+1 RequestЧтобы использовать покупку, вам необходимо передать ID или тег продукта.
- JavaScript
- Unity
// Расходование по ID
gp.payments.consume({ id: 17541 });
// Расходование по тегу
gp.payments.consume({ tag: 'GOLD_1000' });
// Расходование по ID
GP_Payments.Consume("15234");
// Расходование по тегу
GP_Payments.Consume("EXTRA_GOLD");
События при расходовании покупки
- JavaScript
- Unity
// Успешно использована
gp.payments.on('consume', ({ product, purchase }) => {});
// Ошибка при использовании
gp.payments.on('error:consume', (error) => {});
public void Consume() => GP_Payments.Consume("EXTRA_GOLD", OnConsumeSuccess, OnConsumeError);
// Успешно использована
private void OnConsumeSuccess(string productIdOrTag) => Debug.Log("CONSUME: SUCCESS: " + productIdOrTag);
// Ошибка при использовании
private void OnConsumeError() => Debug.Log("CONSUME: ERROR");
Метод расходования через promises
- JavaScript
- Unity
const result = await gp.payments.consume({ id: 17541 });
/**
* Данные продукта
* @type {Product}
*/
result.product;
/**
* Данные покупки
* @type {PlayerPurchase}
*/
result.purchase;
Не реализовано
Списки товаров и покупок
FREEСписки загружаются при старте игры и доступны сразу после инициализации SDK.
Получить список товаров:
- JavaScript
- Unity
gp.payments.products;
//Подписка на события
private void OnEnable()
{
GP_Payments.OnFetchProducts += OnFetchProducts;
GP_Payments.OnFetchProductsError += OnFetchProductsError;
}
//Отписка от событий
private void OnDisable()
{
GP_Payments.OnFetchProducts -= OnFetchProducts;
GP_Payments.OnFetchProductsError -= OnFetchProductsError;
}
//Можно получить список товаров через метод
public void FetchProducts() => GP_Payments.Fetch();
// Успешно получен
private void OnFetchProducts(List<FetchProducts> products)
{
for (int i = 0; i < products.Count; i++)
{
Debug.Log("PRODUCT: ID: " + products[i].id);
Debug.Log("PRODUCT: TAG: " + products[i].tag);
Debug.Log("PRODUCT: NAME: " + products[i].name);
Debug.Log("PRODUCT: DESCRIPTION: " + products[i].description);
Debug.Log("PRODUCT: ICON: " + products[i].icon);
Debug.Log("PRODUCT: ICON SMALL: " + products[i].iconSmall);
Debug.Log("PRODUCT: PRICE: " + products[i].price);
Debug.Log("PRODUCT: CURRENCY: " + products[i].currency);
Debug.Log("PRODUCT: CURRENCY SYMBOL: " + products[i].currencySymbol);
Debug.Log("PRODUCT: IS SUBSCRIPTION: " + products[i].isSubscription);
Debug.Log("PRODUCT: PERIOD: " + products[i].period);
Debug.Log("PRODUCT: TRIAL PERIOD: " + products[i].trialPeriod);
}
}
// Ошибки при получении
private void OnFetchProductsError() => Debug.Log("FETCH PRODUCTS: ERROR");
Получить список покупок игрока:
- JavaScript
- Unity
gp.payments.purchases;
//Подписка на событие
private void OnEnable()
{
GP_Payments.OnFetchPlayerPurchases += OnFetchPlayerPurchases;
}
//Отписка от события
private void OnDisable()
{
GP_Payments.OnFetchPlayerPurchases -= OnFetchPlayerPurchases;
}
//Можно получить список покупок игрока через метод
public void FetchPlayerPurchases() => GP_Payments.Fetch()
// Успешно получен
private void OnFetchPlayerPurchases(List<FetchPlayerPurchases> purcahses)
{
for (int i = 0; i < purcahses.Count; i++)
{
Debug.Log("PLAYER PURCHASES: PRODUCT TAG: " + purcahses[i].tag);
Debug.Log("PLAYER PURCHASES: PRODUCT ID: " + purcahses[i].productId);
Debug.Log("PLAYER PURCHASES: PAYLOAD: " + purcahses[i].payload);
Debug.Log("PLAYER PURCHASES: CREATED AT: " + purcahses[i].createdAt);
Debug.Log("PLAYER PURCHASES: EXPIRED AT: " + purcahses[i].expiredAt);
Debug.Log("PLAYER PURCHASES: GIFT: " + purcahses[i].gift);
Debug.Log("PLAYER PURCHASES: SUBSCRIBED: " + purcahses[i].subscribed);
}
}
Получение списка продуктов
FREE Устарело- JavaScript
- Unity
gp.payments.fetchProducts();
GP_Payments.Fetch();
Метод получения через promises
- JavaScript
- Unity
const result = await gp.payments.fetchProducts();
// Результат ответа
const {
// Список продуктов
products,
// Список покупок игрока
playerPurchases,
} = result;
Не реализовано
События при получении списка покупок
- JavaScript
- Unity
// Успешно получен
gp.payments.on('fetchProducts', (result) => {});
// Ошибки при получении
gp.payments.on('error:fetchProducts', (error) => {});
//Подписка на события
private void OnEnable()
{
GP_Payments.OnFetchProducts += OnFetchProducts;
GP_Payments.OnFetchProductsError += OnFetchProductsError;
GP_Payments.OnFetchPlayerPurchases += OnFetchPlayerPurchases;
}
//Отписка от событий
private void OnDisable()
{
GP_Payments.OnFetchProducts -= OnFetchProducts;
GP_Payments.OnFetchProductsError -= OnFetchProductsError;
GP_Payments.OnFetchPlayerPurchases -= OnFetchPlayerPurchases;
}
public void Fetch() => GP_Payments.Fetch();
// Успешно получен
private void OnFetchProducts(List<FetchProducts> products)
{
for (int i = 0; i < products.Count; i++)
{
Debug.Log("PRODUCT: ID: " + products[i].id);
Debug.Log("PRODUCT: TAG: " + products[i].tag);
Debug.Log("PRODUCT: NAME: " + products[i].name);
Debug.Log("PRODUCT: DESCRIPTION: " + products[i].description);
Debug.Log("PRODUCT: ICON: " + products[i].icon);
Debug.Log("PRODUCT: ICON SMALL: " + products[i].iconSmall);
Debug.Log("PRODUCT: PRICE: " + products[i].price);
Debug.Log("PRODUCT: CURRENCY: " + products[i].currency);
Debug.Log("PRODUCT: CURRENCY SYMBOL: " + products[i].currencySymbol);
Debug.Log("PRODUCT: IS SUBSCRIPTION: " + products[i].isSubscription);
Debug.Log("PRODUCT: PERIOD: " + products[i].period);
Debug.Log("PRODUCT: TRIAL PERIOD: " + products[i].trialPeriod);
}
}
// Ошибки при получении
private void OnFetchProductsError() => Debug.Log("FETCH PRODUCTS: ERROR");
private void OnFetchPlayerPurchases(List<FetchPlayerPurchases> purcahses)
{
for (int i = 0; i < purcahses.Count; i++)
{
Debug.Log("PLAYER PURCHASES: PRODUCT TAG: " + purcahses[i].tag);
Debug.Log("PLAYER PURCHASES: PRODUCT ID: " + purcahses[i].productId);
Debug.Log("PLAYER PURCHASES: PAYLOAD: " + purcahses[i].payload);
Debug.Log("PLAYER PURCHASES: CREATED AT: " + purcahses[i].createdAt);
Debug.Log("PLAYER PURCHASES: EXPIRED AT: " + purcahses[i].expiredAt);
Debug.Log("PLAYER PURCHASES: GIFT: " + purcahses[i].gift);
Debug.Log("PLAYER PURCHASES: SUBSCRIBED: " + purcahses[i].subscribed);
}
}
Поля покупки
Поле | Тип | Описание | Пример |
---|---|---|---|
id | number | ID покупки | 115 |
tag | string | Необязательный тег для помощи при выборе. Вы можете использовать его вместо ID | VIP |
name | string | Название, переведенное на язык пользователя | VIP Статус |
description | string | Описание, переведенное на язык пользователя | Без рекламы, награда x2 |
icon | string | Ссылка на иконку размером 256x256 | Пример ссылки |
iconSmall | string | Ссылка на иконку размером 64x64 | Пример ссылки |
price | number | Цена покупки | 199 |
currency | string | Код валюты | YAN OK VOTE RUB GP |
currencySymbol | string | Символ валюты (переведенный на язык пользователя и отформатированный, если нужно) | Голос, Голоса, Голосов |
isSubscription | boolean | Покупка является подпиской | по умолчанию false |
period | number | Длительность подписки в днях | 7 , 30 , 90 |
trialPeriod | number | Длительность триального периода в днях (за это время пользователь может без списания средств отменить подписку) | 0 , 3 , 7 , 30 |
Поля покупки игрока
Поле | Тип | Описание | Пример |
---|---|---|---|
productId | number | ID Покупки | 115 |
payload | Object | Данные от покупки на платформе (например, ID заказа или токен) | {"order_id": 213} |
createdAt | string | Дата покупки, формат ISO 8601 UTC | 2022-12-01T04:52:26+0000 |
gift | boolean | Покупка была подарена разработчиком игры | false |
subscribed | boolean | Активна ли подписка на эту покупку | true |
expiredAt | string | Дата завершения подписки, формат ISO 8601 UTC | 2022-12-01T04:52:26+0000 |
Коды ошибок
Ошибка | Описание ошибки |
---|---|
player_not_found | Игрок не найден |
empty_id_or_tag | Передан пустой ID или тег покупки |
product_not_found | Покупка с таким ID или тегом не найдена |
purchases_not_alloved_on_platform | Покупки не доступны на этой площадке |
undefined | непредвиденная ошибка (смотрите консоль) |
Оставайтесь на связи
С другими разделами документации вы можете ознакомиться здесь. Для начала работы вы можете ознакомиться с нашими туториалами.
Сообщество GamePush в Telegram
: @gs_community.
Для ваших обращений e-mail
: [email protected]
Желаем вам успехов!