RuStore中的支付操作
您可以通过RuStore内购买来变现您的应用。以下是四种实现方式:
- 在RuStore上架卖出应用。创建付费应用,将其上架至RuStore商店,并通过下载量获得收益支付。
请注意,在商店中销售应用程序只能带来一次性的收入。如果您 希望从应用中持续获得收入,建议考虑添加订阅服务和内购商品。
- 添加自动续订订阅功能。订阅服务让用户每月支付固定费用,即可享受应用或游戏内的额外特权。
- 添加消耗型商品。这是可多次购买并在应用内使用的消耗型商品。例如:游戏中的生命值加速包、提示道具、水晶和金币等消耗品。
- 添加非消耗型商品。与消耗型商品不同,此类商品仅支持单次购买,且无法在应用或游戏内消耗使用用户购买此类商品后即获得永久所有权。此类商品可能包含:应用内广告关闭功能、游戏隐藏关卡或高级虚拟装备。
所有付费商品均需通过RuStore控制台系统进行添加。
如何开始
要启用支付功能,请根据企业注册资料填写商业化接入申请表:
- 在俄罗斯联邦注册的法人实体及个体工商户。
- 未在俄罗斯联邦注册的外国公司。
- 具有自雇职业者身份的自然人。
支付受理条件
- 应用程序已到RuStore控制台上传。
请注意:Billing SDK不支持RuStore电视版的支付功能集成。
- 应用程序已通过审核(不必发布该应用程序)。
待测试应用构建版本(如 debug 版本)的签名必须与先前上传至RuStore控制台并通过审核的应用构建版本(如 release 版本)签名一致。
- 用户和应用程序不应在RuStore中被封锁。
- 在RuStore控制台中为应用程序启用了购买功能。
该服务在俄罗斯联邦以外有一些运作限制。
开发付费应用或产品
如果您选择了这种盈利方式,请在RuStore控制台 中将应用上架销售。
如果您想通过付费商品实现应用盈利,请通过RuStore控制台在应用内创建商品或订阅项目。
您随时可以修改商品和订阅的价格。保存更改后,商品将立即按新价格进行销售。对于订阅服务,降价将适用于所有用户(包括当前有效订阅持有者),而涨价仅影响新订阅用户。
SDK设置
请将RuStore SDK集成到您的应用中,以便用户能够购买商品或订阅服务。
支付如何运作
下图显示了您可以参考的配置和连接支付的示例算法。请考虑到您的项目运行特点。
使用SDK可以:
- 获取通过RuStore控制台创建的商品信息。
- 配置与银行应用的交互功能,实现用户直接跳转至支付页面并返回您的应用
- 初始化支付功能,以便用户可在应用内购买您添加的商品。
- 监控商品消耗流程,确保准确无误地向用户交付商品。
有关集成的详细信息,请参阅《支付SDK配置指南》
交易状态模型
消耗性产品购买状态模型 ( CONSUMABLES)
非消耗性产品购买状态模型(NON-CONSUMABLES)
订阅购买状态模型(SUBSCRIPTIONS)
未完成的支付处理
未完成的支付处理由开发者执行。
要确认CONSUMABLE类型的产品,并且状态为PAID的购买(详见获取购买信息),请调用购买消耗(确认)方法。 未经RuStore确认,款项将不会结算至开发者账户。此操作是完成购买流程并向用户交付商品的必要步骤。
如因任何原因无法交付已售商品,建议您主动取消该笔交易。如未及时处理,RuStore将在指定时间后自动取消该笔交易。
请谨慎使用订单取消功能,仅限极端情况(如用户已完成支付(订单状态为PAID),但您无法交付商品时)。其他情况下不建议手动取消订单——RuStore会自动处理处于INVOICE_CREATED等中间状态的交易。
通过快速支付系统或手机账户支付时的特别注意事项:
- 当取消PAID状态的订单时,资金不会解冻撤销(reverse),而是通过退款(refund)返还用户,因为该支付方式不支持两阶段支付技术。在此情况下,将从开发者账户扣除不予退还的手续费。因此,在取消订单前请务必确认该操作确有必要。
若您使用自定义支付处理逻辑,强烈建议在取消订单前额外核查当前交易状态。
您也可以通过RuStore API确认或取消交易:
如果用户已支付了产品,但您因某些原因无法将这个产品交付给用户,要取消该购买,应调用状态为PAID购买取消方法。
在其他商店接受付款
现在,即使用户设备未安装RuStore,也能在您的应用中完成商品和订阅的支付。 订阅支付需通过VK ID授权,而应用内商品购买仅需提供电子邮箱以接收收据。
优点
您将能够增加收入并吸引忠诚的受众,因为:
- 用户即使尚未安装RuStore也可以支付购买;
- 您可以通过在不同平台上发布应用程序来继续接受支付。
未经授权的购买特点
- 使用VK ID进行未经授权的支付仅适用于在应用内购买消耗性和非消耗性产品。 未经授权无法支付订阅的费用。
- 以便发送收据,买家需提供e-mail。
- 支付方式不会被保存,因此每次购买都需重新填写支付信息。 为确保支付方式可保存并在付款时正常调用,买家需通过VK ID完成身份认证。
- 应用程序禁止在未经授权认证的情况下查询购买记录列表,该操作对未登录用户不可执行。 为避免调用此SDK方法,请参阅SDK集成前的修改建议。
- 要向未经授权的买家退款,只能使用他在购买时指定的电子邮件中收到的支票。 详见向未经授权的用户退款。
授权购买特点
- 订阅支付场景下,VK ID身份认证为强制要求。 用户可选择在支付应用内商品时进行账号授权认证。
- 当支付SDK接收到购买记录列表查询请求(
getPurchases
方法)时,用户必须通过VK ID完成身份认证。 为减少授权验证请求次数,请参阅SDK集成前的修改建议。
使用SDK前建议
在迁移到支付SDK当前版本前,我们建议完成如下改进:
-
减少授权请求的次数
您的应用程序可通过SDK查询购买记录列表。 例如:当需要向用户显示游戏余额、订阅状态或验证是否已购买应用PRO版本时。
对于这种请求,用户几乎每次都要通过VK ID授权。 这很不方便,并且用户可能很难受。
为减少授权验证请求次数,请将支付SDK的调用(
getPurchases
方法)替换为应用内部逻辑处理。 您可选择在应用本地或服务器存储购买记录列表,并通过RuStore API定期同步更新数据。同时,您可以激励用户使用他们账户(例如 Google Play)来保存游戏进度和购买。
如果排除上述的SDK访问,用户只在支付时需要通过授权。
-
设定数据分析
如果您在不同平台上发布了应用程序,并希望根据应用程序安装源来分离支付流,请基于build flavors创建不同的构建选项。 这将允许您根据分销渠道收集分析数据。
授权请求特点
下表描述了用户在什么条件下以及多常收到授权请求。
条件 | 授权请求 | 特点 |
---|---|---|
设备上未安装RuStore | 授权请求会出现:
| 调用 |
设备上已安装RuStore,但用户未经授权。 | 授权请求可以在调用下列的SDK方法时出现:
| 调用 |
设备上已安装RuStore,用户已通过授权。 | 用户的授权检查顺畅进行 |
获取服务器通知
要在应用程序中在线接收支付通知,请设置服务器通知。这样可以简化操作:您无需定期查询支付状态——任何支付状态更新时,RuStore 会自动发送通知。
集成API
使用API可以提升您应用的安全性。无法通过破解手段免费获取商品和订阅服务。
要使用 RuStore API,请先完成身份认证并获取 JWE 令牌。
使用API方法为:
- 获取支付数据,以便追踪应用内购买、付费商品和订阅付款情况。
- 获取订阅数据。您可以使用该方法,其结构中详细注明了订阅的有效期、订阅状态(例如是否活跃或已暂停)等。另一种获取订阅数据的方法适合已经使用类似工具的开发者。
- 若只需获取订阅状态(无需追踪其他参数)。
购买的服务器端验证
- Kotlin
- Java
如需通过RuStore API在服务端验证购买状态,您可使用PurchaseResult中的subscriptionToken(当purchaseProduct调用成功时返回)。
SubscriptionToken 由invoiceId和userId组成,以英文句点连接,格式为:$invoiceId.$userId .
val purchasesUseCase: PurchasesUseCase = billingClient.purchases
purchasesUseCase.purchaseProduct(productId).addOnSuccessListener { paymentResult ->
if (paymentResult is PaymentResult.Success) {
val subscriptionToken = paymentResult.subscriptionToken
yourApi.validate(subscriptionToken)
}
}
也可通过Purchase实体获取subscriptionToken。可通过getPurchases方法获取Purchase实体。
val purchasesUseCase: PurchasesUseCase = billingClient.purchases
purchasesUseCase.getPurchases().addOnSuccessListener { purchases ->
purchases.forEach { purchase ->
yourApi.validate(purchase.subscriptionToken)
}
}
如需通过RuStore API在服务端验证购买状态,您可使用PurchaseResult中的subscriptionToken(当purchaseProduct调用成功时返回)。
SubscriptionToken 由invoiceId和userId组成,以英文句点连接,格式为:$invoiceId.$userId .
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.purchaseProduct(productId).addOnSuccessListener(paymentResult -> {
if (paymentResult instanceof PaymentResult.Success) {
String subscriptionToken = ((PaymentResult.Success) paymentResult).getSubscriptionToken();
yourApi.validate(subscriptionToken);
}
});
也可通过Purchase实体获取subscriptionToken。可通过getPurchases方法获取Purchase实体。
PurchasesUseCase purchasesUseCase = billingClient.getPurchases();
purchasesUseCase.getPurchases().addOnSuccessListener(purchases -> {
for (Purchase purchase : purchases) {
yourApi.validate(purchase.getSubscriptionToken());
}
});