Возникновение проблем с обработкой покупок в библиотеке платежей Google PlayJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Возникновение проблем с обработкой покупок в библиотеке платежей Google Play

Сообщение Anonymous »


Последние два дня я работал над интеграцией Google Play Billing. Вчера я успешно запустил поток выставления счетов; однако, к моему удивлению, я столкнулся с проблемой, из-за которой раздел тестовой карты не был виден. Вместо этого мне были предложены реальные варианты оплаты. В спешке я приступил к покупке, надеясь, что это может быть новый метод тестирования и деньги не будут списаны. К сожалению, платеж прошел.

Примечание. Я загрузил пакет приложения для внутреннего тестирования, и приложение уже было опубликовано в рабочей версии задолго до того, как я добавил платежную систему Google Play.

Однако я допустил ошибку, не реализовав общие настройки для обработки успешной покупки, целью которой было удаление рекламы из приложения. Поэтому реклама в приложении сохранялась, и я не мог наблюдать изменений, произошедших в результате успешной покупки.

Заметив оплошность, я добавил необходимые общие настройки.

Но при тестировании с другим идентификатором я все равно столкнулся с проблемой появления реальных вариантов оплаты вместо среды тестирования. Поэтому я снизил цену продукта и совершил еще одну покупку, чтобы проверить реализацию общих предпочтений, но я все еще не могу удалить рекламу.

Похоже, что общее предпочтение никогда не вызывалось в методах handlePurchase() и restorePurchase().

Это код, который я реализовал, пожалуйста, примите его с пониманием, я новичок в этом и не хочу злиться на некоторые из моих первоначальных вопросов.

HelpActivity.java

