From f31b406c8a9a9c72fff3f629ebb890991c3a5991 Mon Sep 17 00:00:00 2001 From: volzhs Date: Sun, 26 Jun 2016 03:13:31 +0900 Subject: [PATCH] add android iap demo --- misc/android_iap/engine.cfg | 13 ++ misc/android_iap/export.cfg | 283 ++++++++++++++++++++++++++++++++ misc/android_iap/iap.gd | 124 ++++++++++++++ misc/android_iap/iap_demo.gd | 70 ++++++++ misc/android_iap/icon.png | Bin 0 -> 2736 bytes misc/android_iap/icon.png.flags | 1 + misc/android_iap/main.tscn | 113 +++++++++++++ 7 files changed, 604 insertions(+) create mode 100644 misc/android_iap/engine.cfg create mode 100644 misc/android_iap/export.cfg create mode 100644 misc/android_iap/iap.gd create mode 100644 misc/android_iap/iap_demo.gd create mode 100644 misc/android_iap/icon.png create mode 100644 misc/android_iap/icon.png.flags create mode 100644 misc/android_iap/main.tscn diff --git a/misc/android_iap/engine.cfg b/misc/android_iap/engine.cfg new file mode 100644 index 00000000..ed3d3942 --- /dev/null +++ b/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" diff --git a/misc/android_iap/export.cfg b/misc/android_iap/export.cfg new file mode 100644 index 00000000..f2ff04ee --- /dev/null +++ b/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="" diff --git a/misc/android_iap/iap.gd b/misc/android_iap/iap.gd new file mode 100644 index 00000000..36de3299 --- /dev/null +++ b/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") diff --git a/misc/android_iap/iap_demo.gd b/misc/android_iap/iap_demo.gd new file mode 100644 index 00000000..3c5d07df --- /dev/null +++ b/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"]) + diff --git a/misc/android_iap/icon.png b/misc/android_iap/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c019ef64a1516db91617204000feb3987f764c9d GIT binary patch literal 2736 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 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 + +