Closed Maxikc closed 3 months ago
Есть ли какой-то простой способ добавить к SDK функцию для внутриигровых покупок?
Копируешь нужные функции из документации в файл по дороге их немного подправив, после чего добавляешь обертку в синглтон, тестируешь и отправляешь пулл реквест. Как-то так, там не сложно. Вариант 2. Ждешь неопределенный срок пока я это добавлю сам
Основывался на существующих функциях, добавил только необходимое для меня (может, кому-то поможет). Если вкратце, я добавил в синглтон функцию purchase_item(item_id), где item_id должен соответствовать ID покупки в Яндекс.Консоли; ну и обновил .js файл. В документации есть много других функций, которые я не добавил, но мне этого хватит и я надеюсь, что это поможет кому-то ещё.
Обновил функцию InitGame (добавил в неё инициализацию Payments) и добавил функцию purchaseItem в yandex_sdk.js:
let ysdk;
let payments = null;
function InitGame(params, callback) {
console.log('Yandex SDK start initialization');
YaGames.init(params).then(_sdk => {
ysdk = _sdk;
console.log('Yandex SDK initialized');
ysdk.features.LoadingAPI?.ready();
console.log('Game initialized');
// ДОБАВЛЕНО, ИЗМЕНЕНО
ysdk.getPayments({ signed: true }).then(_payments => {
payments = _payments;
console.log('Payments initialized');
}).catch(err => {
console.error("Error initializing payments: ", err);
});
//
callback();
}).catch(err => {
console.log(err);
console.log('Game initialization error');
});
}
// ДОБАВЛЕНО, ИЗМЕНЕНО
function purchaseItem(item_id, callback) {
if (!payments) {
console.error("Payments not initialized.");
callback(false, null);
return;
}
payments.purchase({ id: item_id }).then(purchase => {
console.log("Purchase successful: ", purchase);
callback(true, purchase);
}).catch(err => {
console.error("Purchase failed: ", err);
callback(false, err);
});
}
Обновил yandex_sdk.gd. Обновил _game_initialized и добавил пару нужных для меня функций и переменных:
signal purchased(item_id)
var is_payments_initialized: bool = false
var callback_purchase = JavaScriptBridge.create_callback(_onPurchaseItem)
...
func _game_initialized(args) -> void:
is_game_initialized = true
is_payments_initialized = true
emit_signal('game_initialized')
...
#Отправка в яндекс запроса на покупку
func purchase_item(item_id: String):
if not OS.has_feature("yandex"):
return
if not is_payments_initialized:
await game_initialized
window.purchaseItem(item_id,callback_purchase)
#Для возврата в код игры
func _onPurchaseItem(success, item_id):
if success:
emit_signal('purchased',item_id)
else:
pass
Вот как эти два файла выглядят у меня Some_functions.zip
Я не силён в JS, поэтому не понимаю, почему у меня не работала функция, но до этого программа не вызывала callback, если в описании функции было два, а не один аргумент. Синтаксис в GDScript такой же: YandexSDK.purchase_item(item_id) принимает один аргумент, строку - id покупки из Яндекс игр. При совершённой покупке вызывает сигнал purchased с аттрибутом item_id - массив с одной строкой типа ['unique_id']. Сигнал всё так же можно подключить как YandexSDK.purchased.connect(some_function) (всё так же для Godot 4.3)
Я переписал ранее добавленные функции, и теперь они выглядят так:
yandex_sdk.js
function purchaseItem(item_id, callback) {
if (!payments) {
console.error("Payments not initialized.");
return;
}
else {
payments.purchase({ id: item_id }).then(purchase => {
console.log("Purchase successful: ", item_id);
callback(item_id);
}).catch(err => {
console.log("Purchase failed: ", err);
});
}
}
yandex_sdk.gd
func purchase_item(item_id: String):
if not OS.has_feature("yandex"):
return
if not is_payments_initialized:
await game_initialized
window.purchaseItem(item_id,callback_purchase)
func _onPurchaseItem(item_id):
emit_signal('purchased',item_id)
Есть ли какой-то простой способ добавить к SDK функцию для внутриигровых покупок?