跳到主要内容

支付问题的FAQ

注意

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

Q: 如何修复"Application is not verified yet"错误?

A: 出现此错误的情况包括:

二点需要按以下方式重新检查:

  • build.gradle 中指定的 applicationId 必须与您在 RuStore 控制台发布的 apk 文件的 applicationId 匹配。
  • keystore 的签名必须与发布在 RuStore 控制台的应用程序签名匹配。确保使用的buildType(例如,debug)使用与发布的应用程序(例如,release)相同的签名。

了支付功能的运作,需要完全发布应用程序,仅通过审核是不够的。不久的将来,逻辑将被重新设计,以便测试支付功能仅需通过审核即可。

Q: 如何修复"之前创建的产品'...'的购买,数量为...,金额为...卢布,在另一个会话中支付"的错误?

A: 当尝试购买之前中断且未通过deletePurchase和confirmPurchase方法转入最终状态的产品时,会出现此错误。

这通常发生在流程被中断,且由于流程未正确结束,未在purchaseProduct中调用删除或消耗操作时。

对于这种情况,在应用启动或打开商店时,需要对"悬而未决"的购买进行取消或消耗处理。

以下是实现购买列表处理的示例。启动应用程序或打开商店屏幕时运行此代码:

val purchasesUseCase = billingClient.purchases
val purchases = purchasesUseCase.getPurchases().await().purchases.orEmpty()
purchases.forEach { purchase ->
val purchaseId = purchase.purchaseId
if (purchaseId != null) {
when (purchase.purchaseState) {
PurchaseState.CREATED, PurchaseState.INVOICE_CREATED -> {
purchasesUseCase.deletePurchase(purchaseId).await()
}
PurchaseState.PAID -> {
purchasesUseCase.confirmPurchase(purchaseId).await()
}
else -> Unit
}
}
}

purchaseProduct()中,也需要执行购买的取消或消耗操作。

在purchaseProduct()中处理购买,将购买转换为最终状态,确认或取消它,可以这样实现:

private fun purchaseProduct(product: Product) {
val purchasesUseCase = billingClient.purchases
purchasesUseCase.purchaseProduct(product.productId)
.addOnSuccessListener { paymentResult ->
handlePaymentResult(paymentResult, product)
}
.addOnFailureListener {
// Handle error
}
}

private fun handlePaymentResult(paymentResult: PaymentResult, product: Product) {
when (paymentResult) {
is PaymentResult.InvalidPurchase -> {
paymentResult.purchaseId?.let { deletePurchase(it) }
}
is PaymentResult.PurchaseResult -> {
when (paymentResult.finishCode) {
PaymentFinishCode.SUCCESSFUL_PAYMENT -> {
if (product.productType == ProductType.CONSUMABLE) {
confirmPurchase(paymentResult.purchaseId)
}
}
PaymentFinishCode.CLOSED_BY_USER,
PaymentFinishCode.UNHANDLED_FORM_ERROR,
PaymentFinishCode.PAYMENT_TIMEOUT,
PaymentFinishCode.DECLINED_BY_SERVER,
PaymentFinishCode.RESULT_UNKNOWN -> {
deletePurchase(paymentResult.purchaseId) }
}
}
else -> Unit
}
}

何消耗和取消购买在"购买消耗和取消的流程"部分有描述。

可以在"获取购买列表"部分了解购买的状态模型。

Q: 如何进行购买的服务器端验证?

A: 首先,需要获取subscriptionToken,它是用户购买的唯一标识符,此过程在"购买的服务器端验证"文章中有描述。

然后,需要将subscriptionToken发送到您的backend,在那里可以使用"根据其subscription token获取支付信息的方法"来请求购买信息。

Q: 如何在调用confirmPurchase或deletePurchase时修复404错误?

A: 确保您在confirmPurchase和deletePurchase方法的参数中传递purchaseId:

val purchasesUseCase = billingClient.purchases
val purchases = purchasesUseCase.getPurchases().await().purchases.orEmpty()
purchases.forEach { purchase ->
val purchaseId = purchase.purchaseId
if (purchaseId != null) {
when(purchase.purchaseState) {
PurchaseState.CREATED, PurchaseState.INVOICE_CREATED -> {
// purchasesUseCase.deletePurchase(purchaseId = purchase.productId).await() WRONG
purchasesUseCase.deletePurchase(purchaseId = purchaseId).await() // CORRECT
}
PurchaseState.PAID -> {
// purchasesUseCase.confirmPurchase(purchaseId = purchase.productId).await() WRONG
purchasesUseCase.confirmPurchase(purchaseId = purchaseId).await() // CORRECT
}
else -> Unit
}
}
}

Q: 如何修复"方法不可用"的错误?

A: consoleApplicationId 必须与 RuStore 控制台中的应用程序代码匹配(例如:https://console.rustore.ru/apps/111111)。

Q: 如何取消订阅?

A: 没有用于取消订阅的方法,您只能在RuStore应用中取消自动续订。

可以通过deeplink打开订阅页面:

startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("rustore://profile/subscriptions")))

下是带有deeplinks列表的页面:RuStore_deeplinks

Q: 可以在Google Play、Huawei Store上发布带有RuStore SDK的应用吗?

A: 由于开发者在Google Play上用Google的签名对应用进行签名,而在RuStore上使用他们自己的签名,因此签名始终不会匹配,RuStore SDK在Google Play(或其他应用商店)内将无法工作。这意味着,为了RuStore SDK的正确运行,用户需要从RuStore下载应用并在其中支付订阅费用。

Q: RuStore的packageName是什么?

A: ru.vk.store.

Q: 如何确定应用是从哪个商店安装的?

A: 可以通过以下方式进行判断:

val installerPackage = packageManager.getInstallerPackageName(applicationInfo.packageName)

返回ru.vk.store,但此功能不稳定:

  • 这种方法只适用于最初从RuStore安装的应用。如果最初是从Google Play或其他方式安装的,那么安装来源将是标准的包安装程序。
  • 如果使用兼容模式安装(如部分Xiaomi机型),则安装源将为小米系统安装程序。
  • 如果删除了RuStore,则安装来源将被完全删除。重新安装不会恢复安装来源。

们建议为RuStore制作单独的buildFlavor。

Q: 为什么在支付方法中出现timeout? (PayLibBackendFailure$TimeoutError)

A: RuStore SDK的支付功能在俄罗斯境外不可用。开启VPN也可能会导致问题。

Q: 如何测试支付?使用真实的银行卡吗?

A: 只能使用真实的银行卡进行测试。测试沙箱目前正在开发中。

Q: 是否支持Java?

A: 是的,支持。Kotlin与Java有向后兼容性,但有一些特点。

例如,我们来看看Kotlin中的object实体,它相当于Java中的static class:

RuStoreReviewManagerFactory.create(context)

Java中访问object RuStoreReviewManagerFactory的方式如下:

RuStoreReviewManagerFactory.INSTANCE.create(getContext());

关在Java类中使用Kotlin代码的更多信息,请参阅文章《Calling Kotlin from Java》。