标签: android-billing

退款客户应用内购买,但 BillingClient 仍显示用户已购买?

我正在使用以下内容BillingClient

implementation 'com.android.billingclient:billing:1.2.2'
Run Code Online (Sandbox Code Playgroud)

虽然我已经发出退款如下

在此处输入图片说明

但我仍然收到以下回复 BillingClient.queryPurchases

{
  "orderId": "GPA.3352-2555-5719-25534",
  "packageName": "com.yocto.wenote",
  "productId": "note_list_promo",
  "purchaseTime": 1560501011137,
  "purchaseState": 0,
  "purchaseToken": "djjneabakdaenkjafajbbclo.AO-J1OzbDNn5WkobYbSqLNzoBokm1F552-CqzfLQuNXK69bhxC-TnOTqdPV1RCl9T2okpSWfRD9RrE0eFhSN8glUbsOM5XUBDRnm_yK2Ohq_uyNuU17i1dc3CBhdeEn9uZCIfD3zY4tF"
}
Run Code Online (Sandbox Code Playgroud)

根据文档 BillingClient.queryPurchases

获取在您的应用内购买的所有商品的购买详情。此方法使用 Google Play Store 应用程序的缓存,而无需发起网络请求。

这可能是原因。我尝试使用另一个功能 -queryPurchaseHistoryAsync也无济于事。根据文档

返回用户最近为每个 SKU 进行的购买,即使该购买已过期、取消或消费。

对于queryPurchaseHistoryAsync,没有purchaseState表示以下购买被取消!

{
  "productId": "note_list_promo",
  "purchaseToken": "djjneabakdaenkjafajbbclo.AO-J1OzbDNn5WkobYbSqLNzoBokm1F552-CqzfLQuNXK69bhxC-TnOTqdPV1RCl9T2okpSWfRD9RrE0eFhSN8glUbsOM5XUBDRnm_yK2Ohq_uyNuU17i1dc3CBhdeEn9uZCIfD3zY4tF",
  "purchaseTime": 1560501011137,
  "developerPayload": null
}
Run Code Online (Sandbox Code Playgroud)

谷歌真的应该提供一个非缓存版本的queryPurchases.

知道我做错了什么吗?在我发出退款后,我不希望用户可以继续使用付费功能。

android android-billing

11
推荐指数
1
解决办法
1609
查看次数

Google Play 结算 v5 - 获取产品价格

在 v4 中,我曾经使用 SkuDetails.price 来获取产品的价格,但现在在 v5 中的新 ProductDetails 中不再可用。

如何获取新版本中产品的价格?

in-app-billing android-billing play-billing-library

11
推荐指数
1
解决办法
4996
查看次数

播放结算库 - V3与异步vs同步 - 不同的结果

我的用户SkuType.INAPP已从我的应用程序中购买了items().

在前面推荐的在应用程序内结算的实施IabHelper.QueryInventoryFinishedListener会返回一个Inventory包含任何项目,他们所拥有.

在新的Play Billing Library中,我使用以下方法:

Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
Run Code Online (Sandbox Code Playgroud)

假设响应代码成功,我查询:

purchasesResult.getPurchasesList()
Run Code Online (Sandbox Code Playgroud)

对于这一小部分用户,列表为空.

作为故障保护,对于上面的否定结果,我继续尝试:

mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP, this);
Run Code Online (Sandbox Code Playgroud)

onPurchaseHistoryResponse(final int responseCode, final List<Purchase> purchasesList)

成功详细购买.

对此感到困惑,我要求运行这两个实现的受影响用户确认以下内容:

  • 他们在设备上只有一个Google帐户
  • 一个帐户收到了购买确认电子邮件
  • 这是Google Play商店应用中唯一的帐户选项
  • Google Play商店应用"订单历史记录"详细介绍了购买情况

根据这个帖子的建议,我让他们:

  • 从Google Play商店应用中清除数据和缓存
  • 重启
  • 重新登录Google Play商店
  • 再次打开我的应用

尽管如此,仍然只能queryPurchaseHistoryAsync正确识别他们的帐户拥有的项目.

问题:为什么?

结算图书馆实现状态:

queryPurchaseHistoryAsync()返回用户为每个SKU进行的最新购买,即使该购买已过期,取消或已消耗.尽可能使用queryPurchases()方法,因为它使用本地缓存,而不是queryPurchaseHistoryAsync()方法.

我已在订单管理中确认购买有效且尚未取消.我不消耗它们,因此它们不能过期.

现在我有一个问题

鉴于对于这些用户我只能以上述方式识别他们的购买,我被迫为所有人实现这种故障保护.

除了因为必须这样做而感到沮丧之外,在您再次阅读之前,这似乎不是太大的问题:

queryPurchaseHistoryAsync()返回用户为每个SKU进行的最新购买,即使该购买已过期,取消或已消耗

因此,在我的标准实施中,我需要检查此购买是否仍然有效.

不幸的是,Purchase对象没有这样的方法来检查其有效性.

所以,我可能需要进行外部检查 …

android in-app-purchase in-app-billing android-billing play-billing-library

10
推荐指数
0
解决办法
543
查看次数

Google 结算内部测试:测试卡未显示

