Android in app purchase: Signature verification failed

后端 未结 14 792
说谎
说谎 2020-11-28 02:27

I have tried for several days to solve this problem, using the Dungeons demo code that comes with the SDK. I\'ve tried to Google for an answer but can\'t find one.

14条回答
  •  借酒劲吻你
    2020-11-28 03:08

    What worked for me, while using In-app Billing v3 and the included utility classes, was consuming the test purchase within the returned onActivityResult call.

    No changes to IabHelper, Security, or any of the In-app Billing util classes are needed to avoid this for future test purchases.

    If you have already tried purchasing the test product and are now stuck on the purchase signature verification failed error, which you likely are since you are looking up answers for this error, then you should:

    1. make the changes that GMTDev recommended
    2. run the app to ensure that it consumes the product
    3. remove/undo GMTDev's changes
    4. implement the code below within onActivityResult.

    Not only does this allow for the purchase testing process to be fluid but this should also avoid any conflicting issues with iab returning the " Item Already Owned " error when attempting to repurchase the test product.

    If this is being called from within a fragment and your fragment's onActivityResult isn't being called then be sure to call YourFragmentName.onActivityResult(requestCode, resultCode, data) from your parent ActivityFragment if necessary. This is explained in more detail in Calling startIntentSenderForResult from Fragment (Android Billing v3).

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_PURCHASE) {
    
            //this ensures that the mHelper.flagEndAsync() gets called 
            //prior to starting a new async request.
            mHelper.handleActivityResult(requestCode, resultCode, data);
    
            //get needed data from Intent extra to recreate product object
            int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
            String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
            String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
    
            // Strip out getActivity() if not being used within a fragment
            if (resultCode == getActivity().RESULT_OK) {
                try {
                    JSONObject jo = new JSONObject(purchaseData);
                    String sku = jo.getString("productId");
    
                    //only auto consume the android.test.purchased product
                    if (sku.equals("android.test.purchased")) {
                        //build the purchase object from the response data
                        Purchase purchase = new Purchase("inapp", purchaseData, dataSignature);
                        //consume android.test.purchased
                        mHelper.consumeAsync(purchase,null);
                    }
                } catch (JSONException je) {
                    //failed to parse the purchase data
                    je.printStackTrace();
                } catch (IllegalStateException ise) {
                    //most likely either disposed, not setup, or 
                    //another billing async process is already running
                    ise.printStackTrace();
                } catch (Exception e) {
                    //unexpected error
                    e.printStackTrace();
                }
            }
        }
    }
    

    It will only remove the purchase if it's sku is "android.test.purchased" so it should be safe to use.

提交回复
热议问题