Browse Source

add android iap demo

volzhs 9 năm trước cách đây
mục cha
commit
f31b406c8a

+ 13 - 0
misc/android_iap/engine.cfg

@@ -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 - 0
misc/android_iap/export.cfg

@@ -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 - 0
misc/android_iap/iap.gd

@@ -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")

+ 70 - 0
misc/android_iap/iap_demo.gd

@@ -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


+ 1 - 0
misc/android_iap/icon.png.flags

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

+ 113 - 0
misc/android_iap/main.tscn

@@ -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
+
+