Merge pull request #6 from volzhs/android-iap

add android iap demo
This commit is contained in:
Rémi Verschelde
2016-07-29 14:22:23 +02:00
committed by GitHub
7 changed files with 604 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
[android]
modules="org/godotengine/godot/GodotPaymentV3"
[application]
name="Android IAP"
main_scene="res://main.tscn"
icon="res://icon.png"
[autoload]
iap="*res://iap.gd"

283
misc/android_iap/export.cfg Normal file
View File

@@ -0,0 +1,283 @@
[convert_images]
action="none"
compress_quality=0.7
formats="png"
shrink=1.0
[convert_samples]
action="none"
max_hz=44100
trim=false
[convert_scenes]
convert_text_scenes=true
[export_filter]
filter=""
filter_exclude=""
type="resources"
[platform:Android]
apk_expansion/SALT=""
apk_expansion/enable=false
apk_expansion/public_key=""
architecture/arm=true
architecture/x86=false
command_line/extra_args=""
custom_package/debug=""
custom_package/release=""
debug/debugging_enabled=true
keystore/release=""
keystore/release_password=""
keystore/release_user=""
one_click_deploy/clear_previous_install=true
package/icon=""
package/name=""
package/signed=true
package/unique_name="org.godotengine.$genname"
permissions/access_checkin_properties=false
permissions/access_coarse_location=false
permissions/access_fine_location=false
permissions/access_location_extra_commands=false
permissions/access_mock_location=false
permissions/access_network_state=false
permissions/access_surface_flinger=false
permissions/access_wifi_state=false
permissions/account_manager=false
permissions/add_voicemail=false
permissions/authenticate_accounts=false
permissions/battery_stats=false
permissions/bind_accessibility_service=false
permissions/bind_appwidget=false
permissions/bind_device_admin=false
permissions/bind_input_method=false
permissions/bind_nfc_service=false
permissions/bind_notification_listener_service=false
permissions/bind_print_service=false
permissions/bind_remoteviews=false
permissions/bind_text_service=false
permissions/bind_vpn_service=false
permissions/bind_wallpaper=false
permissions/bluetooth=false
permissions/bluetooth_admin=false
permissions/bluetooth_privileged=false
permissions/brick=false
permissions/broadcast_package_removed=false
permissions/broadcast_sms=false
permissions/broadcast_sticky=false
permissions/broadcast_wap_push=false
permissions/call_phone=false
permissions/call_privileged=false
permissions/camera=false
permissions/capture_audio_output=false
permissions/capture_secure_video_output=false
permissions/capture_video_output=false
permissions/change_component_enabled_state=false
permissions/change_configuration=false
permissions/change_network_state=false
permissions/change_wifi_multicast_state=false
permissions/change_wifi_state=false
permissions/clear_app_cache=false
permissions/clear_app_user_data=false
permissions/control_location_updates=false
permissions/delete_cache_files=false
permissions/delete_packages=false
permissions/device_power=false
permissions/diagnostic=false
permissions/disable_keyguard=false
permissions/dump=false
permissions/expand_status_bar=false
permissions/factory_test=false
permissions/flashlight=false
permissions/force_back=false
permissions/get_accounts=false
permissions/get_package_size=false
permissions/get_tasks=false
permissions/get_top_activity_info=false
permissions/global_search=false
permissions/hardware_test=false
permissions/inject_events=false
permissions/install_location_provider=false
permissions/install_packages=false
permissions/install_shortcut=false
permissions/internal_system_window=false
permissions/internet=false
permissions/kill_background_processes=false
permissions/location_hardware=false
permissions/manage_accounts=false
permissions/manage_app_tokens=false
permissions/manage_documents=false
permissions/master_clear=false
permissions/media_content_control=false
permissions/modify_audio_settings=false
permissions/modify_phone_state=false
permissions/mount_format_filesystems=false
permissions/mount_unmount_filesystems=false
permissions/nfc=false
permissions/persistent_activity=false
permissions/process_outgoing_calls=false
permissions/read_calendar=false
permissions/read_call_log=false
permissions/read_contacts=false
permissions/read_external_storage=false
permissions/read_frame_buffer=false
permissions/read_history_bookmarks=false
permissions/read_input_state=false
permissions/read_logs=false
permissions/read_phone_state=false
permissions/read_profile=false
permissions/read_sms=false
permissions/read_social_stream=false
permissions/read_sync_settings=false
permissions/read_sync_stats=false
permissions/read_user_dictionary=false
permissions/reboot=false
permissions/receive_boot_completed=false
permissions/receive_mms=false
permissions/receive_sms=false
permissions/receive_wap_push=false
permissions/record_audio=false
permissions/reorder_tasks=false
permissions/restart_packages=false
permissions/send_respond_via_message=false
permissions/send_sms=false
permissions/set_activity_watcher=false
permissions/set_alarm=false
permissions/set_always_finish=false
permissions/set_animation_scale=false
permissions/set_debug_app=false
permissions/set_orientation=false
permissions/set_pointer_speed=false
permissions/set_preferred_applications=false
permissions/set_process_limit=false
permissions/set_time=false
permissions/set_time_zone=false
permissions/set_wallpaper=false
permissions/set_wallpaper_hints=false
permissions/signal_persistent_processes=false
permissions/status_bar=false
permissions/subscribed_feeds_read=false
permissions/subscribed_feeds_write=false
permissions/system_alert_window=false
permissions/transmit_ir=false
permissions/uninstall_shortcut=false
permissions/update_device_stats=false
permissions/use_credentials=false
permissions/use_sip=false
permissions/vibrate=false
permissions/wake_lock=false
permissions/write_apn_settings=false
permissions/write_calendar=false
permissions/write_call_log=false
permissions/write_contacts=false
permissions/write_external_storage=false
permissions/write_gservices=false
permissions/write_history_bookmarks=false
permissions/write_profile=false
permissions/write_secure_settings=false
permissions/write_settings=false
permissions/write_sms=false
permissions/write_social_stream=false
permissions/write_sync_settings=false
permissions/write_user_dictionary=false
screen/immersive_mode=true
screen/orientation=0
screen/support_large=true
screen/support_normal=true
screen/support_small=true
screen/support_xlarge=true
screen/use_32_bits_view=true
user_permissions/0="com.android.vending.BILLING"
user_permissions/1=""
user_permissions/10=""
user_permissions/11=""
user_permissions/12=""
user_permissions/13=""
user_permissions/14=""
user_permissions/15=""
user_permissions/16=""
user_permissions/17=""
user_permissions/18=""
user_permissions/19=""
user_permissions/2=""
user_permissions/3=""
user_permissions/4=""
user_permissions/5=""
user_permissions/6=""
user_permissions/7=""
user_permissions/8=""
user_permissions/9=""
version/code=1
version/name="1.0"
[platform:BlackBerry 10]
debug/debugging_enabled=true
package/category="core.games"
package/custom_template=""
package/description="Game made with Godot Engine"
package/icon=""
package/name=""
package/unique_name="com.godot.noname"
release/author="Cert. Name"
release/author_id="Cert. ID"
version/code=1
version/name="1.0"
[platform:HTML5]
browser/enable_run=false
custom_package/debug=""
custom_package/release=""
debug/debugging_enabled=true
html/controls_enabled=true
html/font_family="arial,sans-serif"
html/head_include=""
html/style_include=""
html/title=""
options/memory_size=3
[platform:Linux X11]
binary/64_bits=true
custom_binary/debug=""
custom_binary/release=""
debug/debugging_enabled=true
resources/bundle_dependencies_(for_optical_disc)=false
resources/pack_mode=1
[platform:Mac OSX]
application/64_bits=false
application/copyright=""
application/fat_bits=false
application/icon=""
application/identifier="com.godot.macgame"
application/info="This Game is Nice"
application/name=""
application/short_version="1.0"
application/signature="godotmacgame"
application/version="1.0"
custom_package/debug=""
custom_package/release=""
debug/debugging_enabled=true
display/high_res=false
[platform:Windows Desktop]
binary/64_bits=true
custom_binary/debug=""
custom_binary/release=""
debug/debugging_enabled=true
resources/bundle_dependencies_(for_optical_disc)=false
resources/pack_mode=1
[script]
action="compile"
encrypt_key=""

