我添加了最新的Google Play结算库:
implementation 'com.android.billingclient:billing:2.0.1'
如果我使用“慢速测试卡进行购买,该测试卡会在几分钟后获得批准”(这是Google用来测试应用内购买的测试卡):
val params = BillingFlowParams
.newBuilder()
.setSkuDetails(skuId)
.build()
billingClient.launchBillingFlow(activity, params)
一切正常,直到我尝试确认或消费该产品:
val consumeParams = ConsumeParams
.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.consumeAsync(consumeParams, this)
我在回调中遇到以下错误:
/**
* Invalid arguments provided to the API. This error can also indicate that the application was
* not correctly signed or properly set up for In-app Billing in Google Play, or does not have
* the necessary permissions in its manifest
*/
int DEVELOPER_ERROR = 5;
我还收到一条调试消息,说明购买的商品处于无效状态(PENDING)。可能我无法使用/确认没有“成功”状态的购买。
根据Google的说法,我有3天可以消费或确认购买的商品,否则将予以退款。
但是,如果他们在购买后不允许我立即进行购买,该如何使用或确认购买呢?
SUCCESS
状态时,我无法让用户在应用程序中看到加载进度对话框/视图。通过测试帐户,我会在5到6分钟内得到通过SUCCESS
创建新的“ onPurchasesUpdated(billingResult: BillingResult?, purchases: MutableList<Purchase>?)
”状态我正在使用MVVM
体系结构(Activity - ViewModel
),并且在Activity
内,我保留Billing Client库(因为该库需要一个Context
),并且在ViewModel
业务逻辑中。
Google似乎不希望我们将计费客户端库“绑定”到活动/视图模型,而是在Service
中使用它,并在Application
类中实例化它。可能与Observers
或BroadcastReceivers
通信并收听购买更新。并且Purchase
被验证或拒绝后,我应该更新用户的个人资料。这已经可能会引起问题,因为在没有不可撤销的粘性通知的情况下我无法启动Service
,因为这是前台服务,因此我应该通知用户该应用程序在后台运行。这会吓到用户。
这个新的购买流程打破了很多事情。这不应该是异步的。在现实生活中,当我购买东西时,我将钱交给收银员,然后我不会在5分钟后收到我的产品/服务!我应该如何处理?用户进行了购买,然后我通知用户他/她将在Google确认后的5分钟内获得产品?这应该是瞬时的。
您如何处理应用内购买?
答案 0 :(得分:1)
答案很简单。告诉用户已发生购买请求,但尚未确认或处理付款或请求。
这种情况应该并且必须是异步的,因为这种情况可能在某些情况下发生,并且确实是现实生活中发生的情况,例如,当用户使用非即时付款方式时。有些付款方式可能需要几天的时间才能完成-并非每个人都使用信用卡/借记卡或礼品卡进行在线支付,而且不是每个人都可以!例如,在巴西,有Boleto付款系统,该系统易于付款,但处理时间较长。人们为自己的物品付款,打印出收据,然后在某些地方排队排队购买物品。之所以这样做,是因为获得国际在线卡非常困难,尤其是在穷人中。
因此,您需要做的就是获得新购买的商品。检查其状态。如果成功,则您的付款完成,并告知用户。如果是PENDING,请告知用户付款请求已完成,并等待Google确认付款。
如果您在“待处理”状态下进行购买,当付款清除时,您会通过应用程序流程收到新的购买请求,但是这次它将表示购买成功。
如果这不适合您当前的体系结构,则必须更改您的体系结构。
答案 1 :(得分:1)
我可能聚会晚了,但是我希望它能帮上忙。我的情况是响应代码5无效令牌。成功确认后尝试消费订阅产品时出现此错误。我犯了一个错误,要区分哪些需要消耗,哪些不需要。