Android应用内购买

Godot引擎集成了GooglePaymentsV3模块,我们可以在游戏中实现应用内购买。

Godot引擎演示项目存储库有一个名为android-iap示例项目。 它包括一个用于android IAP的gdscript接口。

在这里检查存储库 https://github.com/godotengine/godot-demo-projects

找到iap.gd脚本

godot-demo-projects/misc/android_iap

将其添加到自动加载列表并将其命名为IAP,以便我们可以在游戏中的任何位置引用它。

获取产品详细信息

在开始游戏时,我们需要从Google获取商品详情,例如产品价格,描述和本地化价格字符串等。

#First listen to the sku details update callback
IAP.connect("sku_details_complete",self,"sku_details_complete")

#Then ask google the details for these items
IAP.sku_details_query(["pid1","pid2"]) #pid1 and pid2 are our product ids entered in Googleplay dashboard


#This will be called when sku details are retrieved successfully
func sku_details_complete():
    print(IAP.sku_details) #This will print the details as JSON format, refer the format in iap.gd
    print(IAP.sku_details["pid1"].price) #print formatted localized price

在我们的商店场景中, 我们可以使用IAP详细信息显示标题,价格和描述。

检查用户是否购买了商品

在开始游戏时,我们可以检查用户是否购买了任何产品。 您应该在您的游戏加载后的2/3秒之后再做这件事。 如果我们在游戏启动时首先执行此操作,IAP可能无法初始化,我们的游戏将在启动时崩溃。

#Add a listener first
IAP.connect("has_purchased",self,"iap_has_purchased")
IAP.request_purchased() #Ask Google for all purchased items

#This will call for each and every user purchased products
func iap_has_purchased(item_name):
    print(item_name) #print the name of purchased items

Google IAP政策规定,如果用户更换手机或重新安装相同的应用,游戏应恢复用户的购买。 我们可以使用上面的代码来检查用户购买了哪些产品,从而让我们的游戏做出相应的响应。

简单购买

我们可以将此购买逻辑放在产品的购买按钮上。

#First listen for purchase_success callback
IAP.connect("purchase_success",self,"purchase_success_callback")

#Then call purchase like this
IAP.purchase("pid1") #replace pid1 with your product id
IAP.purchase("pid2") #replace pid2 with your another product id

#This function will be called when the purchase is a success
func purchase_success_callback(item):
    print(item + " has purchased")

我们还可以为购买流程实施其他信号,并根据需要改善用户体验。

purchase_fail - 当购买因任何原因失败时

purchase_cancel - 当用户取消购买时

purchase_owned - 用户之前已经购买过该产品

消耗品和非消耗品

有两种类型的产品 - 消耗品和非消耗品。 消耗品 被购买和消耗,例如:可以多次购买的治疗药水。 非消耗品 是一次性购买,例如:等级包。

Google在其信息中心中没有这种划分。 如果我们的产品是消耗品,并且如果用户购买了它,则在消费之前将无法购买。 因此,我们应该为消耗品调用消费方法,不要为非消耗品调用消费。

IAP.connect("consume_success",self,"on_consume_success")
IAP.consume("pid")

func on_consume_success(item):
    print(item + " consumed")

如果我们的游戏只有消耗品,我们不必这样做。 我们可以将其设置为在购买后自动消耗该物品。

IAP.set_auto_consume(true)

如果我们的游戏只有非消耗品,我们可以

IAP.set_auto_consume(false)

我们只能,在游戏开始时,设置一次自动消耗的值。

测试

如果我们在Google信息中心中添加gmail ID作为测试人员,则该测试人员可以购买商品,但不会向他们收费。 另一种测试IAP的方法是使用我们为游戏生成的兑换代码,因为购买流程是相同的。

第三种测试方法是开发侧。 如果我们按如下所示放置产品ID,我们将根据产品ID获得静态固定响应。 这是在进入仪表板之前测试事物的快速方法。

  • android.test.purchased
  • android.test.canceled
  • android.test.refunded
  • android.test.item_unavailable