124
misc/android_iap/iap.gd Normal file
View File

@@ -0,0 +1,124 @@
extends Node
signal purchase_success(item_name)
signal purchase_fail
signal purchase_cancel
signal purchase_owned(item_name)
signal has_purchased(item_name)
signal consume_success(item_name)
signal consume_fail
signal consume_not_required
signal sku_details_complete
signal sku_details_error
onready var payment = Globals.get_singleton("GodotPayments")
func _ready():
if payment:
# set callback with this script instance
payment.setPurchaseCallbackId(get_instance_ID())
# set consume purchased item automatically after purchase, defulat value is true
func set_auto_consume(auto):
if payment:
payment.setAutoConsume(auto)
# request user owned item, callback : has_purchased
func request_purchased():
if payment:
payment.requestPurchased()
func has_purchased(receipt, signature, sku):
if sku == "":
print("has_purchased : nothing")
emit_signal("has_purchased", null)
else:
print("has_purchased : ", sku)
emit_signal("has_purchased", sku)
# purchase item
# callback : purchase_success, purchase_fail, purchase_cancel, purchase_owned
func purchase(item_name):
if payment:
# transaction_id could be any string that used for validation internally in java
payment.purchase(item_name, "transaction_id")
func purchase_success(receipt, signature, sku):
print("purchase_success : ", sku)
emit_signal("purchase_success", sku)
func purchase_fail():
print("purchase_fail")
emit_signal("purchase_fail")
func purchase_cancel():
print("purchase_cancel")
emit_signal("purchase_cancel")
func purchase_owned(sku):
print("purchase_owned : ", sku)
emit_signal("purchase_owned", sku)
# consume purchased item
# callback : consume_success, consume_fail
func consume(item_name):
if payment:
payment.consume(item_name)
# consume all purchased items
func consume_all():
if payment:
payment.consumeUnconsumedPurchases()
func consume_success(receipt, signature, sku):
print("consume_success : ", sku)
emit_signal("consume_success", sku)
# if consume fail, need to call request_purchased() to get purchase token from google
# then try to consume again
func consume_fail():
emit_signal("consume_fail")
# no purchased item to consume
func consume_not_required():
emit_signal("consume_not_required")
# detail info of IAP items
# sku_details = {
# product_id (String) : {
# type (String),
# product_id (String),
# title (String),
# description (String),
# price (String), # this can be used to display price for each country with their own currency
# price_currency_code (String),
# price_amount (float)
# },
# ...
# }
var sku_details = {}
# query for details of IAP items
# callback : sku_details_complete
func sku_details_query(list):
if payment:
var sku_list = StringArray(list)
payment.querySkuDetails(sku_list)
func sku_details_complete(result):
print("sku_details_complete : ", result)
for key in result.keys():
sku_details[key] = result[key]
emit_signal("sku_details_complete")
func sku_details_error(error_message):
print("error_sku_details = ", error_message)
emit_signal("sku_details_error")

