退款后,无法在Google Play上重新购买应用内结算项目

时间:2012-10-17 09:08:22

标签: android in-app-billing

我在我的应用中实施了应用内结算,现在正在测试其退款处理方式。

我使用测试帐户购买了应用内管理的应用内结算项目并退款。我的应用程序获得了预期的退款广播,它看到该项目在恢复交易时已退款,所以一切都很顺利。

我的问题是我无法重新购买该物品以测试其他情况。 当我尝试购买该项目时,会出现Google Play界面,并显示一条错误消息“您已拥有此项目”。 2个按钮“确定”和“详细信息”。 如果我按详细信息,Google Play会崩溃并返回我的应用程序。

有没有人有类似的经历? 用户是否禁止购买以前已退款的应用内商品?

5 个答案:

答案 0 :(得分:4)

我看到了同样的问题。 GP崩溃和一切。

除了等待几个小时外,您可能还想打开“Google Play”应用信息并清除缓存和清除数据。这解决了我。看起来GP会在设备上缓存购买信息,并且很少(如果有的话)检查Google的服务器是否有退款信息。

<强>更新 您可能还想要取消Google Play流程,因为它似乎也会将购买信息保留在内存中。

答案 1 :(得分:2)

我向Google询问了这个问题,他们告诉我,如果以前退款,则无法在Google Play上重新购买应用内结算项目。 但是当我试图在24小时后再次购买时,购买就完成了......

所以看起来它可以重新购买,但只是经过一段时间的延迟。

答案 2 :(得分:2)

万一有人需要android而不是kotlin代码。斯密蒂写的所有解释:

启动应用程序时,您必须检查queryPurchases并查找退还的物品。 像这样:

if (purchase.getPurchaseState() != Purchase.PurchaseState.UNSPECIFIED_STATE)
{
     handleConsumablePurchasesAsync(purchasesList);
     return false;
}

谢谢您使用此项目。 smitty1是一个天才

private void handleConsumablePurchasesAsync(List<Purchase> consumables) {
    Log.d(TAG, "handleConsumablePurchasesAsync");
    for (Purchase purchase : consumables) {
        ConsumeParams params = ConsumeParams.newBuilder()
                .setPurchaseToken(purchase.getPurchaseToken())
                .build();

        billingClient.consumeAsync(params, (billingResult, purchaseToken) -> {
            if (billingResult.getResponseCode() == OK) {
                Log.d(TAG, "Consumed the old purchase that hasn't already been acknowledged");
            } else {
                Log.d(TAG, "Error consume the old purchase that hasn't already been acknowledged -> %s" + String.valueOf(billingResult.getResponseCode()));
            }
        });
    }
}

答案 3 :(得分:1)

我注意到,通过检查退款页面上的 Remove Entitlements 字段,您将能够直接重新购买产品,而无需按照已接受的答案的建议进行等待。

Remove Entitlements after refunding

答案 4 :(得分:0)

我知道这是一个古老的问题,但是我一直在寻找这个问题的答案,最终得出我自己的结论。 Google并未详细说明,但我相信他们希望您决定如何处理已取消和退款的购买交易的逻辑。要记住的另一点是,消费品和非消费品之间基本上没有区别。所有被管理产品都是消耗品。

对于我来说,当用户取消购买时,或者如果我决定给用户退款,我想要发生的事情是:1)用户收到退款,以及2)用户无法使用付费功能并且3)用户可以选择再次购买功能。

我要做的是使用应用内结算API在后端服务器上检查购买的PurchaseState。如果返回的purchaseState为1(取消)或2(已退款),我将在我的应用中使用该购买。 Google处理第1项,给用户退款。我的应用程序中的逻辑处理2,锁定对付费功能的访问。使用购买手柄3,使用户可以选择再次购买功能。

其基本要点是,将购买发送到我的后端服务器进行验证时,我会检查购买状态。如果购买状态为1或2,我将适当的代码返回到我的应用程序。当我的应用程序收到表明购买已取消或退款的代码时,我的应用程序将使用该购买。

我使用API​​的PHP版本,因此获取购买状态的简化代码是:

$purchases = $service->purchases_products->get($packageName, $productId, $purchaseToken);

$purchaseState = $purchases->getPurchaseState();

if($purchaseState === 1){
        $serverResponseCode = 3;
    }

    if($purchaseState === 2){
        $serverResponseCode = 4;
    }

...然后在我的应用中,我检查服务器响应代码。

if(serverResponseCode == 3 || serverResponseCode ==4 ){
     lockFeatures();
     ConsumeParams params = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
     billingClient.consumeAsync(params, listener);
}

我希望这可以帮助其他人寻找该问题的答案。