我目前正在测试应用内结算,为未来的应用程序,之后我成功地“买”“android.test.purchased”第一次的测试项目,我现在收到的响应码7每次我试图再次购买它的时候,这意味着我已经拥有这个项目。
12-15 23:02:14.149:E / IabHelper(19829):在应用内结算错误:无法购买商品,错误应对:7:项目已经拥有
据我了解,此次收购被认为总是可以的吧? 因此,开发人员可以测试他/她的应用程序?
如果没有,我怎么能“复位”状态到不归? 我使用从谷歌应用内结算样品的util包。
Answer 1:
该代码添加到一个线程来启动消费的要求。
int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
这里购买测试,purchaseToken是
purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
和
if (response == 0)
那么消费成功。
Answer 2:
无需写任何特殊代码的消费。 只需使用adb命令清除谷歌Play商店的数据:
adb shell pm clear com.android.vending
Answer 3:
事实证明,在android.test.purchased项目的行为像一个普通的ID。 这意味着,如果你希望能够再次购买的话,你必须在你的代码的地方使用它。 我认为,谷歌文档误导性在这个问题上,他们应该增加一个静态ID,你可以无休止地购买用于测试目的。
Answer 4:
应用程式版本3:
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
.....................
if (inventory.hasPurchase(SKU_CONTENT)) {
mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null);
}
}
};
Answer 5:
这是我们如何能够占用的项目
consume.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
try {
Log.d("","Running");
int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
if(response==0)
{
Log.d("Consumed","Consumed");
}else {
Log.d("","No"+response);
}
}catch (RemoteException e)
{
Log.d("Errorr",""+e);
}
}
});
t.start();
}
});
Answer 6:
版本3:清除谷歌的缓存Play商店将让“android.test.purchased”再次可用。
Answer 7:
在我看来,如果你的程序不是用来消费的项目,你并不需要调整代码,以清除外部供应商的内存。 这将使你的代码更脆弱,你将有再花费大量的时间来添加和删除不属于你的软件,所以它是一个不好的设计来实现一个这样的解决方案代码。
这为我工作,清除android.test.purchased是最好的解决办法
adb uninstall com.yourapp.name
然后
adb shell pm clear com.android.vending
我并不需要清除现金和浏览我的应用程序设置或更改代码这一点。 我确实需要亚行添加到这是很简单的windows系统的路径变量。 所以,是的,你需要使用adb,你可能需要反正这样..
你只要将你的C:\ ... \ Android的SDK \平台工具; 在环境变量窗口路径,我想这是在Mac和Linux操作系统非常简单为好。 希望它可以帮助别人花几天少与应用帐单实施机器人。
Answer 8:
我用ADB壳:
adb shell pm clear com.android.vending
Answer 9:
主要的问题是你必须要消耗android.test.purchased
项目。 但是,这个项目不会在查询库存可用,这样你就可以使用正常的流量不会消耗。
所以,如果你正在使用IabHelper,在IabHelper
类,你可以暂时改变IInAppBillingService
MSERVICE公众,使其从IabHelper访问。
然后在你的类,你可以消耗这个样子,
int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");
如果成功,响应将是0。
希望这可以帮助。
Answer 10:
如果你在测试环境
1)在android.test.purchased的情况下,我可以重置通过重新启动机器人装置的假付款(消耗的库存)。
2)在应用程式内UTIL有一个叫做Security.java文件,使之如下,临时。 由于测试支付(假的)总是由于安全异常返回false。
public static boolean verifyPurchase(String base64PublicKey,
String signedData, String signature) {
return true; }
然后在你的OnIabPurchaseFinishedListener调用fechInvForconsumeItem()
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
= new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result,
Purchase purchase)
{
if (result.isFailure()) {
// Handle error
Log.e("123","Failure");
return;
}
else if (purchase.getSku().equals(ITEM_SKU)) {
Log.e("123","PURCAsed");
fechInvForconsumeItem(); // Restart device if not consume
}
}
};
所述fechInvForconsumeItem()是
public void fechInvForconsumeItem() {
mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
= new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result,
Inventory inventory) {
if (result.isFailure()) {
// Handle failure
Log.e("11","Failure");
} else {
Log.e("11","suc");
mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
mConsumeFinishedListener);
}
}
};
消费监听器
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase,
IabResult result) {
if (result.isSuccess()) {
} else {
// handle error
Log.e("11","sucConsume");
}
}
};
Answer 11:
出于测试目的,我也建议你插入了一段将被清除所有你已经调用初始化GP购买流量的方法之前买的产品代码。 这是特别舒服,当你此刻的测试只是一个项目。 例如,像这样的:
PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
if(sourcePurchase != null){
ConsumeResponseListener listener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {
System.out.println("all consumed");
}
};
mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
}else{
System.out.println("null");
}
}
// and then initiate whole process with clear "shoping basket"
BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
.setSku(itemName).setType(BillingClient.SkuType.INAPP);
Answer 12:
去谷歌游戏控制台和开放的订单管理选项卡。 在那里,你可以退还/取消测试购买。
Answer 13:
IabHelper.QueryInventoryFinishedListener
mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory)
{
if (result.isFailure()) {
return;
}
try {
if(inventory.hasPurchase("product_sku_id"))
{
isItemEnable= true;
mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null);
}
else
{
isItemEnable = false;
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
Answer 14:
这是消耗品,非消耗品之间的差异; 非消耗性物品(你似乎在这里要处理什么)有自己的状态跟踪持续,而消费的项目可以多次购买。 你必须进入你的播放管理控制台,并取消/退款销售再次测试它。
Answer 15:
就我而言,似乎谷歌不记录对物品的购买。 相反,谷歌的本地拷贝播放服务缓存购买。 这样,当第二个请求是在同一台设备上进行, android.test.purchased already owned
出现。 然而,使用其他设备或重置设备清除缓存,并允许重复购买。
Answer 16:
就我而言,我只是需要清除应用缓存。 清除缓存后,我能够再次开始购买流程。
从我的设备(4.4.2),我导航到“设置 - >应用程序管理器”。 接下来,我选择的应用程序从“已下载”选项卡,然后在“清除缓存”。
文章来源: In-App Billing test: android.test.purchased already owned