首页 > 解决方案 > Kotlin 无法使用 rxBilling 获取 purchaseId

问题描述

我正在尝试在我的 android 应用上使用 rxBilling 进行应用内购买。图书馆在这里找到:https ://github.com/betterme-dev/RxBilling

我设法像这样实现它:

private fun launchBilling(subscription: Boolean) {
        val sku = "com.app.subscription"

        disposable.add(rxBilling.launchFlow(
            this, BillingFlowParams.newBuilder()
                .setSku(sku)
                .setType(BillingClient.SkuType.SUBS)
                .build()
        )
            .subscribe({

            }, {
                it.message?.let { msg -> unknownError(0, msg) }
            })
        )
    }`

这工作得很好,我在内部测试中推送了我的应用程序并尝试订阅,它有效并且我在我的谷歌游戏控制台中验证了我的订阅已被考虑在内。问题是我想获取购买日期和交易 ID 等信息。所以我按照指南并在 on start 方法中实现了一次性:

override fun onStart() {
        super.onStart()

        println("onstrat")
        disposable.add(
            rxBilling.observeUpdates()
                .subscribe({
                    println("here")
                    it.purchases.forEach { item ->
                        println("rxbillingstart")
                        println(item.toString())
                        println(item)
                        println(item.sku)
                        purchase(item)
                    }

                }, {
                    togglePurchaseProgress(false)
                    it.message?.let { msg -> unknownError(0, msg) }
                })
        )
    }

对于 on create 方法中的 rxbilling 和一次性的实现:

    private lateinit var rxBilling: RxBilling
    private lateinit var rxBillingFlow: RxBillingFlow
    private val disposable = CompositeDisposable()

    rxBilling = RxBillingImpl(BillingClientFactory(applicationContext))
    rxBillingFlow = RxBillingFlow(applicationContext, BillingServiceFactory(this))
    lifecycle.addObserver(BillingConnectionManager(rxBilling))
    lifecycle.addObserver(BillingConnectionManager(rxBillingFlow))

购买方法只是在这里打印 item.orderId 日期......但它从未被调用过。我在 onStart 方法中的第一个打印“onstrat”也被调用,但 observable.subscribe 中的所有其他打印都不会被调用。我错过了什么吗?我不明白为什么我无法获得订阅信息

标签: androidkotlin

解决方案


我发现不再维护 RxBilling,所以我使用了这里的标准 android 计费客户端:https ://developer.android.com/google/play/billing/integrate 。但不要忘记添加到您的清单中:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.vending.BILLING"/>

然后在您的活动中实现这些接口:PurchasesUpdatedListener, SkuDetailsResponseListener并设置计费客户端变量:private lateinit var billingClient : BillingClient。起初我也不清楚,但 sku 是您在 googleplay 控制台上设置的产品 ID。

private fun buy(){

        billingClient = BillingClient.newBuilder(this)
            .setListener(this)
            .enablePendingPurchases()
            .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.
                    val skuList = ArrayList<String>()
                    skuList.add("premium_upgrade")
                    skuList.add("com.yourappname.subscription")
                    val params = SkuDetailsParams.newBuilder()
                    params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS)

                    billingClient.querySkuDetailsAsync(params.build(), this@DetailsActivity)

                }
            }
            override fun onBillingServiceDisconnected() {
                // Try to restart the connection on the next request to
                // Google Play by calling the startConnection() method.
            }
        })
    }

像这样设置您要搜索的 skudetail,然后在此处获取响应:

 override fun onSkuDetailsResponse(responseCode: BillingResult, skuDetailsList: MutableList<SkuDetails>?) {
       
        if (responseCode.responseCode != BillingClient.BillingResponseCode.OK) {
            Log.w("LOG_TAG", "SkuDetails query failed with response: $responseCode")
        } else {
            Log.d("LOG_TAG", "SkuDetails query responded with success. List: $skuDetailsList")

            if (skuDetailsList != null) {
                for (skuDetails in skuDetailsList) {
                    var sku = skuDetails.getSku ()
                    var price = skuDetails.getPrice ()

                    var params = BillingFlowParams.newBuilder()
                        .setSkuDetails(skuDetails)
                        .build();

                    if (sku == "com.yourappname.subscription") {
                        billingClient.launchBillingFlow(this, params);

                    }

                }
            }
        }
    }

这意味着如果我找到了正确的 sku 我 lauchBillingflow -> 我开始付款过程。然后你在这里得到付款结果:

override fun onPurchasesUpdated(billingResult: BillingResult, purchases: MutableList<Purchase>?) {
    
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
            for (purchase in purchases) {
                purchase(1, purchase)
            }
        } else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
            // Handle an error caused by a user cancelling the purchase flow.
        } else {
            // Handle any other error codes.
        }
    }

您可以在这里得到您购买的结果,例如purchaseTime、orderId、purchaseToken,然后我的函数purchase 将purchaseToken 发送到内部服务器以验证交易。

希望它会帮助你们中的一些人。


推荐阅读