我已经在我的应用程序中实现了应用内购买,我的产品类型是托管的,我使用的是API版本3。 当我从我的信用卡购买时,它已成功完成。 但问题是,如果我卸载我的应用程序并想用相同的帐户购买它会再次向我收费? 根据谷歌管理产品类型的规则,我们只购买一次产品?但为什么会这样呢? 有人帮我吗? 这是我的PurchaseActivity.java类
public abstract class PurchaseActivity extends BlundellActivity implements OnIabSetupFinishedListener, OnIabPurchaseFinishedListener {
private IabHelper billingHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_purchase);
setResult(RESULT_CANCELED);
billingHelper = new IabHelper(this, AppProperties.BASE_64_KEY);
billingHelper.startSetup(this);
}
@Override
public void onIabSetupFinished(IabResult result) {
if (result.isSuccess()) {
Log.d("In-app Billing set up" + result);
dealWithIabSetupSuccess();
} else {
Log.d("Problem setting up In-app Billing: " + result);
dealWithIabSetupFailure();
}
}
protected abstract void dealWithIabSetupSuccess();
protected abstract void dealWithIabSetupFailure();
protected void purchaseItem(String sku) {
billingHelper.launchPurchaseFlow(this, sku, 123, this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
billingHelper.handleActivityResult(requestCode, resultCode, data);
}
*/
@Override
public void onIabPurchaseFinished(IabResult result, Purchase info) {
if (result.isFailure()) {
dealWithPurchaseFailed(result);
} else if (pmg.SKU.equals(info.getSku())) {
dealWithPurchaseSuccess(result, info);
}
finish();
}
protected void dealWithPurchaseFailed(IabResult result) {
Log.d("Error purchasing: " + result);
}
protected void dealWithPurchaseSuccess(IabResult result, Purchase info) {
Log.d("Item purchased: " + result);
// DEBUG XXX
// We consume the item straight away so we can test multiple purchases
billingHelper.consumeAsync(info, null);
// END DEBUG
}
@Override
protected void onDestroy() {
disposeBillingHelper();
super.onDestroy();
}
private void disposeBillingHelper() {
if (billingHelper != null) {
billingHelper.dispose();
}
billingHelper = null;
}
}
答案 0 :(得分:1)
这是按预期工作 - 在您的代码中,您立即消费应用内购买,这意味着您可以再次购买它:
protected void dealWithPurchaseSuccess(IabResult result, Purchase info) {
Log.d("Item purchased: " + result);
// DEBUG XXX
// We consume the item straight away so we can test multiple purchases
billingHelper.consumeAsync(info, null);
// END DEBUG
}
没有任何迹象表明您不能多次购买托管产品。您无法执行的操作是在上次购买相同的托管项目之前购买托管产品 。这样就完全符合预期,如果您将该通话移至consumeAsync
,您就会发现无法再次购买。
想象一下你可以购买额外生命的游戏。首先,用户将购买额外的生命(管理的应用程序产品),然后您的游戏(客户端或服务器)会将这些生命添加到用户的配置文件中,并假设成功,您和#39 ; d告诉Google Play购买已被消费。
这对于处理错误情况很重要 - 例如,假设用户的设备在初始购买和添加生命之间死亡到用户的配置文件。然后,您的应用可以在下次启动时再次尝试添加这些生命,并在成功时消费购买。并且,显然您不希望用户在成功授予他们之前尝试购买更多生命 - 这就是为什么您无法在被销售产品被消费之前购买两次。