mService.consumePurchase(3,packageName,purchaseToken)始终返回RESULT_DEVELOPER_ERROR = 5 - 提供给API的无效参数

时间:2014-02-13 15:19:24

标签: android in-app-purchase in-app-billing

在尝试使用

进行购买时,我总是收到“RESULT_DEVELOPER_ERROR = 5 - 提供给API的无效参数”
String purchaseToken = "inapp:" + getPackageName() + ":" + productId;
int response = 0;
try {
    response = mService.consumePurchase(3, getPackageName(), purchaseToken);
} catch (RemoteException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

因此,我总是只能购买一次。但是,我需要能够更频繁地进行购买。我一直试图解决这个问题2天,但没有成功。 :/

使用SKU制作和消费购买“android.test.purchased”工作完全正常,但是只要我使用生产密钥导出.apk并添加实时SKU,购买只会显示一次,然后再显示一次。

这里有更多细节

  1. Play商店中.apk的版本代码和我在手机上使用的导出.apk是相同的,并使用相同的密钥库签名
  2. 我已尝试过托管和非托管产品,但这无关紧要,因为according to the latest in-app billing documentation,托管和非托管被视为托管产品,两者都必须消费
  3. 我只有5个SKU项目,所以它没有达到20的限制,这就是问题here

2 个答案:

答案 0 :(得分:24)

购买令牌与SKU本身不同,您应该通过以下代码检索purchaseToken

// Note the null is the continueToken you may not get all of the purchased items
// in one call - check ownedItems.getString("INAPP_CONTINUATION_TOKEN") for 
// the next continueToken and re-call with that until you don't get a token
Bundle ownedItems = service.getPurchases(3, getPackageName(), "inapp", null);
// Check response
int responseCode = ownedItems.getInt("RESPONSE_CODE");
if (responseCode != 0) {
   throw new Exception("Error");
}
// Get the list of purchased items
ArrayList<String> purchaseDataList = 
    ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
for (String purchaseData : purchaseDataList) {
    JSONObject o = new JSONObject(purchaseData);
    String purchaseToken = o.optString("token", o.optString("purchaseToken"));
    // Consume purchaseToken, handling any errors
    mService.consumePurchase(3, getPackageName(), purchaseToken);
}

答案 1 :(得分:0)

我刚刚发现如果你为getSkuDetails向ITEM_ID_LIST添加超过20个项目,那么它也将返回RESULT_DEVELOPER_ERROR。