直到2016年6月20日,我才能取消在我的应用中完成的测试购买。 从同一个测试帐户进行多个应用程序内购买(非消费品),可以轻松开发和测试代码,而不需要太多的麻烦。
2016年6月20日之后,我的商家帐户中没有显示购买情况 我无法从我的测试帐户购买超过1次。我得到的只是:“你已经拥有这个项目”的消息。
我向Google开发者支持小组发送了一个请求,答案是:
从2016年6月20日开始,我们更改了一次性应用内购买(IAP)的测试购买。 以前,测试购买一次性IAP会生成订单ID。从2016年6月20日开始,一次性IAP不会生成正式订单ID(如果有的话),也不会出现在Merchant Center中。此行为已适用于订阅IAP。 您可以在Android开发者帮助中心了解有关测试应用内结算的详情:https://developer.android.com/google/play/billing/billing_testing.html#testing-purchases
好吧..所以我去了上面提到的链接,那里有一节: 取消已完成的测试购买 其中说明:
Google Play为每位用户积累了已完成的测试购买,但未将其传递给财务处理。 在某些情况下,您可能希望手动取消测试购买以继续测试。为此,请在Play商店中打开应用页面。如果要取消的测试购买是订阅,您还可以使用Purchases.subscriptions API的cancel()方法。 重要提示:Purchases.subscriptions API的refund()和revoke()方法不支持测试购买。
所以我去Play商店的应用页面......然后做到了什么?网页没有说明我应该在那里做什么。有人知道吗?
确实说:您还可以使用Purchases.subscriptions API的cancel()方法。
表示使用cancel()方法不是唯一的方法。
如何解决此问题而不在我的应用中添加其他代码?
答案 0 :(得分:14)
我进入主Google Play控制台页面并点击订单管理。在此之下,我能够选择所有测试购买并退款。我是该应用程序的主要开发人员,因此我可以访问。如果您是测试人员,您可能需要联系支持团队并要求他们退还您的订单。
答案 1 :(得分:13)
所有托管的应用内商品均为耗材。
如docs中所述。
这意味着您可以使用自有物品而不是取消购买并重新购买。 我建议在应用启动时查询广告资源:
mIabHelper.queryInventoryAsync(this);
然后您可以在回调中使用自有项目:
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
Purchase purchase = inventory.getPurchase(MY_SKU);
boolean isBought = (purchase != null && verifyDeveloperPayload(purchase));
if (isBought) {
mIabHelper.consumeAsync(purchase, new OnConsumeFinishedListener() {
@Override
public void onConsumeFinished(Purchase purchase, IabResult result) {
//Clear the purchase info from persistent storage
}
});
}
}
这对于测试IAB流是可以的,但请确保从发行版中删除此代码。
答案 2 :(得分:4)
我找到了一个不太方便的解决方案,但有效。您似乎可以使用不可兼容的产品,这样您就可以再次购买它们。我正在使用phonegap,所以我只有cordova-plugin-purchase插件的示例代码:
store.when("your.product.id").updated(product => {
if(product.owned) {
var transaction = product.transaction;
product.transaction = null;
store.inappbilling.consumePurchase(
function() { // success
alert("consume success");
},
function(err, code) { // error
alert("consume error " + err)
},
product.id,
transaction.id
);
}
});
当您致电store.refresh()
或购买产品时,系统会调用更新后的回调。因此,根据您的使用情况,您需要实施另一种检查何时使用该产品的方法。
我没有使用本机Android应用内付款的经验,但显然您也可以在那里使用这些产品。
编辑:对不起,我刚刚读到您并不想在项目中添加其他代码。我现在不认为这是可能的,但我想在这里保留我的答案,因为这可能有助于其他人尝试测试应用内付款。
答案 3 :(得分:4)
在Play控制台上,转到“开发者帐户”->“帐户详细信息”,设置许可证测试人员(默认情况下,您是一个)
购买物品
转到“订单管理”,选择那些测试订单,然后选择:退款,但是在退款时不要忘记检查REVOKE。 (我忘了撤销,现在找不到找回它们的方法)
无论如何,另一个测试帐户即可。
答案 4 :(得分:3)
来自https://stackoverflow.com/a/30178861/326904 @mttmllns
无需编写任何特殊的消费代码。只需使用adb 清除Google Play商店数据的命令:
adb shell pm clear com.android.vending
答案 5 :(得分:0)
没有为此找到解决方案。 我的解决方法是从测试用户列表中删除当前测试用户,进行真实购买,然后使用商家控制台取消它。
答案 6 :(得分:0)
queryPurchaseHistoryAsync方法仍然可以找到我去年做出的测试订单,尽管很早以前就已经消耗,退款和吊销了它们。我发现有帮助的一项预防措施是清除Google Play商店应用中的数据(设置/应用/ Google Play商店/存储/清除数据)。 queryPurchaseHistoryAsync从这里获取过时的购买数据,尽管只有非联网(我发现完全不可靠)queryPurchases才可以这样做。毕竟,您可能必须在应用程序中添加其他代码,但这并不需要太多。
随着对Trivial Drive 2的支持下降(文档中的链接将您带到“ 404页面不存在”错误),github文件被存档,并且更新为billing:2.1.0将为您提供自动售货导入IabHelper类中的编译错误),可能会认为此流行的涉及IabHelper的问题的答案已过时。如果您遵循从https://developer.android.com/google/play/billing/billing_overview开始的文档中的基本代码段,并且没有混乱的帮助程序类,那么记帐将变得更加简单。一个持续存在的问题是,“两种方法都具有相同的擦除,但都不会覆盖另一种”方法冲突错误,您可能会在此实现中遇到此错误,请在此处'Both methods have same erasure, yet neither overides the other' method clash error in SkuDetailsResponseListener()查看我的解决方案。
一旦实现了最新的计费代码,就可以在生产应用中创建一个隐藏的触发器,以调用queryPurchaseHistoryAsync来获取PurchaseHistoryRecordList。然后,为该列表中的每个项目调用consumerAsync。这是消耗所有测试订单的准系统代码,允许对非消耗品进行多次测试:
billingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,
new PurchaseHistoryResponseListener() {
@Override
public void onPurchaseHistoryResponse(BillingResult billingResult,
List<PurchaseHistoryRecord> purchaseHistoryRecordList){
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
&& purchaseHistoryRecordList != null) {
for (PurchaseHistoryRecord purchaserecord : purchaseHistoryRecordList) {
if(purchaserecord!=null){
ConsumeParams consumeParams =
ConsumeParams.newBuilder()
.setPurchaseToken(purchaserecord.getPurchaseToken())
.setDeveloperPayload(purchaserecord.getDeveloperPayload())
.build();
billingClient.consumeAsync(consumeParams, consumelistener);
}}}}});
答案 7 :(得分:0)
对于使用基于新的TrivialDriveKotlin的方式的人们,使用该方法在应用程序的安装过程中会消耗消耗性产品
handleConsumablePurchasesAsync
如果您购买的不是消耗品,则可以通过将相应的sku添加到GameSku对象中的CONSUMABLE_SKUS中来使其消耗品。例子:
val CONSUMABLE_SKUS = listOf(GAS, PREMIUM_CAR)
然后从设备上卸载您的应用程序,然后再次安装,您的非消耗品购买再次可用。快速而简单。 当然,不要忘记删除您的
答案 8 :(得分:0)
对我有用的是两者的结合:
此外,如果您获得的商品已经拥有状态,则可以使用购买令牌并调用billingClient.consumeAsync()来消费所购买的商品。