android - 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 中的所有其他打印都不会被调用。我错过了什么吗?我不明白为什么我无法获得订阅信息
解决方案
我发现不再维护 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 发送到内部服务器以验证交易。
希望它会帮助你们中的一些人。
推荐阅读
- spring-boot - 由于球衣,Spring Cloud Eureka 客户端无法启动
- svg - 我怎样才能让这个 SVG 多边形“楔形”总是有 45 度的末端?
- sql - 如何从两个表创建插入语句脚本
- python - 将熊猫系列(带字符串)转换为 python 列表
- c++ - 如何删除 std::string 上以“//”开头的每一行?
- javascript - 使用 JavaScript 检测用户何时到达 HTML 中的 div 结尾
- ruby-on-rails - Rails API 模式 ApplicationController 忽略 Rails.application.config.action_controller.allow_forgery_protection
- javascript - 如果我单击菜单项,防止下拉菜单关闭
- linux - linux:无法使用 cpupower 设置 cpu 频率调节器(ACPI 故障)
- java - AndroidStudio 项目编译错误:无法下载 gradle 4.1.1 - 无法找到请求目标的有效认证路径