我的应用程序处于内部测试轨道,但在测试时,测试卡未显示,并且它要求在真实和虚拟设备上提供真实的信用卡。

我尝试过 StaclkOverFlow 推荐的一些方法,例如删除所有 GG 帐户并清除 Google Play 数据,然后仅添加一个测试者帐户,但我没有运气。

您能给我一些测试卡没有出现的原因吗?

这是测试时的图:

在此输入图像描述

android in-app-billing android-billing in-app-subscription google-play-billing

10
推荐指数
2
解决办法
3861
查看次数

Google在应用内购买获取产品列表

我从这里找到以下代码从google play store获取产品列表

ArrayList skuList = new ArrayList();
skuList.add("premiumUpgrade");
skuList.add("gas");
Bundle querySkus = new Bundle();
querySkus.putStringArrayList(“ITEM_ID_LIST”, skuList);
Run Code Online (Sandbox Code Playgroud)

有没有办法获得动态产品列表?在这里它的硬编码.当我在应用程序启动后添加新产品时会发生什么?

android android-billing google-play-services

9
推荐指数
2
解决办法
4574
查看次数

如何使用google billingclient库检测退款

我想知道如何检测退款或任何类型的取消应用内购买(不是订阅而不是消费品).

我目前正在进行测试,当我在谷歌退款测试时:

在此输入图像描述

购买仍然存在billingClient.queryPurchaseHistoryAsync()(甚至在queryPurchase()).

如何检测此类更改以及如何为退款用户停用我的应用程序?

提前致谢.

android in-app-billing google-play android-billing

9
推荐指数
1
解决办法
350
查看次数

BillingClient.BillingClientStateListener.onBillingSetupFinished 被多次调用

我尝试使用 Kotlin 协程为 BillingClient v.2.2.0 编写一个包装器:

package com.cantalk.photopose.billing

import android.app.Activity
import android.content.Context
import com.android.billingclient.api.*
import com.android.billingclient.api.BillingClient.*
import com.cantalk.photopose.util.Logger
import kotlinx.coroutines.CompletableDeferred
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlin.coroutines.suspendCoroutine

class BillingClientAsync(context: Context) {
    private val billingClient: BillingClient = setupBillingClient(context)
    private val pendingPurchaseFlows = HashMap<String, CompletableDeferred<Purchase>>()

    private fun setupBillingClient(context: Context): BillingClient {
        return newBuilder(context)
            .enablePendingPurchases()
            .setListener { billingResult, purchases ->
                if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) {
                    for (purchase in purchases) {
                        val deferred = pendingPurchaseFlows.remove(purchase.sku)
                        deferred?.complete(purchase)
                    }
                } else {
                    val …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-billing play-billing-library kotlin-coroutines

9
推荐指数
2
解决办法
1515
查看次数

跟踪用户/google 执行的 Google Play 退款

我们希望存储 Google Play 购买退款何时给用户以进行数据分析。

根据文档,用户可以通过 3 种方式申请 google play 订阅退款: https://support.google.com/googleplay/answer/2479637?hl= en

如果用户向开发者(我们)请求退款,我们可以在我们的服务器上跟踪并在我们这边进行管理,没有问题。不过,用户也可以直接向谷歌要求退款。问题是我们找不到此类退款的文件。

查看订阅的 API 文档,它没有提供购买是否已退款: https: //developers.google.com/android-publisher/api-ref/purchases/subscriptions

还尝试研究实时开发人员通知系统。好像没有退款活动。 https://developer.android.com/google/play/billing/realtime_developer_notifications#json_specation

你知道如果谷歌最终退款会发生什么吗?

android subscription android-billing google-play-developer-api

8
推荐指数
1
解决办法
5586
查看次数

如何知道用户是否使用了 Google Play 结算库的免费试用版?

我似乎无法在 Google 返回的购买对象中找到任何相关信息。我知道 SkuDetails 有一个“getFreeTrialPeriod()”方法,但它只返回免费试用的持续时间,而不返回用户是否使用免费试用的时间。

有任何想法吗?谢谢!

android android-billing

8
推荐指数
1
解决办法
2106
查看次数

android 计费 3 到 5 - PurchasesResult、queryPurchases、getPurchasesList、getSku

我想使用 android billing 版本 5。问题是我使用的是版本 3,有些功能现在已弃用。

我有这个,但PurchasesResult、queryPurchases 和 getPurchasesList 不再存在:

@Override
            public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
                if(billingResult.getResponseCode()==BillingClient.BillingResponseCode.OK){
                    Purchase.PurchasesResult queryPurchase = billingClient.queryPurchases(INAPP);
                    List<Purchase> queryPurchases = queryPurchase.getPurchasesList();
                    if(queryPurchases!=null && queryPurchases.size()>0){
                        handlePurchases(queryPurchases);
                    }
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它在版本 5 上工作?

也无法解析 getSku():

//if purchase is pending
            else if( PRODUCT_ID.equals(purchase.getSku()) && purchase.getPurchaseState() == Purchase.PurchaseState.PENDING)
            {
                Toast.makeText(getApplicationContext(),
                        R.string.plus_pending, Toast.LENGTH_SHORT).show();
            }
Run Code Online (Sandbox Code Playgroud)

谢谢

android android-billing

8
推荐指数
1
解决办法
2353
查看次数