我正在我的应用中实现 IAP。一个用于删除广告,另一个用于添加更多谜题。我正在我的设备上进行测试,但遇到了一个问题。购买商品后,我收到响应代码“商品已拥有”,但它未显示在购买列表中。
我正在这样设置我的计费客户端,
private void setUpBillingClient(){
mBillingClient = BillingClient.newBuilder(this).setListener(this).build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) {
if (billingResponseCode == BillingClient.BillingResponse.OK) {
List skuList = new ArrayList<>();
skuList.add(ITEM_SKU_MORE_PUZZLE);
skuList.add(ITEM_SKU_REMOVE_AD);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List skuDetailsList) {
// Process the result.
if (responseCode == BillingClient.BillingResponse.OK
&& skuDetailsList != null) {
for (Object skuDetailsObject : skuDetailsList) {
SkuDetails skuDetails = (SkuDetails) skuDetailsObject;
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
if (ITEM_SKU_MORE_PUZZLE.equals(sku)) {
btnMorePuzzle.setText(price);
}
else if(ITEM_SKU_REMOVE_AD.equals(sku)) {
btnRemoveAd.setText(price);
}
}
}
}
});
}
}
@Override
public void onBillingServiceDisconnected() {
//Toast.makeText(getApplicationContext(), getResources().getString(R.string.billing_connection_failure), Toast.LENGTH_SHORT);
}
});
queryPurchases();
queryPrefPurchases();
}
第一个问题,为什么我已经购买了商品,但这里的Billing response OK。我不想将按钮的文本设置为价格,这是在购买产品后从此响应设置的。
这是我的 Onpurchase 实现,
@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
if (responseCode == BillingClient.BillingResponse.OK && purchases != null) {
for (Purchase purchase : purchases) {
if (purchase.getSku().equals(ITEM_SKU_REMOVE_AD)) {
mSharedPreferences.edit().putBoolean("ad_free", true).commit();
btnRemoveAd.setText("Done");
btnRemoveAd.setEnabled(false);
}
else if(purchase.getSku().equals(ITEM_SKU_MORE_PUZZLE)){
mSharedPreferences.edit().putBoolean("more_puzzle", true).commit();
btnMorePuzzle.setText("Done");
btnMorePuzzle.setEnabled(false);
}
}
} else if (responseCode == BillingClient.BillingResponse.ITEM_ALREADY_OWNED ) {
// I am getting response "Item already owned" here for item bought but purchase list here is empty
// so i can't do anything for purchased item
}
}
第二个问题,我收到的回复是我的商品已经购买,但列表仍然是空的。 如何正确实现?
如果有人已经购买了产品,则应禁用该按钮。 另一个疑问是在测试时我是否必须等待 1-2 小时才能从 Playstore 退还该项目以再次测试或是否有任何其他方法。
我正在按照此代码进行应用内实现。 https://github.com/patpatchpatrick/Streakr/
最佳答案
这里只有一件事需要指出,即您查询的只是 SKU 类型的 INAPP 商品,而不是 SUBS。我认为您提供的产品类型属于订阅,而不是用于消费的应用内产品。这就是您的查询为空的原因。
关于android - 响应代码项目已购买但购买列表为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57291740/