应用内计费测试:android.test.purchased已拥有
我目前正在测试未来应用的应用内计费,在我第一次成功“购买”测试项目“android.test.purchased”后,我现在每次尝试再次购买时都会收到响应代码7,这意味着我已经拥有该项目 12-15 23:02:14.149:E/IABHeloper(19829):应用内计费错误:无法 要购买商品,错误响应:7:商品已拥有 据我所知,这次购买应该是可能的,对吧?这样开发者就可以测试他/她的应用了应用内计费测试:android.test.purchased已拥有,android,in-app-billing,Android,In App Billing,我目前正在测试未来应用的应用内计费,在我第一次成功“购买”测试项目“android.test.purchased”后,我现在每次尝试再次购买时都会收到响应代码7,这意味着我已经拥有该项目 12-15 23:02:14.149:E/IABHeloper(19829):应用内计费错误:无法 要购买商品,错误响应:7:商品已拥有 据我所知,这次购买应该是可能的,对吧?这样开发者就可以测试他/她的应用了 如果不是,我如何将其状态“重置”为非国有?我使用的是谷歌应用内计费示例中的util包。这是消耗品和非
如果不是,我如何将其状态“重置”为非国有?我使用的是谷歌应用内计费示例中的util包。这是消耗品和非消耗品之间的区别;非消耗品(您在这里似乎要处理的)的状态会持续跟踪,而消耗品可以多次购买。您必须进入游戏管理控制台,取消/退款销售以再次测试它。结果表明,android.test.purchased项目的行为类似于常规ID。这意味着如果您想再次购买它,您必须在代码中的某个地方使用它。我认为Google文档在这个问题上有误导性,他们应该添加另一个静态ID,您可以无休止地购买该ID进行测试。将此代码添加到线程以启动消费请求
int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
对于购买测试,purchaseToken是
purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
及
那么消费是成功的
此外,不要忘记在中公开mService
Java
然后就可以这样访问:
int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);
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);
应用内版本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);
}
}
};
这就是我们如何消费该商品的方式
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();
}
});
在我的例子中,谷歌似乎没有记录购买该商品的情况。相反,谷歌Play服务的本地副本会缓存购买的内容。这样,当在同一台设备上发出第二个请求时,
android.test.purchased ready owned
。但是,使用其他设备或重置设备会清除缓存,并允许重复购买。无需编写任何特殊消费代码。只需使用adb命令清除Google Play Store数据:
adb shell pm clear com.android.vending
在我看来,如果你的程序不是设计用来消费物品的,你不需要调整代码来清除外部供应商的内存。这将使您的代码更加脆弱,然后您将不得不花费大量时间添加和删除不属于您的软件的代码,因此实现这样的解决方案是一个糟糕的设计 对于我来说,清除android.test.com的最佳解决方案是
adb uninstall com.yourapp.name
然后
adb shell pm clear com.android.vending
我不需要清除现金,也不需要浏览我的应用程序设置或更改代码。我确实需要将adb添加到windows系统的路径变量中,这非常简单。所以,是的,你需要使用adb,你可能无论如何都需要它
您只需添加C:\…\android sdk\platform工具;在windows环境变量中的路径,我想在mac和linux操作系统中也是非常简单的。希望它能帮助人们少花几天时间在应用程序中实现android billings 就我而言,我只需要清除应用缓存。清除缓存后,我能够再次启动购买流
从我的设备(4.4.2),我导航到“设置->应用程序管理器”。接下来,我从“下载”选项卡中选择应用程序,然后选择“清除缓存”。第3版-解决问题的最快方法:清除Google Play Store的缓存将使“android.test.purchased”再次可用。主要问题是您必须使用
android.test.purchased
项。但此项在查询库存中不可用,因此无法使用正常流程进行消费
因此,如果您正在使用IABHeloper,在IABHeloper
类中,您可以临时将IInapplingService
mService更改为public,以便可以从IABHeloper访问它
然后在你的课堂上,你可以这样消费
int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");
如果成功,响应将为0
希望这有帮助。如果您在测试环境中 1) 在android.test.purchased的情况下,我可以通过重启android设备(消耗库存)来重置假支付 2) 在InApp util中有一个名为Security.java的文件,请按以下方式创建临时文件。由于安全异常,测试付款(假)总是返回假
public static boolean verifyPurchase(String base64PublicKey,
String signedData, String signature) {
return true; }
然后在您的OnIabPurchaseFinishedListener中调用fechInvForconsumeItem()
fechInvForconsumeItem()是
消费侦听器是
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase,
IabResult result) {
if (result.isSuccess()) {
} else {
// handle error
Log.e("11","sucConsume");
}
}
};
出于测试目的,我还建议您插入一段代码,在调用初始化gp购买流的方法之前,该代码将清除您购买的所有产品。当你现在只测试一个项目时,这是特别舒服的。例如,像这样:
int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);
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);
我使用了adb shell:
adb shell pm clear com.android.vending
转到Google Play控制台并打开订单管理选项卡。在那里,您可以退款/取消试购。但问题是,我对这些“假冒”商品没有任何“权力”,我也不知道在哪里可以更改销售状态,因为它们不是真正的购买。关于android.test.purchased:当您使用此产品ID发出应用内账单请求时,Google Play会做出响应,就好像您成功购买了一件商品一样。所以我很困惑:/你还在做静态响应测试吗?如果是这样,您只需要更改发送的静态响应。听起来你要“用你自己的产品ID测试应用程序内的购买”,但是,它可以用可取消的订单进行真正的购买。我仍然坚持使用静态ID。我希望能够使用android.test.purchased ID测试应用内购买。这是第一次,根据我从谷歌文档中了解到的情况,它应该一直工作。对不起,我不清楚!我的误解,对不起。因为
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);
adb shell pm clear com.android.vending