iap_demo.gd 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. extends Control
  2. const TEST_ITEM_SKU = "my_in_app_purchase_sku"
  3. @onready var alert_dialog: AcceptDialog = $AlertDialog
  4. @onready var label: Label = $Label
  5. var payment: Object = null
  6. var test_item_purchase_token := ""
  7. func _ready() -> void:
  8. if Engine.has_singleton("GodotGooglePlayBilling"):
  9. label.text += "\n\n\nTest item SKU: %s" % TEST_ITEM_SKU
  10. payment = Engine.get_singleton("GodotGooglePlayBilling")
  11. # No params.
  12. payment.connected.connect(_on_connected)
  13. # No params.
  14. payment.disconnected.connect(_on_disconnected)
  15. # Response ID (int), Debug message (string).
  16. payment.connect_error.connect(_on_connect_error)
  17. # Purchases (Dictionary[]).
  18. payment.purchases_updated.connect(_on_purchases_updated)
  19. # Response ID (int), Debug message (string).
  20. payment.purchase_error.connect(_on_purchase_error)
  21. # SKUs (Dictionary[]).
  22. payment.sku_details_query_completed.connect(_on_sku_details_query_completed)
  23. # Response ID (int), Debug message (string), Queried SKUs (string[]).
  24. payment.sku_details_query_error.connect(_on_sku_details_query_error)
  25. # Purchase token (string).
  26. payment.purchase_acknowledged.connect(_on_purchase_acknowledged)
  27. # Response ID (int), Debug message (string), Purchase token (string).
  28. payment.purchase_acknowledgement_error.connect(_on_purchase_acknowledgement_error)
  29. # Purchase token (string).
  30. payment.purchase_consumed.connect(_on_purchase_consumed)
  31. # Response ID (int), Debug message (string), Purchase token (string).
  32. payment.purchase_consumption_error.connect(_on_purchase_consumption_error)
  33. # Purchases (Dictionary[])
  34. payment.query_purchases_response.connect(_on_query_purchases_response)
  35. payment.startConnection()
  36. else:
  37. show_alert('Android IAP support is not enabled.\n\nMake sure you have enabled "Custom Build" and installed and enabled the GodotGooglePlayBilling plugin in your Android export settings!\nThis application will not work otherwise.')
  38. func show_alert(text: String) -> void:
  39. alert_dialog.dialog_text = text
  40. alert_dialog.popup_centered_clamped(Vector2i(600, 0))
  41. $QuerySkuDetailsButton.disabled = true
  42. $PurchaseButton.disabled = true
  43. $ConsumeButton.disabled = true
  44. func _on_connected() -> void:
  45. print("PurchaseManager connected")
  46. # Use "subs" for subscriptions.
  47. payment.queryPurchases("inapp")
  48. func _on_query_purchases_response(query_result: Dictionary) -> void:
  49. if query_result.status == OK:
  50. for purchase: Dictionary in query_result.purchases:
  51. # We must acknowledge all puchases.
  52. # See https://developer.android.com/google/play/billing/integrate#process for more information
  53. if not purchase.is_acknowledged:
  54. print("Purchase " + str(purchase.sku) + " has not been acknowledged. Acknowledging...")
  55. payment.acknowledgePurchase(purchase.purchase_token)
  56. else:
  57. print("queryPurchases failed, response code: ",
  58. query_result.response_code,
  59. " debug message: ", query_result.debug_message)
  60. func _on_sku_details_query_completed(sku_details: Array) -> void:
  61. for available_sku: Dictionary in sku_details:
  62. show_alert(JSON.stringify(available_sku))
  63. func _on_purchases_updated(purchases: Array) -> void:
  64. print("Purchases updated: %s" % JSON.stringify(purchases))
  65. # See `_on_connected()`.
  66. for purchase: Dictionary in purchases:
  67. if not purchase.is_acknowledged:
  68. print("Purchase " + str(purchase.sku) + " has not been acknowledged. Acknowledging...")
  69. payment.acknowledgePurchase(purchase.purchase_token)
  70. if not purchases.is_empty():
  71. test_item_purchase_token = purchases[purchases.size() - 1].purchase_token
  72. func _on_purchase_acknowledged(purchase_token: String) -> void:
  73. print("Purchase acknowledged: %s" % purchase_token)
  74. func _on_purchase_consumed(purchase_token: String) -> void:
  75. show_alert("Purchase consumed successfully: %s" % purchase_token)
  76. func _on_connect_error(code: int, message: String) -> void:
  77. show_alert("Connect error %d: %s" % [code, message])
  78. func _on_purchase_error(code: int, message: String) -> void:
  79. show_alert("Purchase error %d: %s" % [code, message])
  80. func _on_purchase_acknowledgement_error(code: int, message: String) -> void:
  81. show_alert("Purchase acknowledgement error %d: %s" % [code, message])
  82. func _on_purchase_consumption_error(code: int, message: String, purchase_token: String) -> void:
  83. show_alert("Purchase consumption error %d: %s, purchase token: %s" % [code, message, purchase_token])
  84. func _on_sku_details_query_error(code: int, message: String) -> void:
  85. show_alert("SKU details query error %d: %s" % [code, message])
  86. func _on_disconnected() -> void:
  87. show_alert("GodotGooglePlayBilling disconnected. Will try to reconnect in 10s...")
  88. await get_tree().create_timer(10).timeout
  89. payment.startConnection()
  90. # GUI
  91. func _on_QuerySkuDetailsButton_pressed() -> void:
  92. # Use "subs" for subscriptions.
  93. payment.querySkuDetails([TEST_ITEM_SKU], "inapp")
  94. func _on_PurchaseButton_pressed() -> void:
  95. var response: Dictionary = payment.purchase(TEST_ITEM_SKU)
  96. if response.status != OK:
  97. show_alert("Purchase error %s: %s" % [response.response_code, response.debug_message])
  98. func _on_ConsumeButton_pressed() -> void:
  99. if test_item_purchase_token == null:
  100. show_alert("You need to set 'test_item_purchase_token' first! (either by hand or in code)")
  101. return
  102. payment.consumePurchase(test_item_purchase_token)