Ton*_*oni 46 android in-app-purchase in-app-billing
我目前正在测试我的InApp计费机制(使用InApp Billing版本3 API,因此将TrivialDrive示例作为参考).
我有一个托管项目,即升级到高级版本.
现在,使用我的测试帐户购买该项目是有效的,但是当我之后在Google结帐中取消整个订单时,我的代码仍然告诉我该项目已购买,因此授予高级功能.
以下是我在MainActivity中检查购买的方法.我不会在某处本地保存购买状态,因为据我所知,使用billing API v3,您可以根据需要查询特定购买.
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
iabHelper = new IabHelper(this, Helper.getPKey());
iabHelper.enableDebugLogging(true);
iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
Log.d("IAB", "SETUP FINISHED");
if(!result.isSuccess())
{
Log.d("IAB", "SETUP NOT OK");
return;
}
else
Log.d("IAB", "SETUP OK");
iabHelper.queryInventoryAsync(
new QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inv) {
Log.d("IAB", "Query inventory finished.");
if (result.isFailure()) {
Log.d("IAB","Failed to query inventory: " + result);
return;
}
Log.d("IAB", "Query inventory was successful.");
// Do we have the premium upgrade?
boolean mIsPremium = inv.hasPurchase(Helper.premiumSku);
Purchase p = inv.getPurchase(Helper.premiumSku);
if(p != null)
Log.d("IAB PURCHASE STATE", IabHelper.getResponseDesc(p.getPurchaseState()));
else
Log.d("IAB PURCHASE STATE", "Purchase is null");
Log.d("IAB", "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
}
}
);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我一直得到getPurchaseState = 0,这意味着购买,即使我取消订单后一小时.为什么?
小智 12
在等了大约12个小时并尝试了这里建议的所有内容之后,我仍然面临同样的问题.对我来说诀窍是以下adb命令:
adb shell pm clear com.android.vending
我知道这已经有一年了,但没有提供的答案/提示对我有帮助,所以我想我会添加我的解决方案.
首先,我遇到了同样的问题.即,进行测试购买,取消测试,仍然收到表示有效购买的购买状态.
我忘记的是,我最近将Google Play开发者控制台设置面板上的"许可证测试响应"字段从"RESPOND_NORMALLY"切换为"许可"
将其切换回"RESPOND_NORMALLY"后,已正确返回已取消购买的购买状态.
所以,在尝试等待几天之前,您可能需要检查一下
步骤1.等待大约10分钟; 直到您看到"已取消的订单"已交付.在你的谷歌钱包.
9月15日上午11:28取消订单已下达.
9月15日上午11:18取消您取消了此订单.原因:客户要求取消.
步骤2.在设备上注销您的测试Google帐户,然后重新登录.
至少那解决了我的问题.
在具有相同帐户的另一台设备上使用该应用程序时,也会发生此问题。直到重新启动设备(即使数小时后),也不会收到购买的商品。如果尝试再次购买,则Google钱包对话框会显示“已拥有商品”。iabHelper的返回代码仍然被“用户取消”,原因是没有将购买活动的真实响应返回给用户,只是将其写在调试日志中。
else if (resultCode == Activity.RESULT_CANCELED) {
logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode));
result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled.");
if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);
}
Run Code Online (Sandbox Code Playgroud)
因此,无法对这个Google帐单对话框做出反应,因为即使对话框中说“项目已拥有”,我们也总是得到相同的结果IABHELPER_USER_CANCELED。
编辑:
我用这个来解决:
else if (resultCode == Activity.RESULT_CANCELED) {
logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode));
if(responseCode == 7)
result = new IabResult(BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED, "Item already owned.");
else
result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled.");
if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);
}
Run Code Online (Sandbox Code Playgroud)
因此,现在如果来自“计费”对话框的响应为7,即“项目已拥有”,我会将其报告回我的侦听器。
如果我正确地看到 trivialdrivesample 中的参考代码是错误的,这对于应用程序内计费的官方参考项目来说将是一种耻辱。
如果 buy == null 则仅表示从未购买过。要获取真实信息,您必须致电
purchase.getPurchaseState()
Run Code Online (Sandbox Code Playgroud)
根据这里
buyState 订单的购买状态。可能的值为 0(已购买)、1(已取消)、2(退款)或 3(已过期,仅适用于订阅购买)。
| 归档时间: |
|
| 查看次数: |
28293 次 |
| 最近记录: |