BasilYes / godot-yandex-games-sdk

Yandex games SDK implementation for godot
MIT License
86 stars 7 forks source link

payments.get Purchases() in YandexSDK? #17

Closed Maxikc closed 3 months ago

Maxikc commented 3 months ago

Есть ли какой-то простой способ добавить к SDK функцию для внутриигровых покупок?

BasilYes commented 3 months ago

Есть ли какой-то простой способ добавить к SDK функцию для внутриигровых покупок?

Копируешь нужные функции из документации в файл по дороге их немного подправив, после чего добавляешь обертку в синглтон, тестируешь и отправляешь пулл реквест. Как-то так, там не сложно. Вариант 2. Ждешь неопределенный срок пока я это добавлю сам

Maxikc commented 3 months ago

Основывался на существующих функциях, добавил только необходимое для меня (может, кому-то поможет). Если вкратце, я добавил в синглтон функцию 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

Maxikc commented 3 months ago

Я не силён в 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)