В приложении Биллинг тест: android.тест.куплено уже в собственности
в настоящее время я тестирую в приложении биллинг для будущего приложения, и после того, как я успешно "купил" тестовый элемент "android.тест.купленный " в первый раз, теперь я получаю код ответа 7 каждый раз, когда я пытаюсь купить его снова, что означает, что я уже владею этим предметом.
12-15 23:02:14.149: E / IabHelper(19829): ошибка биллинга в приложении: невозможно
чтобы купить товар, ответ на ошибку: 7: товар уже принадлежит
насколько я понимаю, эта покупка должна всегда возможно, верно? Чтобы разработчик мог протестировать свое приложение?
Если нет, то как я могу "сбросить" свое состояние, чтобы не принадлежать? Я использую пакет util из примера биллинга Google In-App.
16 ответов:
добавьте этот код в поток, чтобы начать потреблять запросу.
int response = mService.consumePurchase(3, getPackageName(), purchaseToken);здесь для теста покупки, purchaseToken является
purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";и
if (response == 0)тогда потребление успешно.
нет необходимости писать специальный код потребления. Просто используйте команду adb для очистки данных Google Play Store:
adb shell pm clear com.android.vending
оказывается, что андроид.тест.купленный товар ведет себя как обычный идентификатор. Это означает, что если вы хотите иметь возможность купить его снова, вы должны использовать его где-то в своем коде. Я думаю, что документация Google вводит в заблуждение по этому вопросу, и что они должны добавить еще один статический идентификатор, который вы можете купить бесконечно для целей тестирования.
In-app version 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(); } });
лучшее решение, которое работало для меня, чтобы очистить android.тест.куплено было
adb uninstall com.yourapp.nameи затем
adb shell pm clear com.android.vendingмне не нужно было очищать наличные деньги и просматривать настройки моих приложений или изменять код для этого. Мне нужно было добавить adb к переменным пути системы windows, которая была довольно прямолинейной. Так что да, вам нужно использовать adb, который вам, вероятно, понадобится в любом случае..
вы просто добавляете свой C:\...\android-sdk\platform-tools; в Windows path в переменных среды, и я полагаю, что это довольно просто в ОС mac и linux. Надеюсь, это поможет кому-то провести несколько дней меньше с реализацией android в приложении Биллингс.
основная проблема заключается в том, что вы должны потреблять
android.test.purchasedтовар. Но этот элемент не будет доступен в вашем инвентаре запросов, поэтому вы не можете использовать обычный поток.Итак, если вы используете IabHelper, в
IabHelperкласс, вы можете временно изменитьIInAppBillingServicemService для публики, чтобы он был доступен из вашего IabHelper.тогда в вашем классе, вы можете потреблять такое:
int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");если успех, то ответ будет 0.
Надежда эта помощь.
если вы находитесь в тестовой среде
1) в случае android.тест.купленный, я могу сбросить поддельный платеж, перезапустив android-устройство(потребил инвентарь).
2) в iNAPP util есть файл под названием Security.java делает это следующим образом, для временного. Поскольку тестовый платеж (поддельный) всегда возвращает false из-за исключения безопасности.
public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { return true; }затем в вашем oniabpurchasefinishedlistener вызов fechInvForconsumeItem ()
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { // Handle error Log.e("123","Failure"); return; } else if (purchase.getSku().equals(ITEM_SKU)) { Log.e("123","PURCAsed"); fechInvForconsumeItem(); // Restart device if not consume } } };fechInvForconsumeItem () is
public void fechInvForconsumeItem() { mHelper.queryInventoryAsync(mReceivedInventoryListener); } IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { // Handle failure Log.e("11","Failure"); } else { Log.e("11","suc"); mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), mConsumeFinishedListener); } } };потреблять слушатель
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { if (result.isSuccess()) { } else { // handle error Log.e("11","sucConsume"); } } };
в целях тестирования я также предлагаю Вам вставить фрагмент кода, который будет очищать все продукты, которые вы купили, прежде чем вызывать метод, который инициализирует поток покупок gp. Это особенно удобно, когда вы тестируете только один элемент в данный момент. Например, вот так:
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);
перейдите в консоль Google Play и откройте вкладку Управление заказами. Там вы можете вернуть / отменить тестовые покупки.
IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { return; } try { if(inventory.hasPurchase("product_sku_id")) { isItemEnable= true; mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null); } else { isItemEnable = false; } } catch (Exception e) { e.printStackTrace(); } } };
это разница между расходными и непотребляемыми предметами; непотребляемые предметы (то, с чем вы, кажется, имеете дело здесь) постоянно отслеживают свое состояние, в то время как расходные предметы можно приобрести несколько раз. Вам нужно будет зайти в консоль управления Play и отменить / вернуть продажу, чтобы проверить ее снова.
в моем случае, похоже, что Google не учитывает покупку товара. Скорее, локальная копия сервисов Google Play кэширует покупку. Таким образом, когда второй запрос делается на том же устройстве,
android.test.purchased already ownedпоявляется. Однако использование другого устройства или сброс настроек устройства очищает кэш и позволяет повторить покупку.
в моем случае, мне просто нужно, чтобы очистить кэш приложений. После очистки кэша я смог снова инициировать поток покупки.
с моего устройства (4.4.2) я перешел к "настройки->диспетчер приложений". Затем я выбрал приложение на вкладке "загружено", а затем "очистить кэш".
Comments