`публичный класс HelpActivity расширяет AppCompatActivity { частный BillingClient BillingClient; частный окончательный PurchasesUpdatedListener PurchasesUpdatedListener = новый PurchasesUpdatedListener () { @Override public void onPurchasesUpdated(BillingResult billingResult, List Purchases) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { если (purchases.size() > 0) { за (Покупка покупка : покупки) { handlePurchase (покупка); } } еще { Toast.makeText(HelpActivity.this, «Невозможно обработать покупку», Toast.LENGTH_SHORT).show(); } } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) { // Обработка ошибки, вызванной отменой пользователем процесса покупки. Toast.makeText(HelpActivity.this, «Покупка отменена», Toast.LENGTH_SHORT).show(); //Примечание!!!! в этом промежуточном процессе отображается только это всплывающее сообщение } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED ) { если (purchases.size() > 0){ за (Покупка покупка : покупки) { handlePurchase (покупка); } Toast.makeText(HelpActivity.this, «Эт предмет уже принадлежит вам», Toast.LENGTH_SHORT).show(); }еще { Toast.makeText(HelpActivity.this, «Невозможно обработать покупку (предмет принадлежит)», Toast.LENGTH_SHORT).show(); } } } }; частный MaterialButton удалитьAdsBtn; частный MaterialButton RestorationPurchaseBtn; частный ProductDetails ProductDetails; @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_help_avtivity); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Устанавливаем вертикальную ориентацию Окно окна = this.getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.setStatusBarColor(this.getResources().getColor(R.color.black)); } восстановленияPurchaseBtn = findViewById(R.id.restoreAdsBtn); RemoveAdsBtn = findViewById(R.id.removeAdsBtn); // Инициализируем БиллингКлиент настройкаБиллингКлиент(); restrePurchaseBtn.setOnClickListener(новый View.OnClickListener() { @Override public void onClick (Просмотр) { восстановить покупки(); } }); RemoveAdsBtn.setOnClickListener(новый View.OnClickListener() { @Override public void onClick (Просмотр) { // Вызов метода для инициации процесса выставления счетов ИнициироватьБиллингПоток(); } }); } Private void handlePurchase (покупка) { если (!purchase.isAcknowledged()) { billingClient.acknowledgePurchase(AcknowledgePurchaseParams .newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(), BillingResult -> { if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { // Предоставляем пользователю доступ для удаления рекламы // Сохраняем детали покупки в SharedPreferences, чтобы запомнить покупку Toast.makeText(HelpActivity.this, «Спасибо за покупку», Toast.LENGTH_SHORT).show(); Toast.makeText(HelpActivity.this, «Перезапуск приложения. Подождите...», Toast.LENGTH_SHORT).show(); Настройки SharedPreferences = getSharedPreferences("adremoveSP", MODE_PRIVATE); Редактор SharedPreferences.Editor = Preferences.edit(); editor.putBoolean("ads_removed", true); редактор.применить(); Намерение намерение = новое намерение (HelpActivity.this, MainActivity.class); startActivity (намерение); } }); } } общественный недействительный setupBillingClient () { billingClient = BillingClient.newBuilder(this).setListener(purchasesUpdatedListener).enablePendingPurchases().build(); установитьСоединение(); } недействительный установитьСоединение () { billingClient.startConnection(новый BillingClientStateListener() { @Override public void onBillingSetupFinished(@NonNull BillingResult billingResult) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // BillingClient готов. Вы можете запросить покупки здесь. ЗапросПокупка(); } } @Override общественная недействительность onBillingServiceDisconnected () { // Попытаемся перезапустить соединение при следующем запросе к // Google Play, вызывая метод startConnection(). установитьСоединение(); } }); } общественный недействительный QueryPurchase () { QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder().setProductList(ImmutableList.of(QueryProductDetailsParams.Product.newBuilder().setProductId("removads_rickroll").setProductType(BillingClient.ProductType.INAPP).build())).build(); billingClient.queryProductDetailsAsync(queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse(BillingResult billingResult, List productDetailsList) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // Проверяем, не пуст ли список ProductDetailsList if (productDetailsList != null && !productDetailsList.isEmpty()) { ProductDetails = ProductDetailsList.get(0); } еще { } } еще { } } }); } общественный недействительный инициализацияBillingFlow () { если (productDetails != ноль) { ImmutableList productDetailsParamsList = Иммутаблелист.оф( BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .строить() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .строить(); BillingResult billingResult = billingClient.launchBillingFlow(HelpActivity.this, billingFlowParams); } } общественный недействительный restrePurchases () { billingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener((billingResult, list) -> { }).строить(); окончательный BillingClient FinalBillingClient = billingClient; billingClient.startConnection(новый BillingClientStateListener() { @Override общественная недействительность onBillingServiceDisconnected () { установитьСоединение(); } @Override public void onBillingSetupFinished(@NonNull BillingResult billingResult) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { FinalBillingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.INAPP).build(), (billingResult1, list) -> { if (billingResult1.getResponseCode() == BillingClient.BillingResponseCode.OK) { если (list.size() > 0) { Toast.makeText(HelpActivity.this, «Успешно восстановлено», Toast.LENGTH_SHORT).show(); Настройки SharedPreferences = getSharedPreferences("adremoveSP", MODE_PRIVATE); Редактор SharedPreferences.Editor = Preferences.edit(); editor.putBoolean("ads_removed", true); редактор.применить(); Намерение намерение = новое намерение (HelpActivity.this, MainActivity.class); startActivity (намерение); } еще { Toast.makeText(HelpActivity.this, «К сожалению, покупка не найдена.», Toast.LENGTH_SHORT).show(); Настройки SharedPreferences = getSharedPreferences("adremoveSP", MODE_PRIVATE); Редактор SharedPreferences.Editor = Preferences.edit(); editor.putBoolean("ads_removed", false); редактор.применить(); } } }); } } }); } защищенный недействительный onResume() { супер.онрезюме(); billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.INAPP).build(), (результат биллинга, список) -> { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { за (Покупка покупка: список) { if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED && !purchase.isAcknowledged()) { handlePurchase (покупка); } } } } ); } }` Я понимаю, что включаю весь код файла, но это необходимо, поскольку он составляет 99 % реализации платежной системы Google Play.

Еще один момент, который я хотел бы подчеркнуть: когда я нажимаю кнопку «ОК» в процессе выставления счетов, где покупка уже была совершена, приложение вылетает после двойного нажатия кнопки «ОК». Я не знаю, как определить причину проблемы, поскольку она не запускается из самой студии.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»