View File

@@ -0,0 +1,70 @@
extends Control
onready var alert = get_node("alert")
func _ready():
iap.set_auto_consume(false)
iap.connect("purchase_success", self, "on_purchase_success")
iap.connect("purchase_fail", self, "on_purchase_fail")
iap.connect("purchase_cancel", self, "on_purchase_cancel")
iap.connect("purchase_owned", self, "on_purchase_owned")
iap.connect("has_purchased", self, "on_has_purchased")
iap.connect("consume_success", self, "on_consume_success")
iap.connect("consume_fail", self, "on_consume_fail")
iap.connect("sku_details_complete", self, "on_sku_details_complete")
get_node("purchase").connect("pressed", self, "button_purchase")
get_node("consume").connect("pressed", self, "button_consume")
get_node("request").connect("pressed", self, "button_request")
get_node("query").connect("pressed", self, "button_query")
func on_purchase_success(item_name):
alert.set_text("Purchase success : "+item_name)
alert.popup()
func on_purchase_fail():
alert.set_text("Purchase fail")
alert.popup()
func on_purchase_cancel():
alert.set_text("Purchase cancel")
alert.popup()
func on_purchase_owned(item_name):
alert.set_text("Purchase owned : "+item_name)
alert.popup()
func on_has_purchased(item_name):
if item_name == null:
alert.set_text("Don't have purchased item")
else:
alert.set_text("Has purchased : "+item_name)
alert.popup()
func on_consume_success(item_name):
alert.set_text("Consume success : "+item_name)
alert.popup()
func on_consume_fail():
alert.set_text("Try to request purchased first")
alert.popup()
func on_sku_details_complete():
alert.set_text("Got detail info : "+iap.sku_details["item_test_a"].to_json())
alert.popup()
func button_purchase():
iap.purchase("item_tess")
func button_consume():
iap.consume("item_tess")
func button_request():
iap.request_purchased()
func button_query():
iap.sku_details_query(["item_test_a", "item_test_b"])

