После некоторых исследований:
android: Оплата Inapp: Ответ об ошибке: 7: Элемент уже принадлежит
Оплата Inapp: Ответ об ошибке: 7: ItemУ вас уже есть проблема с тестовыми транзакциями
BillingFlowParams.Builder setSkuDetails для тестирования статических ответов Google Play Billing
Как правильно обновить методы Android BillingFlowParams устарела
Тест биллинга в приложении: android.test.purchased уже принадлежит
Проверка покупок в приложении
Я придумал этот код, чтобы очистить тестируемые inapp приложения (а именно «android.test.purchased»):
/////////////////////////
// First consume dbg. managed products
/////////////////////////
String purchaseToken = "inapp:" + BillingConstants.PACKAGE_NAME + ":" + BillingConstants.SKU_DBG_PURCHASED;
mBillingClient.consumeAsync(purchaseToken, new ConsumeResponseListener() {
@Override
public void onConsumeResponse(int responseCode, String purchaseToken) {
Log.d(TAG, BillingConstants.SKU_DBG_PURCHASED + " response code: " + responseCode);
Log.d(TAG, BillingConstants.SKU_DBG_PURCHASED + " purchase token: " + purchaseToken);
if (responseCode == 0) {
Log.d(TAG, BillingConstants.SKU_DBG_PURCHASED + " consumed successfully");
purchaseToken = "inapp:" + BillingConstants.PACKAGE_NAME + ":" + BillingConstants.SKU_DBG_CANCELED;
mBillingClient.consumeAsync(purchaseToken, new ConsumeResponseListener() {
@Override
public void onConsumeResponse(int responseCode, String purchaseToken) {
Log.d(TAG, BillingConstants.SKU_DBG_CANCELED + " response code: " + responseCode);
Log.d(TAG, BillingConstants.SKU_DBG_CANCELED + " purchase token: " + purchaseToken);
if (responseCode == 0) {
Log.d(TAG, BillingConstants.SKU_DBG_CANCELED + " consumed successfully");
purchaseToken = "inapp:" + BillingConstants.PACKAGE_NAME + ":" + BillingConstants.SKU_DBG_UNAVAILABLE;
mBillingClient.consumeAsync(purchaseToken, new ConsumeResponseListener() {
@Override
public void onConsumeResponse(int responseCode, String purchaseToken) {
Log.d(TAG, BillingConstants.SKU_DBG_UNAVAILABLE + " response code: " + responseCode);
Log.d(TAG, BillingConstants.SKU_DBG_UNAVAILABLE + " purchase token: " + purchaseToken);
if (responseCode == 0) {
Log.d(TAG, BillingConstants.SKU_DBG_UNAVAILABLE + " consumed successfully");
}
}
});
}
}
});
}
}
});
(он основан на тривиальном диске v2 ).
Работает как положено (куплено очищено локально, появляется диалог покупки с поддельными записями VISA). После покупки тестового элемента (SKU = "android.test.purchased) происходит сбой проверки подписи в BillingManager.java:
private void handlePurchase(Purchase purchase) {
if (!verifyValidSignature(purchase.getOriginalJson(), purchase.getSignature())) {
Log.i(TAG, "Got a purchase: " + purchase + "; but signature is bad. Skipping...");
return;
}
Log.d(TAG, "Got a verified purchase: " + purchase);
mPurchases.add(purchase);
}
Подпись покупки представляет собой пустую строку (я не уверен, относится ли это только ктестовые SKU) и JSON:
{
"packageName":"com.pckg.name",
"acknowledged":false,
"orderId":"transactionId.android.test.purchased",
"productId":"android.test.purchased",
"developerPayload":"",
"purchaseTime":0,
"purchaseState":0,
"purchaseToken":"inapp:com.pckg.name:android.test.purchased"
}
"Безопасно ли" пропускать этап проверки для тестовых покупок?