我正在尝试实施Google In-App Billing以销售消耗品(硬币)。我用非消耗品测试它,它工作正常。但我不能使它成为消费品。每次我测试它,我只能买一次! 这是我的代码:
公共类MainActivity扩展AppCompatActivity { IabHelper mHelper;
boolean verifyDeveloperPayload(Purchase p) {
String payload = p.getDeveloperPayload();
/*
* TODO: verify that the developer payload of the purchase is correct. It will be
* the same one that you sent when initiating the purchase.
*
* WARNING: Locally generating a random string when starting a purchase and
* verifying it here might seem like a good approach, but this will fail in the
* case where the user purchases an item on one device and then uses your app on
* a different device, because on the other device you will not have access to the
* random string you originally generated.
*
* So a good developer payload has these characteristics:
*
* 1. If two different users purchase an item, the payload is different between them,
* so that one user's purchase can't be replayed to another user.
*
* 2. The payload must be such that you can verify it even when the app wasn't the
* one who initiated the purchase flow (so that items purchased by the user on
* one device work on other devices owned by the user).
*
* Using your own server to store and verify developer payloads across app
* installations is recommended.
*/
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String base64EncodedPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlJQQTbdM6zP0585Ar0YKZAYQish29+AkZpdu4fGUO3WLoVm9UPOSNMMBmo8odzQbcVZdlKUfocohg/52qoQk9crVIhdHJM+O1GK9+hJSdVkZo0PWW5+1sJSCQ7cw0NTxIdDQVSYT0WWC2zkn8Fpxyz1N9pGHh21jxbviDYcnh1gyK+mCLt6jWcVxKl8BYgC0SS7K9F+7kHy+B/GG8ZSl2xhcCqlid/8cEjqH7yvMPciWA8lHvHB7rGz/nUg/v2ydhmUY6f8Ifh6+ygUu2XrhDU0v8wZ24yKw2Kw4SVZbm5ZmC/DXCgx+hIWVL+/yAFqHJ0ygqwW4aLTuKV6PyDaC1QIDAQAB";
// compute your public key and store it in base64EncodedPublicKey
mHelper = new IabHelper(this, base64EncodedPublicKey);
mHelper.enableDebugLogging(true);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
// Oh no, there was a problem.
Log.d("TAG", "Problem setting up In-app Billing: " + result);
Log.i("TAG", "ERROR");
}
// Hooray, IAB is fully set up!
//check owned items & consum em
checkOwnedItems();
//make a test purchase
makePurchase();
}
});
}
private void makePurchase() {
try {
mHelper.launchPurchaseFlow(this, "next", 10001,
mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
showToast("oh no error purchase" + String.valueOf(e));
}
}
private void checkOwnedItems() {
try {
mHelper.queryInventoryAsync(mGotInventoryListener);
} catch (IabHelper.IabAsyncInProgressException e) {
showToast("Oh no error in check()");
//complain("Error querying inventory. Another async operation in progress.");
}
}
// Listener that's called when we finish querying the items and subscriptions we own
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
Purchase item = inventory.getPurchase("next");
if (item != null && verifyDeveloperPayload(item)) {
//Log.d("TAG", "We have gas. Consuming it.");
try {
mHelper.consumeAsync(inventory.getPurchase("next"), mConsumeFinishedListener);
} catch (IabHelper.IabAsyncInProgressException e) {
// complain("Error consuming gas. Another async operation in progress.");
showToast("oh no error when consuming");
}
return;
}
}
};
// Called when consumption is complete
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
Log.d("TAG", "Consumption finished. Purchase: " + purchase + ", result: " + result);
// if we were disposed of in the meantime, quit.
if (mHelper == null) return;
// We know this is the "gas" sku because it's the only one we consume,
// so we don't check which sku was consumed. If you have more than one
// sku, you probably should check...
if (result.isSuccess()) {
// successfully consumed, so we apply the effects of the item in our
// game world's logic, which in our case means filling the gas tank a bit
//Log.d(TAG, "Consumption successful. Provisioning.");
//mTank = mTank == TANK_MAX ? TANK_MAX : mTank + 1;
// saveData();
// alert("You filled 1/4 tank. Your tank is now " + String.valueOf(mTank) + "/4 full!");
}
else {
//complain("Error while consuming: " + result);
}
Log.d("TAG", "End consumption flow.");
}
};
// Callback for when a purchase is finished
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d("TAG", "Purchase finished: " + result + ", purchase: " + purchase);
// if we were disposed of in the meantime, quit.
if (mHelper == null) return;
if (result.isFailure()) {
// complain("Error purchasing: " + result);
return;
}
if (!verifyDeveloperPayload(purchase)) {
// complain("Error purchasing. Authenticity verification failed.");
return;
}
Log.d("TAG", "Purchase successful.");
if (purchase.getSku().equals("next")) {
Log.d("TAG", "Purchase is gas. Starting gas consumption.");
try {
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
} catch (IabHelper.IabAsyncInProgressException e) {
//complain("Error consuming gas. Another async operation in progress.");
showToast("oh no error when consuming");
return;
}
}
}
};
@Override
public void onDestroy() {
super.onDestroy();
if (mHelper != null) try {
mHelper.dispose();
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
mHelper = null;
}
private void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
} }
对不起我的英文和谢谢。
答案 0 :(得分:0)
我在使用原生应用内结算系统时也遇到了问题,但之后我发现this library
希望它有所帮助。答案 1 :(得分:-1)
我现在知道了:所以我的第一个问题是我在checkOwnedItems方法之后调用了makePurchase - >抛出异常:无法启动异步操作(launchPurchaseFlow),因为另一个异步操作(刷新库存)正在进行中。然后我使用一个按钮调用makePurchase并且它仍然无法工作...因为我做了成功或失败的祝酒词+所有听众中的异常我知道onIabPurchaseFinished方法没有被调用所以我用Google搜索并找到了这个答案:https://stackoverflow.com/a/14968203/4106137。