Godot Google Play Billing 5 – 2.0.0-rc.1

Library Godot Engine Google Play Billing 5

Plugins de Godot Engine para Google Play compras en aplicación. Biblioteca de facturación 5

GitHub Godot Engine Play Billing

Descargamos e instalamos 2.0.0-rc.1

Copiamos los dos archivos dentro de nuestro Proyecto en /android/plugins/

En Android -> Export tenemos que tener activado Use Custom Build

Observamos que nos ha aparecido Godot Google Play Billing en la opción Export de Android. Activamos.

Código Godot Engine In App Purchases

El código es bastante simple y sencillo:

El siguiente código está pensado para un solo Item de compra que deberemos añadir en: const TEST_ITEM_SKU = «MY_ITEM_SKU» pero se pueden añadir cuántos Items queramos. En este ejemplo tenemos una compra para eliminar los anuncios publicitarios.

func _on_query_purchases_response(query): es llamada de forma Asyncrona por la función queryPurchases que emite una señal.

En la variable query.purchases se almacena la lista «de las compras.» De tal manera, que si queremos añadir más Items, deberemos utilizar un bucle iterativo para obtenerlas. En este código no se implementa.

En este caso, comprobamos que se haya realizado la compra: query.purchases.size() > 0 en el caso de que no haya compra, cuidado, porque la variable no contendrá null, sino que estará vacía [ ] (empty)

Si se realiza la compra, y el desarrollador la devuelve, la lista también volverá al estado empty. Lo he comprobado varias veces y el cambio de estado es inmediato.

En este ejemplo, nada más se realiza la compra, se consume. payment.consumePurchase(purchase.purchase_token) Si no lo hacemos, Google Play la devolverá de forma automática pasados unos minutos.

También debemos tener en cuenta que la llamada desde Godot a la función queryPurchases emite la señal query_purchases_response y al ser Asyncrona, es posible que no veamos de forma inmediata los cambios en las variables de compra. Suele haber un retraso de un par de segundos, dependiendo del dispositivo.

Este ejemplo ha sido testeado en Google Play varias veces, realizando infinidad de pruebas y funciona perfectamante.

Se agradecería que pudieran contribuir de forma desinteresada: pueden descargar varios de mis juegos e hicieran una buena valoración.

MMeGAMES

CÓDIGO

extends Control


const TEST_ITEM_SKU = "MY_ITEM_SKU"
var payment = null
var test_item_purchase_token = null

var conanuncios = true
# Called when the node enters the scene tree for the first time.

func _ready():
    if Engine.has_singleton("GodotGooglePlayBilling"):
        payment = Engine.get_singleton("GodotGooglePlayBilling")
        # No params.
        payment.connect("connected", self, "_on_connected")
        # No params.
        payment.connect("disconnected", self, "_on_disconnected")
        # Response ID (int), Debug message (string).
        #payment.connect("connect_error", self, "_on_connect_error")
        # Purchases (Dictionary[]).
        payment.connect("purchases_updated", self, "_on_purchases_updated")
        # Response ID (int), Debug message (string).
        payment.connect("purchase_error", self, "_on_purchase_error")
        # SKUs (Dictionary[]).
        payment.connect("product_details_query_completed", self, "_on_product_details_query_completed")
        # Response ID (int), Debug message (string), Queried SKUs (string[]).
        payment.connect("product_details_query_error", self, "_on_product_details_query_error")
        # Purchase token (string).
        payment.connect("purchase_acknowledged", self, "_on_purchase_acknowledged")
        # Response ID (int), Debug message (string), Purchase token (string).
        payment.connect("purchase_acknowledgement_error", self, "_on_purchase_acknowledgement_error")
        # Purchase token (string).
        payment.connect("purchase_consumed", self, "_on_purchase_consumed")
        # Response ID (int), Debug message (string), Purchase token (string).
        payment.connect("purchase_consumption_error", self, "_on_purchase_consumption_error")
        
        payment.connect("query_purchases_response", self, "_on_query_purchases_response")
        
        payment.startConnection()
    else:
        print("Android IAP support is not enabled. Make sure you have enabled 'Custom Build' and installed and enabled the GodotGooglePlayBilling plugin in your Android export settings! This application will not work.")

