跳到主要内容

5.0.0

注意

该门户网站正在开发中。文档的完整版本请看这里.

实现示例

为了正确集成支付,建议您参阅示例应用程序:

https://gitflic.ru/project/rustore/godot-rustore-billing/file?file=example&branch=master

支付条件

为了进行支付,必须遵守以下条件:

  1. 用户的设备上必须安装 RuStore。
  2. 用户必须在 RuStore 中获得授权。
  3. 用户和应用程序不应在RuStore中被封锁。
  4. 应用程序必须在 RuStore 控制台中启用购买功能。

在项目中集成

为了在您的项目中进行集成,您需要从 https://gitflic.ru/project/rustore/godot-rustore-billing/release页面下载归档文件。

解压缩 zip 文件,并将 rustore-billing.aar 和 RustoreBilling.gdap 文件添加到您项目的 /android/plugins 文件夹中。android/plugins

example/    \`\`android/        \`\`plugins/            \`\`rustore-billing-release.aar            \`\`RustoreBilling.gdap

为了通过第三方应用程序(如快速支付系统(SBP)或SberPay)正确进行支付,您需要正确实现 deeplink 的处理。为此,您需要在 android/build/AndroidManifest.xml 中指定带有您项目方案的 intent-filter:

\<activity    \`\`android:name= \".sample.MainActivity\" \>     \`\`\<intent-filter\>        \`\`\<action android:name= \"android.intent.action.MAIN\" /\>        \`\`\<category android:name= \"android.intent.category.LAUNCHER\" /\>    \`\`\</intent-filter\>     \`\`\<intent-filter\>        \`\`\<action android:name= \"android.intent.action.VIEW\" /\>        \`\`\<category android:name= \"android.intent.category.DEFAULT\" /\>        \`\`\<category android:name= \"android.intent.category.BROWSABLE\" /\>        \`\`\<data android:scheme= \"yourappscheme\" /\>    \`\`\</intent-filter\> \</activity\>

中"yourappscheme" - 是您的 deeplink 方案,可以更改为其他方案。

这个方案应与 init() 方法中传递的方案匹配。

项目导出与连接插件

为了在您的Godot项目中使用插件,您需要在导出设置中启用它。

完成所有设置后,您可以在项目中使用插件。

初始化

在调用库的方法之前,需要先进行其初始化。要进行初始化,请调用 init() 方法:

if Engine.has_singleton( \"RustoreBilling\" ):        \`\`billing  = Engine.get_singleton( \"RustoreBilling\" )                \`\`billing.init( \"123456\" ,  \"yourappscheme://iamback\" )                \`\`billing.rustore_is_available.connect(\_on_availability)        \`\`billing.rustore_purchase_product.connect(\_on_purchase)        \`\`billing.rustore_delete_purchase.connect(\_on_delete)        \`\`billing.rustore_confirm_purchase.connect(\_on_confirm)        \`\`billing.rustore_get_purchases.connect(\_on_get_purchases)        \`\`billing.rustore_get_purchase.connect(\_on_get_purchase)        \`\`billing.rustore_get_products.connect(\_on_get_products)

123456 - 来自 RuStore 控制台的应用程序代码(例如:https://console.rustore.ru/apps/123456)。

  • yourappscheme://iamback - 用于通过第三方应用程序支付后返回您的应用程序的deeplink方案 (例如SberPay 或 快速支付系统(SBP))。SDK 会为这个方案生成它自己的宿主。

要的是,传递给 deeplinkScheme 的 deeplink 方案必须与 AndroidManifest.xml 中"处理 deeplink"部分指定的方案匹配。

插件初始化后,将连接到所有可用的信号。

检查支付功能的可用性

为了检查支付的可用性,需要满足以下条件:

  1. 用户的设备上必须安装 RuStore。
  2. RuStore 必须支持支付功能。
  3. 用户必须在 RuStore 中获得授权。
  4. 用户和应用程序不应在RuStore中被封锁。
  5. 应用程序必须在 RuStore 控制台中启用购买功能。

果所有条件都满足,isAvailable() 方法将返回 true 值。

func \_availability():    \`\`if billing ! = null:        \`\`billing.isAvailable()func \_on_availability(data: Dictionary):    \`\`if data\[ \'status\' \]  = = \'success\' :        \`\`print ( \'success\' )        \`\`print (data\[ \'result\' \])    \`\`elif data\[ \'status\' \]  = = \'failure\' :        \`\`print ( \'failure\' )        \`\`print (data\[ \'message\' \])

_on_availability(data: Dictionary) 方法 - 处理 rustore_is_available 信号的处理器,它接收关于 RuStore 可用性的消息。

通过 data['status'] 键存储的请求状态。可能的值包括:

  • success - 请求成功完成。在这种情况下,data['result'] 键将存储 true(如果 RuStore 可用)或 false(如果不可用)。
  • failure - 请求出错。错误信息存储在 data['message'] 键中。

获取产品列表

为了获取产品,您需要使用 getProducts(ids) 方法。

func \_get_products():    \`\`if billing ! = null:        \`\`billing.getProducts(\[            \`\`\"example1\" ,            \`\`\"example2\"        \`\`\])func \_on_get_products(data: Dictionary):     \`\`if data\[ \'status\' \]  = = \'success\' and data.has( \'items\' ):        \`\`var items  = data\[ \'items\' \]        \`\`for key  in items:            \`\`print (items\[key\])    \`\`elif data\[ \'status\' \]  = = \'failure\' :        \`\`print ( \'failure\' )        \`\`print (data\[ \'message\' \])

_on_get_products(data: Dictionary) 方法 - 处理 rustore_get_products 信号的处理器,它接收包含可用产品列表的消息。

  • ids - 产品标识符列表。

过 data['status'] 键存储请求的执行状态。可能的值包括:

  • success - 请求成功完成。在这种情况下,data['items'] 键将存储可用产品的列表。
  • failure - 请求出错。错误信息存储在 data['message'] 键中。

品的可用字段:

  • product_id - 产品标识符;
  • product_type - 产品类型;
  • product_status - 产品状态;
  • price_lable - 格式化的产品价格,包括[language]语言的货币符号;
  • price - 以最小单位(戈比)表示的价格;
  • currency - ISO 4217货币代码;
  • language - 使用 BCP 47 编码指定的语言;
  • title - 产品名称,以[language]语言表示;
  • description - 产品描述,以[language]语言表示;
  • image_url - 图片链接;
  • promo_image_url - 促销图片链接;
  • subscription - 订阅描述,仅对于类型为 subscription 的产品返回。

用字段:subscription

  • subscription_period - 订阅周期;
  • free_trial_period - 订阅试用期;
  • grace_period - 订阅宽限期;
  • introductory_price - 格式化的介绍性订阅价格,包括product:language语言的货币符号;
  • introductory_price_amount - 以货币最小单位(戈比)表示的介绍性价格;
  • introductory_price_period - 介绍性价格计算周期。

用于 subscription_period, free_trial_period, grace_period 和 introductory_price_period 键的字段:introductory_price_period

  • years - 年数;
  • months - 月数;
  • days - 天数。

获取购买列表

要获取购买列表,请使用getPurchases()方法:

func \_get_purchases():    \`\`if billing ! = null:        \`\`billing.getPurchases()func \_on_get_purchases(data: Dictionary):    \`\`if data\[ \'status\' \]  = = \'success\' and data.has( \'items\' ):        \`\`var items  = data\[ \'items\' \]        \`\`for key  in items:            \`\`print (items\[key\])    \`\`elif data\[ \'status\' \]  = = \'failure\' :        \`\`print ( \'failure\' )        \`\`print (data\[ \'message\' \])

_on_get_purchases(data: Dictionary) 方法 - 处理 rustore_get_purchases 信号的处理器,它接收包含可用购买列表的消息。

通过 data['status'] 键存储请求的执行状态。可能的值包括:

  • success - 请求成功完成。在这种情况下,data['items'] 键将存储可用购买的列表。
  • failure - 请求出错。错误信息存储在 data['message'] 键中。

买的可用字段:

  • purchase_id - 购买标识符;
  • product_id - 产品标识符;
  • product_type - 产品类型;
  • invoice_id - 账单标识符;
  • description - 购买描述;
  • language - 使用 BCP 47 编码指定的语言;
  • purchase_time - 购买时间(RFC 3339 格式);
  • order_id - 应用程序生成的唯一支付标识符(uuid);
  • amount_lable - 格式化的购买价格,包括[language]语言的货币符号;
  • amount - 以最小货币单位表示的价格;
  • currency - ISO 4217货币代码;
  • quantity - 产品数量;
  • purchase_state - 购买状态;
  • developer_payload - 开发者指定的字符串,包含关于订单的附加信息;
  • subscription_token - 用于在服务器端验证购买的令牌。有关服务器端购买验证的更多信息,请参阅购买的服务器端验证部分。

买状态的可能值:

  • CREATED - 已创建;
  • INVOICE_CREATED - 已创建,等待支付;
  • CONFIRMED - 已确认;
  • PAID - 已支付;
  • CANCELLED - 购买已取消;
  • CONSUMED - 已确认购买消耗;
  • CLOSED - 订阅已取消。

关购买状态模型的更多信息,请参阅"获取用户购买列表"部分

获取购买信息

要获取购买列表,请使用purchaseInfo()方法:

func \_purchase_info( id : String):    \`\`if billing ! = null:        \`\`billing.purchaseInfo( id )func \_on_get_purchase(data: Dictionary):    \`\`if data\[ \'status\' \]  = = \'success\' :        \`\`print ( \'success\' )        \`\`print (data\[ \'purchase\' \])    \`\`elif data\[ \'status\' \]  = = \'failure\' :        \`\`print ( \'failure\' )        \`\`print (data\[ \'message\' \])

_on_get_purchase (data: Dictionary) 方法 - 处理 rustore_get_purchase 信号的处理器,它接收包含购买的消息。

  • id - 购买标识符。

过 data['status'] 键存储的请求状态。可能的值包括:

  • success - 请求成功完成。在这种情况下,data['items'] 键将存储可用购买的列表。
  • failure - 请求出错。错误信息存储在 data['message'] 键中。

买的可用字段data['purchase']

  • purchase_id - 购买标识符;

  • product_id - 产品标识符;

  • product_type - 产品类型;

  • invoice_id - 账单标识符;

  • description - 购买描述;

  • language - 使用 BCP 47 编码指定的语言;

  • purchase_time - 购买时间(RFC 3339 格式);

  • order_id - 应用程序生成的唯一支付标识符(uuid);

  • amount_lable - 格式化的购买价格,包括[language]语言的货币符号;

  • amount - 以最小货币单位表示的价格;

  • currency - ISO 4217货币代码;

  • quantity - 产品数量;

  • purchase_state - 购买状态;

  • developer_payload - 开发者指定的字符串,包含关于订单的附加信息;

  • subscription_token - 用于在服务器端验证购买的令牌。有关服务器端购买验证的更多信息,请参阅购买的服务器端验证部分。

  • 购买状态的可能值:

  • CREATED - 已创建;

  • INVOICE_CREATED - 已创建,等待支付;

  • CONFIRMED - 已确认;

  • PAID - 已支付;

  • CANCELLED - 购买已取消;

  • CONSUMED - 已确认购买消耗;

  • CLOSED - 订阅已取消。

关购买状态模型的更多信息,请参阅"获取用户购买列表"部分

购买产品

您可以使用 purchaseProduct(id) 方法来进行购买:

func \_purchase( id : String):    \`\`var params  = {        \`\`\"order_id\" :  \"1234\" ,        \`\`\"quantity\" :  1 ,        \`\`\"payload\" :  \"example\"    \`\`}    \`\`if billing ! = null:        \`\`billing.purchaseProduct( id , params)func \_on_purchase(data: Dictionary):    \`\`if data\[ \'status\' \]  = = \'cancelled\' :        \`\`print ( \'cancelled\' )        \`\`if data\[ \'purchase\' \] ! = \'\':            \`\`\_delete(data\[ \'purchase\' \])    \`\`elif data\[ \'status\' \]  = = \'success\' :        \`\`print ( \'success\' )        \`\`print (data)    \`\`elif data\[ \'status\' \]  = = \'failure\' :        \`\`print ( \'failure\' )        \`\`print (data\[ \'message\' \])

_on_purchase(data: Dictionary) 方法 - 处理 rustore_purchase_product 信号的处理器,它接收包含购买的消息。

  • id - 产品标识符;
  • order_id - 订单标识符,在AnyApp端创建(可选。如果未指定,则会自动生成);
  • quantity - 产品数量(可选);
  • payload - AnyApp 开发者的附加信息(可选)。

过 data['status'] 键存储的请求状态。可能的值包括:

  • success - 请求成功完成。
  • failure - 请求出错。错误信息存储在 data['message'] 键中。
  • cancelled - 用户取消了购买。

买的可用字段:

  • purchase_id - 购买标识符;
  • order_id - 订单标识符,在AnyApp端创建(可选。如果未指定,则会自动生成);
  • invoice_id - 账单标识符;
  • product_id - 产品标识符;
  • quantity - 产品数量(可选);
  • payload - AnyApp 开发者的附加信息(可选)。
  • error_code - 错误代码,如果请求状态为 failure。

购买确认

RuStore 包含以下类型的产品:

  • CONSUMABLE - 消耗的(可以多次购买,例如应用中的水晶)。
  • NON_CONSUMABLE非消耗的(只能购买一次,例如禁用应用程序中的广告)。
  • SUBSCRIPTION - 订阅(可以购买一段时间,例如流媒体服务的订阅)。

有处于 purchase_state == "PAID" 状态的 CONSUMABLE 类型产品需要消耗。

您可以使用 confirmPurchase(id) 方法来消耗购买:

func \_confirm( id : String):    \`\`var params  = {        \`\`\"payload\" :  \"123\"    \`\`}    \`\`if billing ! = null:        \`\`billing.confirmPurchase( id , params)func \_on_confirm(data: Dictionary):    \`\`print (data)    \`\`if data\[ \'status\' \]  = = \'success\' :        \`\`print ( \'success\' )      \`\`elif data\[ \'status\' \]  = = \'failure\' :        \`\`print ( \'failure\' )        \`\`print (data\[ \'message\' \])

_on_confirm(data: Dictionary)方法处理 rustore_get_purchase 信号的处理器,它接收包含购买的消息。

  • id - 购买标识符。
  • payload - 开发者指定的字符串,包含订单的附加信息(可选)。

过 data['status'] 键存储的请求状态。可能的值包括:

  • success - 请求成功完成。
  • failure - 请求出错。错误信息存储在 data['message'] 键中

取消购买

要取消购买,您可以使用 deletePurchase(id) 方法:

func \_delete( id : String):    \`\`if billing ! = null:        \`\`billing.deletePurchase( id )func \_on_delete(data: Dictionary):    \`\`print (data)    \`\`if data\[ \'status\' \]  = = \'success\' :        \`\`print ( \'success\' )    \`\`elif data\[ \'status\' \]  = = \'failure\' :        \`\`print ( \'failure\' )        \`\`print (data\[ \'message\' \])

_on_delete(data: Dictionary) 方法 - 处理 rustore_delete_purchase 信号的处理器,它接收包含删除购买的消息。

  • id - 购买标识符。

过 data['status'] 键存储的请求状态。可能的值包括:

  • success - 请求成功完成。
  • failure - 请求出错。错误信息存储在 data['message'] 键中。

果您有与删除购买相关的逻辑,请使用此方法。购买将在20分钟后自动取消,或者在同一客户端进行重复购买时取消。