BIN
misc/android_iap/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1 @@
gen_mipmaps=false

113
misc/android_iap/main.tscn Normal file
View File

@@ -0,0 +1,113 @@
[gd_scene load_steps=2 format=1]
[ext_resource path="res://iap_demo.gd" type="Script" id=1]
[node name="Control" type="Control"]
anchor/right = 1
anchor/bottom = 1
focus/ignore_mouse = false
focus/stop_mouse = true
size_flags/horizontal = 2
size_flags/vertical = 2
margin/left = 0.0
margin/top = 0.0
margin/right = 0.0
margin/bottom = 0.0
script/script = ExtResource( 1 )
[node name="purchase" type="Button" parent="."]
focus/ignore_mouse = false
focus/stop_mouse = true
size_flags/horizontal = 2
size_flags/vertical = 2
margin/left = 40.0
margin/top = 40.0
margin/right = 250.0
margin/bottom = 120.0
toggle_mode = false
enabled_focus_mode = 2
shortcut = null
text = "Purchase in app"
flat = false
[node name="consume" type="Button" parent="."]
focus/ignore_mouse = false
focus/stop_mouse = true
size_flags/horizontal = 2
size_flags/vertical = 2
margin/left = 40.0
margin/top = 150.0
margin/right = 250.0
margin/bottom = 230.0
toggle_mode = false
enabled_focus_mode = 2
shortcut = null
text = "Consume in app"
flat = false
[node name="request" type="Button" parent="."]
focus/ignore_mouse = false
focus/stop_mouse = true
size_flags/horizontal = 2
size_flags/vertical = 2
margin/left = 40.0
margin/top = 260.0
margin/right = 250.0
margin/bottom = 340.0
toggle_mode = false
enabled_focus_mode = 2
shortcut = null
text = "Request purchased"
flat = false
[node name="query" type="Button" parent="."]
focus/ignore_mouse = false
focus/stop_mouse = true
size_flags/horizontal = 2
size_flags/vertical = 2
margin/left = 40.0
margin/top = 370.0
margin/right = 250.0
margin/bottom = 450.0
toggle_mode = false
enabled_focus_mode = 2
shortcut = null
text = "Query in app items"
flat = false
[node name="alert" type="AcceptDialog" parent="."]
visibility/visible = false
focus/ignore_mouse = false
focus/stop_mouse = true
size_flags/horizontal = 2
size_flags/vertical = 2
margin/left = 290.0
margin/top = 60.0
margin/right = 700.0
margin/bottom = 290.0
popup/exclusive = false
window/title = "Alert!"
dialog/hide_on_ok = true
[node name="Label" type="Label" parent="."]
focus/ignore_mouse = true
focus/stop_mouse = true
size_flags/horizontal = 2
size_flags/vertical = 0
margin/left = 300.0
margin/top = 40.0
margin/right = 932.0
margin/bottom = 207.0
text = "\"iap\" is located in Autoloads. See Scene > Project Settings > AutoLoad\n\nTo enable IAP module\n\n1. Scene > Project Settings\n2. write [Category : android] / [Property : modules] / [Type : String] and click Add\n3. Click \"Android\" on left panel\n4. double click on right filed of \"modules\"\n5. write \"org/godotengine/godot/GodotPaymentV3\"\n\nTo test in-app purchase on android device,\n\n1. Need to add \"com.android.vending.BILLING\" permission at Export > Android > User Permissions\n2. Export APK and upload it as alpha or beta stage to Google Play Developer Console and publish it.\n (It\'s not published to public, but you and tester can access it.)\n3. There should be activated in-app item\n4. Any changes on Developer console will take 2~3 hours to take effect"
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1