Android 应用内计费 - 如何处理退款

Fra*_*oni 12 android in-app-billing refund

我正在尝试在我的应用程序中实现应用程序内计费,除了退款之外,一切都很好。过去几天我一直在反对这个问题,如果用户要求退款,似乎无法从应用程序方面知道这一点,这似乎令人难以置信。我希望能够在用户获得退款后撤销对一次性托管产品的访问权限(删除广告)。我没有使用后端,所以我依赖于 Google Play API。

我尝试过的是查询 Google Play API,queryPurchaseHistoryAsync它返回用户最近购买的列表。这似乎不起作用,因为在要求退款后购买的东西仍然存在(在写这篇文章之前等了一天)。

这是我所做的:

  1. 在真实设备上安装应用程序
  2. 购买应用内内容
  3. 验证应用程序是否解锁了内容
  4. 转到我的 Google Play 订单历史记录并申请应用内商品的退款
  5. 10 分钟后交易得到退款(完全没有我作为开发人员参与)
  6. App仍提供付费内容
  7. 清理 Play 商店应用数据和缓存
  8. App仍提供付费内容

那么任何用户都可以购买我的应用内产品,然后立即转到他的 Google Play 页面并要求退款?是我遗漏了一些明显的东西还是这个 API 是一场噩梦?

PurchaseState枚举是

  public @interface PurchaseState {
    // Purchase with unknown state.
    int UNSPECIFIED_STATE = 0;
    // Purchase is completed.
    int PURCHASED = 1;
    // Purchase is waiting for payment completion.
    int PENDING = 2;
  }
Run Code Online (Sandbox Code Playgroud)

我在这里没有看到与退款相关的任何内容,这在我看来是一个非常正常的用例,所以我仍然认为我缺少一些关键信息,我该怎么做?

谢谢你的帮助

inn*_*ler 5

问题

即使用户退款并实际获得退款,任何购买仍会被记录。当您(开发者/应用所有者)针对应用内商品发出退款/撤销请求时,情况也是如此。

唯一的区别是购买的"purchaseState"。Google Billing Library 的问题在于,他们将 purchase.getPurchaseState() 调用中的“purchaseState”值屏蔽为PENDNGPURCHASED状态。在反编译代码中看到:

public int getPurchaseState() {
    switch(this.zzc.optInt("purchaseState", 1)) {
    case 4:
        return 2; // PENDING
    default:
        return 1; // PURCHASED
    }
}
Run Code Online (Sandbox Code Playgroud)

当您的应用内商品处于已退款状态时,其状态为 UNSPECIFIED_STATE,如上面的代码所示,它被屏蔽为 PURCHASED。

简单的解决方案

要解决这个问题,只需忽略库的 purchase.getPurchaseState() 方法,而是使用您自己的未屏蔽自定义:

int getUnmaskedPurchaseState(Purchase purchase) {
    int purchaseState = purchase.getPurchaseState();
    try {
        purchaseState = new JSONObject(purchase.getOriginalJson()).optInt("purchaseState", 0);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return purchaseState;
}
Run Code Online (Sandbox Code Playgroud)

硬解

似乎谷歌刚刚做了那个蒙面来推动你做这个解决方案。使用 Voided Purchases API提供与用户已作废的购买相关的订单列表。根据他们的文档...

可以通过以下方式取消购买:

  • 用户为其订单申请退款。用户取消订单。
  • 一个订单被扣款。
  • 开发商取消或退款订单。注意:只有撤销的订单才会显示在 Voided Purchases API 中。
  • 如果开发者在没有设置撤销选项的情况下退款,则订单将不会显示在 API 中。
  • Google 取消或退款订单。

但是,此解决方案目前不能作为 Java android 库使用,您必须改为发出服务器请求,并使用 Google Play Developer API。

  • 世界为何如此 (6认同)