Я просмотрел библиотеку Play Billing Library https://developer.android.com/google/play/billing/billing_library_overview Вы должны подтвердить все покупки в течение трех дней. Неспособность должным образом подтвердить покупки приводит к тому, что эти покупки возвращаются. Процесс не дает никакой ясности, как подтверждать покупки. это то, что я пытался Это правильный способ сделать это. Заранее спасибо
@Override
public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
if (billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK&&purchases!=null){
Toast.makeText(this, "Purchase Successful", Toast.LENGTH_SHORT).show();
for(Purchase purchase:purchases){
handlePurchase(purchase);
}
}else if (billingResult.getResponseCode()== BillingClient.BillingResponseCode.USER_CANCELED){
Toast.makeText(this, "Purchase Cancelled", Toast.LENGTH_SHORT).show();
}else if (billingResult.getResponseCode()== BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED){
Toast.makeText(this, "Already Purchased", Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(this, billingResult.getDebugMessage(), Toast.LENGTH_SHORT).show();
}
//in handlePurchase()
if (!purchase.isAcknowledged())
{
AcknowledgePurchaseParams acknowledgePurchaseParams
= AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.setDeveloperPayload(purchase.getDeveloperPayload())
.build();
client.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {
@Override
public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
if (billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK){
Toast.makeText(RemoveAdsActivity.this, "Purchase Acknowledged", Toast.LENGTH_SHORT).show();
}
}
});
}
В нем упоминается подтверждение покупок примерно на полпути через этот связь. Существуют различные способы подтверждения покупки в зависимости от типа.
private BillingClient mBillingClient = BillingClient.newBuilder(mActivity).setListener(this).build();
//For non-consumables:
mBillingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener());
//For Consumables:
client.consumeAsync(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
Ссылка, которую я разместил, включает пример того, как обрабатывать подписки.
ОБНОВИТЬ
Вот как подтвердить покупки как нерасходных, так и расходных материалов, начиная с нерасходуемый:
Сначала создайте объект класса AcknowledgePurchaseParams. Для этого вам нужен токен покупки, который вы сможете легко получить, поскольку вы должны вызывать его в своем методе onPurchasesUpdated или другом методе, которому вы передали покупку после onPurchasesUpdated:
AcknowledgePurchaseParams acknowledgePurchaseParams =
AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
Затем создайте слушателя, который будет использоваться в качестве второго параметра. Это позволит вам что-то сделать после подтверждения покупки. В этом примере я показываю сообщение закусочной (согласно комментарию ворбеля, вы можете и, вероятно, должны проверить результат этого billingResult):
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = new AcknowledgePurchaseResponseListener() {
@Override
public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
getMessage("Purchase acknowledged");
}
};
Создав их, используйте свой BillingClient для вызова метода acknowledgePurchase:
mBillingClient.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
Покупка должна быть успешно подтверждена.
Это использует acknowledgePurchase для нерасходуемых предметов.
Расходные материалы
Это похоже, только то, как они называются, изменено - см. объяснение того, что они собой представляют, в приведенном выше примере:
Первый параметр - Params - настройка:
ConsumeParams consumeParams = ConsumeParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
Второй параметр - Слушатель - настройка:
ConsumeResponseListener consumeResponseListener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
getMessage("Purchase acknowledged");
}
}
Теперь используйте свой BillingClint и ConsumerAsync:
mBillingClient.consumeAsync(consumeParams, consumeResponseListener);
Спасибо, это полезно. Я смог купить и подтвердить, но billingClient.queryPurchasesList().getPurchasesList(); возвращает null. Можете ли вы помочь мне с этим?
Я не вижу способа для queryPurchasesList() не должно быть, BillingClient.queryPurchase(skuType).getPurchasesList(); ?
Да, Вы правы. С чем это может быть связано?
@SuryaGanesh Я обновил ответ, чтобы показать более расширенный пример для дальнейшего использования.
Это так расстраивает. Я продолжаю получать код ответа 3. Версия Google Play In-app Billing API меньше 9. Я использую последнюю версию библиотеки биллинга. Мой тестовый телефон обновлен. Я в растерянности.
Может кто знает как отменить покупку теста знаний?
Что делать, если Purchase.getPurchaseToken() иногда возвращает значение null?
onAcknowledgePurchaseResponse(BillingResult billingResult) вы должны проверить результат OK
Что делать, если результат не в порядке? Вы пытаетесь повторить? Сколько раз вы не можете держать пользователя там вечно? Я не вижу статус подтверждения заказа в консоли заказов в Google Play :-(
@Pieter, возможно, попробуйте еще несколько раз с интервалом в 1 секунду между попытками в течение максимум трех секунд, а затем сообщите пользователю, чтобы он повторил попытку позже, если после этого это не сработает. Если покупка подтверждена в вашем коде, она будет подтверждена в Google Play.
Спасибо @COYG. Я также думал проверить подтверждение при запуске приложения и попробовать там, и надеюсь, что пользователь запустит приложение несколько раз за 3 дня, которые я должен подтвердить платеж. Точно не знаю, в чем причина этого шага подтверждения после того, как пользователь приобрел товар. Также было бы полезно, если бы можно было увидеть статус подтверждения на консоли заказов и, возможно, также подтвердить его оттуда.
Для подписки это было объяснено в Developer.android. Но как объявить переменные: BillingClient client = ... AcknowledgePurchaseResponseListener acceptPurchaseResponseListener = Должен ли он быть таким же, как одно Consumable подтверждение. Или у него есть другой способ сделать это. ?
@CíceroMoura имеет значение null в случае проблем с сетью или в случае, если billingClient.isInitialized() имеет значение false
У меня есть вопрос: 1. если подтверждение ложное, возвращается ли покупка через 3 дня? 2. Всегда ли подтверждение покупки верно для успешной покупки 3. Что означает расходуемая и нерасходуемая покупка. (покупка INAPP относится к расходным или нерасходным материалам)
Если вы новичок и используете библиотеку биллинга 4.0.0, то приведенные выше коды не будут работать, так как теперь весь процесс выставления счетов переведен в фоновый поток, поэтому убедитесь, что вы не вызываете какой-либо код обновления пользовательского интерфейса во время процесса выставления счетов.
Использовать:
purchase.getSkus.contains("sku here");
вместо
purchase.getSku.equals("sku here");
Вы упоминаете, что это нужно добавить в обновление «Покупка»? Слушайте?
Эй, Сурья! Я реализую в покупке приложения. Но не в силах это сделать. Не могли бы вы предоставить мне рабочий код только для покупки в приложении. просто менеджер по выставлению счетов, и как вы вызываете launchBillingFlow и как вы его подтверждаете