问题描述
我已将 google play 计费库集成到我的应用程序中以进行订阅购买。它运作良好。用户收到来自谷歌的购买确认邮件。 confirmation mail from google
在 Play 商店订阅屏幕中也可以看到有效订阅。 Active subscription showing in play store
在游戏控制台中,订单详细信息表明用户已成功支付订阅费用。但是,它会立即取消。 play console order history
我还检查了购买确认,每次购买都返回 true。最初,我认为我的代码中会有错误。所以,我尝试了 Github 的各种计费库。问题仍然存在。最后,我用 Revenue cat 替换了整个 google billing library。遵循收入猫文档中描述的每一步。尽管如此,还是遇到了同样的问题。
是否有什么我遗漏或做错的地方?请帮帮我。谢谢
private fun fetchOffering(){
Purchases.sharedInstance.getofferingsWith({ error ->
// An error occurred
handleBillingError(requireActivity(),error)
}) { offerings ->
offerings.current?.availablePackages?.takeUnless { it.isNullOrEmpty() }?.let {
// All packages from current offering
if (it.isNotEmpty()){
it.forEach { p: Package ->
offeringPackages.add(p)
}
isProductsAvailable = true
}
Log.d("RevenueCat","fetchOffering: success: ${it.size}")
}
}
}
购买代码:
private fun makePurchase(pack:Package){
Purchases.sharedInstance.purchasePackageWith(
requireActivity(),packagetoPurchase = pack /* package from the fetched Offering*/,onError = {error,userCancelled ->
Log.d("RevenueCat","makePurchase: userCancelled: $userCancelled")
handleBillingError(requireActivity(),error)
},onSuccess = { product,purchaserInfo ->
if (purchaserInfo.entitlements[REVENUE_ENTITLEMENT_ID_PRO]?.isActive == true) {
Log.d("RevenueCat","makePurchase: success: ${product.originalJson} ")
afterPurchaseSuccessSetup()
}
})
}
解决方法
我不知道你哪里落后了,你应该按照这些步骤进行订阅购买。
private lateinit var billingClient: BillingClient
private val skuListsubscribe = listOf("subscription_1","subscription_2")
初始化计费客户端。
private fun setupBillingClient() {
billingClient = BillingClient.newBuilder(BaseActivity.mContext!!)
.enablePendingPurchases()
.setListener(this)
.build()
billingClient.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(billingResult: BillingResult) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
// The BillingClient is ready. You can query purchases here.
loadAllSKUsSubscription()
}
}
override fun onBillingServiceDisconnected() {
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
Log.e("TAG","onBillingServiceDisconnected: ")
}
})
}
private fun loadAllSKUsSubscription() = if (billingClient.isReady) {
val params = SkuDetailsParams
.newBuilder()
.setSkusList(skuListsubscribe)
.setType(BillingClient.SkuType.SUBS)
.build()
billingClient.querySkuDetailsAsync(params) { billingResult,skuDetailsList ->
// Process the result.
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList!!.isNotEmpty()) {
for (skuDetails in skuDetailsList) {
if (skuDetails.sku == subscribtionId) {
tv_full_category_price.text = skuDetails.price
realAmountSubscription = skuDetails.price
rl_bestvalue_plan.setOnClickListener {
isInAppPurchase = false
isSubscribtion = true
val billingFlowParams = BillingFlowParams
.newBuilder()
.setSkuDetails(skuDetails)
.build()
billingClient.launchBillingFlow(requireActivity(),billingFlowParams)
}
}
}
}
}
} else {
println("Billing Client not ready")
}
覆盖购买更新方法
override fun onPurchasesUpdated(
billingResult: BillingResult,purchases: MutableList<Purchase>?,) {
if (billingResult?.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
for (purchase in purchases) {
acknowledgePurchase(purchase)
}
} else if (billingResult?.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
//logger("User Cancelled")
//logger(billingResult?.debugMessage.toString())
} else {
//logger(billingResult?.debugMessage.toString())
}
}
private fun acknowledgePurchase(purchase: Purchase) {
if (isSubscribtion) {
handleNonConsumableProduct(purchase = purchase)
}
}
fun handleConsumableProduct(purchase: Purchase) {
val consumeParams =
ConsumeParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.consumeAsync(consumeParams) { billingResult,purchaseToken ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
if (isVisible && isAdded)
Snackbar.MakeInternetSnackbar(BaseActivity.mContext!!,subscription_fragment_indicator_layout,"Purchased Successfully")
InAppPaymentApi(realAmount.toString(),audio_id!!,purchase.purchaseToken)
}
}
}