我在我的应用中实施了应用内结算,现在正在测试其退款处理方式。
我使用测试帐户购买了应用内管理的应用内结算项目并退款。我的应用程序获得了预期的退款广播,它看到该项目在恢复交易时已退款,所以一切都很顺利。
我的问题是我无法重新购买该物品以测试其他情况。 当我尝试购买该项目时,会出现Google Play界面,并显示一条错误消息“您已拥有此项目”。 2个按钮“确定”和“详细信息”。 如果我按详细信息,Google Play会崩溃并返回我的应用程序。
有没有人有类似的经历? 用户是否禁止购买以前已退款的应用内商品?
答案 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)
答案 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);
}
我希望这可以帮助其他人寻找该问题的答案。