Skip to main content

Android-Specific Methods

IAPKit - In-App Purchase Solution

Methods available only on Android platform using Google Play Billing Library. All methods use typed parameters and return typed objects.

Setup

# Load OpenIAP types
const Types = preload("res://addons/godot-iap/types.gd")

Purchase Management

acknowledge_purchase_android

Acknowledge a non-consumable purchase. Required for all non-consumable purchases within 3 days.

func acknowledge_purchase_android(purchase_token: String) -> Types.VoidResult

Parameters:

ParameterTypeDescription
purchase_tokenStringPurchase token from purchase

Returns: Types.VoidResult

Example:

func handle_non_consumable_purchase(purchase):
# First verify on server
var verified = await verify_on_server(purchase)
if verified:
# Acknowledge the purchase
var result = GodotIapPlugin.acknowledge_purchase_android(purchase.purchase_token)
if result.success:
# Grant the content
unlock_premium_content()
Important

Non-consumable purchases that aren't acknowledged within 3 days will be automatically refunded by Google Play.


consume_purchase_android

Consume a consumable purchase. This allows the product to be purchased again.

func consume_purchase_android(purchase_token: String) -> Types.VoidResult

Parameters:

ParameterTypeDescription
purchase_tokenStringPurchase token from purchase

Returns: Types.VoidResult

Example:

func handle_consumable_purchase(purchase):
# First verify on server
var verified = await verify_on_server(purchase)
if verified:
# Grant the item
add_coins(100)

# Consume the purchase
var result = GodotIapPlugin.consume_purchase_android(purchase.purchase_token)
if result.success:
print("Purchase consumed, can buy again")

Storefront

get_storefront_android

Get the user's country code based on Google Play settings.

func get_storefront_android() -> String

Returns: String - Country code (e.g., "US", "KR")

Example:

func get_user_country() -> String:
return GodotIapPlugin.get_storefront_android()

get_package_name_android

Get the app's package name.

func get_package_name_android() -> String

Returns: String - Package name

Example:

func log_app_info():
var package = GodotIapPlugin.get_package_name_android()
print("Package: ", package) # e.g., "com.yourcompany.game"

Alternative Billing (Deprecated)

Deprecated

These methods are deprecated in favor of the Billing Programs API. They may be removed in future versions.

check_alternative_billing_availability_android

Check if alternative billing is available for this user/region.

func check_alternative_billing_availability_android() -> Types.BoolResult

Returns: Types.BoolResult


show_alternative_billing_dialog_android

Show the alternative billing information dialog to the user.

func show_alternative_billing_dialog_android() -> Variant

Returns: Variant - Types.AlternativeBillingDialogResultAndroid or null


create_alternative_billing_token_android

Create a token for reporting alternative billing transactions.

func create_alternative_billing_token_android() -> Variant

Returns: Variant - Types.AlternativeBillingTokenAndroid or null


Billing Programs API (Android 8.2.0+)

Modern API for external billing and alternative payment options.

is_billing_program_available_android

Check if a specific billing program is available.

func is_billing_program_available_android(billing_program: Types.BillingProgramAndroid) -> bool

Parameters:

ParameterTypeDescription
billing_programTypes.BillingProgramAndroidProgram type enum

Billing Programs:

ProgramDescription
EXTERNAL_OFFERExternal offer program
EXTERNAL_CONTENT_LINKExternal content link
EXTERNAL_PAYMENTSExternal payments (user choice)
USER_CHOICE_BILLINGUser choice billing

Returns: bool

Example:

func check_external_offer_availability():
if GodotIapPlugin.is_billing_program_available_android(Types.BillingProgramAndroid.EXTERNAL_OFFER):
show_external_offer_button()

Launch an external link for billing programs.

func launch_external_link_android(params: Types.ExternalLinkParamsAndroid) -> Types.VoidResult

Parameters:

ParameterTypeDescription
paramsTypes.ExternalLinkParamsAndroidLink parameters

Returns: Types.VoidResult

Example:

func open_external_offer():
var params = Types.ExternalLinkParamsAndroid.new()
params.billing_program = Types.BillingProgramAndroid.EXTERNAL_OFFER
params.launch_mode = Types.ExternalLaunchModeAndroid.LAUNCH_IN_BROWSER
params.link_type = Types.ExternalLinkTypeAndroid.DIGITAL_CONTENT
params.link_uri = "https://your-store.com/special-offer"

var result = GodotIapPlugin.launch_external_link_android(params)
if result.success:
print("External link opened")

create_billing_program_reporting_details_android

Create reporting details for external transactions.

func create_billing_program_reporting_details_android(billing_program: Types.BillingProgramAndroid) -> Variant

Parameters:

ParameterTypeDescription
billing_programTypes.BillingProgramAndroidBilling program type

Returns: Variant - Types.BillingProgramReportingDetailsAndroid or null

Example:

func get_reporting_token():
var result = GodotIapPlugin.create_billing_program_reporting_details_android(
Types.BillingProgramAndroid.EXTERNAL_OFFER
)
if result:
var token = result.external_transaction_token
# Use this token when reporting external transactions to Google
report_external_transaction(token)

Signals

user_choice_billing_android

Emitted when user chooses an alternative billing option.

func _on_user_choice_billing(data: Dictionary):
var products = data.get("products", [])
var external_token = data.get("externalTransactionToken", "")

# Handle external billing flow
for product in products:
process_external_purchase(product, external_token)

developer_provided_billing_android

Emitted for developer-provided billing options.

func _on_developer_provided_billing(data: Dictionary):
# Handle developer billing flow
pass

Complete Example

extends Node

const Types = preload("res://addons/godot-iap/types.gd")

func _ready():
_setup_signals()
if GodotIapPlugin.init_connection():
_check_pending_purchases()

func _setup_signals():
GodotIapPlugin.purchase_updated.connect(_on_purchase_updated)
GodotIapPlugin.purchase_error.connect(_on_purchase_error)
GodotIapPlugin.user_choice_billing_android.connect(_on_user_choice_billing)

func _check_pending_purchases():
var purchases = GodotIapPlugin.get_available_purchases()
for purchase in purchases:
if not purchase.is_acknowledged:
await handle_purchase(purchase)

func _on_purchase_updated(purchase: Dictionary):
var state = purchase.get("purchaseState", "")
var is_acknowledged = purchase.get("isAcknowledged", false)

if (state == "purchased" or state == "Purchased") and not is_acknowledged:
await handle_purchase_dict(purchase)

func handle_purchase_dict(purchase: Dictionary):
# Verify on server
var verified = await verify_on_server(purchase)
if not verified:
return

var product_id = purchase.get("productId", "")
var purchase_token = purchase.get("purchaseToken", "")

if is_consumable(product_id):
# Grant and consume
grant_consumable(product_id)
GodotIapPlugin.consume_purchase_android(purchase_token)
else:
# Grant and acknowledge
grant_non_consumable(product_id)
GodotIapPlugin.acknowledge_purchase_android(purchase_token)

func _on_purchase_error(error: Dictionary):
var code = error.get("code", "")

match code:
"USER_CANCELED":
print("User canceled")
"ITEM_ALREADY_OWNED":
# Restore the purchase
var purchases = GodotIapPlugin.get_available_purchases()
for p in purchases:
if not p.is_acknowledged:
await handle_purchase(p)
"ITEM_NOT_OWNED":
print("Item not owned")
_:
print("Error: ", error.get("message", ""))

func _on_user_choice_billing(data: Dictionary):
# Handle user choice billing
var token = data.get("externalTransactionToken", "")
# Implement your external billing flow