Ответ Google IAP: -1003: проверка подписи покупки не удалась

Моя цель здесь - реализовать покупку внутри приложения в моем приложении, а также проверять, принадлежит ли пользователям элемент при каждом запуске приложения. Ниже то, что я пробовал до сих пор, и проблема, с которой я сталкиваюсь.

Это код в моей главной LAUNCHER Деятельность. Я использую android.test.purchased в качестве своего ITEM_SKU (это проблема?) Для локального тестирования покупки в приложении. Сначала это сработало, и с тех пор я получаю эту ошибку внутри onQueryInventoryFinished: Не удалось запросить инвентарь: IabResult: Ошибка обновления инвентаря (запрос принадлежащих предметов). (ответ: -1003: проверка подписи покупки не удалась)

// Does the user have the premium upgrade?
boolean mIsaddFree = false;
private AdView adView;

private static final String TAG = "com.example.inappbilling";
IabHelper mHelper;
static final String ITEM_SKU = "android.test.purchased";

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
        = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result,
                                      Purchase purchase) {
        if (result.isFailure()) {
            // Handle error
            return;
        } else if (purchase.getSku().equals(ITEM_SKU)) {
            consumeItem();
        }

    }
};


IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
        = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
                                         Inventory inventory) {

        mLog.printToLog(className + " -> " + MethodName.methodName() + ": Query inventory finished.");
        // Have we been disposed of in the meantime? If so, quit.
        if (mHelper == null) return;

        if (result.isFailure()) {
            mLog.printToLog(className + " -> " + MethodName.methodName() + "Failed to query inventory: " + result);
        } else {


            if (inventory.hasPurchase(ITEM_SKU)) {mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),mConsumeFinishedListener);
            } else {
            }

        }

        // Do we have the addFree upgrade?
        Purchase premiumPurchase = inventory.getPurchase(ITEM_SKU);
        mIsaddFree = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));

    }
};

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {


                if (result.isSuccess()) {
                } else {
                    // handle error
                }
            }
        };

/**
 * Verifies the developer payload of a purchase.
 */
boolean verifyDeveloperPayload(Purchase p) {
    String payload = p.getDeveloperPayload();
    return true;
}

public void consumeItem() {
    mHelper.queryInventoryAsync(mReceivedInventoryListener);
}

private void setupIAB() {
    String base64EncodedPublicKey =
            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgQEbYA2GEYavRb1oZz9aMyn86Wj09NCqFRbD936uKLJHKSDFdsfsdfklndfHKJHJKAHFKJDSFskdsfkjnsdfjkKJNJKSDF9ZclxWM3EuZTMM3kWDUfOnS0+u8c/Uq727cLBRqnRJy5pfWFZtPqXwAN4yaeCgxGka6eofn0jj7RxPEFJZLkFw2Ijvxl2uMIHSlxIvl+6ZwMtOKJHSDKJFHNDSllkadndfkasdlkasdlkasBOaBLKWFYY2to8g3aRx1HVTxLSi9Ms3KPMM3uPbbElCbKoIiqcNwIDAQAB";

    // Create the helper, passing it our context and the public key to verify signatures with
    mLog.printToLog(className + " -> " + MethodName.methodName() + ": Creating IAB helper.");
    mHelper = new IabHelper(this, base64EncodedPublicKey);

    // enable debug logging (for a production application, you should set this to false).
    mHelper.enableDebugLogging(!Constants.C_PRODUCTION_MODE);

    mHelper.startSetup(new
                               IabHelper.OnIabSetupFinishedListener() {
                                   public void onIabSetupFinished(IabResult result) {
                                       if (!result.isSuccess()) {
                                           return;
                                       } else {
                                           mLog.printToLog(className + " -> " + MethodName.methodName() + ": Passed, result.isSuccess() = TRUE");


                                           // Have we been disposed of in the meantime? If so, quit.
                                           if (mHelper == null) return;

                                           // IAB is fully set up. Now, let's get an inventory of stuff we own.
                                           mHelper.queryInventoryAsync(mGotInventoryListener);
                                       }
                                   }
                               });


}


/**
 * Listener that's called when we finish querying the items and subscriptions we own
 */
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        // Have we been disposed of in the meantime? If so, quit.
        if (mHelper == null) return;

        // Is it a failure?
        if (result.isFailure()) {
            return;
        }

        // Do we have the premium upgrade?
        Purchase adFreePurchase = inventory.getPurchase(ITEM_SKU);
        mIsaddFree = (adFreePurchase != null && verifyDeveloperPayload(adFreePurchase));


    }
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setupIAB();
}

Я изменил функцию verifyPurchase(String base64PublicKey, String signedData, String signature) в Security.java согласно этой теме

1 ответ

Вам нужно пропустить процесс проверки или отправить метод проверки подлинности во время тестирования, это происходит потому, что, как только вы совершаете покупку, используя идентификатор теста, который не подписан, вы получаете эту ошибку

Другие вопросы по тегам