func COMPRAMOS_purchase_pressed():
    var response = payment.purchase(TEST_ITEM_SKU)
    if response.status != OK:
        print("Purchase error %s: %s" % [response.response_code, response.debug_message])
        

# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
#    pass
func _on_connected():
    var res = payment.querySkuDetails([TEST_ITEM_SKU], "inapp") # "subs" for subscriptions
    # We must acknowledge all puchases.
    # See https://developer.android.com/google/play/billing/integrate#process for more information
    payment.queryPurchases("inapp")
    
func _on_product_details_query_completed(sku_details):
    for available_sku in sku_details:
        print("L1:"+str(available_sku))
        #print("MAURONANA:"+str(available_sku.price))
        
func _on_query_purchases_response(query):
    if query.status == 0:
        if query.purchases.size() > 0:
            print("NO ADS - FOUND",query.purchases)
            conanuncios = false
            #if not purchase.is_acknowledged:
                #print("Purchase " + str(purchase.sku) + " has not been acknowledged. Acknowledging...")
                #payment.acknowledgePurchase(purchase.purchase_token)
        else:
            print("WITH ADS - NOT FOUND",query.purchases)
            conanuncios = true
    else:
        print("Purchase query failed: %d" % query.status)
    
    if conanuncios:
        print("WITH ADS")
        ControlAdmob.LOAD_BANNER()
    else:
        print("NO ADS")
        ControlAdmob.DESTROY_BANNER()
    

func _on_purchases_updated(purchases):
    print("U1 Purchases updated: %s" % to_json(purchases))
    # See _on_connected
    for purchase in purchases:
        if not purchase.is_acknowledged:
            print("Purchase " + str(purchase) + " has not been acknowledged. Acknowledging...")
            payment.acknowledgePurchase(purchase.purchase_token)
            #CONSUMIMOS LA COMPRA
            payment.consumePurchase(purchase.purchase_token)
            
    if purchases.size() > 0:
        test_item_purchase_token = purchases[purchases.size() - 1].purchase_token
        print("PURCHASE FOUND"+String(test_item_purchase_token))
        conanuncios = false
        ControlAdmob.DESTROY_BANNER()
    else:
        conanuncios = true
        ControlAdmob.LOAD_BANNER()
        

func _on_purchase_acknowledged(purchase_token):
    print("MMA Purchase acknowledged: %s" % purchase_token)


func _on_purchase_consumed(purchase_token):
    print("MCON-Purchase consumed successfully: %s" % purchase_token)


func _on_purchase_error(code, message):
    print("Purchase error %d: %s" % [code, message])


func _on_purchase_acknowledgement_error(code, message):
    print("Purchase acknowledgement error %d: %s" % [code, message])


func _on_purchase_consumption_error(code, message, purchase_token):
    print("Purchase consumption error %d: %s, purchase token: %s" % [code, message, purchase_token])


func _on_product_details_query_error(code, message):
    print("SKU details query error %d: %s" % [code, message])


func _on_disconnected():
    print("GodotGooglePlayBilling disconnected. Will try to reconnect in 10s...")
    yield(get_tree().create_timer(10), "timeout")
    payment.startConnection()
0 0 votes
Calificación del artículo
Suscribirse
Notify of
guest
2 Comentarios
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
mau_restor
mau_restor
9 months ago

Hola, si tengo una lista de items como monedas y o paquetes de monedas como agregaria items consumibles?

Visi
Admin
9 months ago
Reply to  mau_restor

Hola, la función _on_query_purchases_response(query): está conectada con la función interna

public void onQueryPurchasesResponse(BillingResult billingResult,
List purchaseList) {

de tal forma que la variable query devuelve «la lista de Items comprados» List purchaseList

Para implementar eso, se debería recorrer toda «la lista» de la variable query. No lo he implementado pero creo que esa sería la opción más simple.
Puedes probarlo tú mismo en real con un ejemplo y ver qué devuelve.

Saludos,
Mauro

2
0
Would love your thoughts, please comment.x
()
x