支付问题的FAQ
该门户网站正在开发中。文档的完整版本请看这里.
Q: 如何修复"Application is not verified yet"错误?
A: 出现此错误的情况包括:
- 应用程序未通过RuStore控制台的审核;
- 开发者测试的apk与上传到RuStore控制台的apk不匹配。
二点需要按以下方式重新检查:
- 在
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》。