2015-08-15 12 views
7

Questa è la prima volta che lavoro con In App Billing in Android. Il mio obiettivo è creare oggetti acquistabili in qualche modo come lo sblocco della versione pro per l'app.Fatturazione Android In App: l'acquisto continua a ricevere -1005 risposta utente annullata

Il mio problema è che continua a darmi questi errori.

enter image description here

enter image description here

Si prega di prendere atto che la chiave di licenza è corretto, il mio account Google è già stato aggiunto come tester nella console, il Prodotto Codice esiste già e alpha build del apk è già caricato nella console.

Ecco il mio codice,

public class ProVersionActivity extends AppCompatActivity { 

    public static final String TAG = "ProVersionActivity"; 
    public static final String SKU_PRO_VERSION = "vollversion"; 
    private boolean mProVersionPurchased = false; 
    private String mPayload = ""; 

    //(arbitrary) request code for the purchase flow 
    public static final int RC_REQUEST = 10001; 

    private Button mInAppPurchaseButton = null; 
    private WebView mWebView = null; 
    private IabHelper mHelper = null; 

    private ProgressDialog mProgressDialog = null; 

    private static final String LICENSE_KEY = "LICENSE_KEY"; 

    //Listener that's called when we finish querying the items and subscriptions we own 
    private IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
     public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
      Log.d(TAG, "Query inventory finished."); 

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

      // Is it a failure? 
      if (result.isFailure()) { 
       complain("Failed to query inventory: " + result); 
       return; 
      } 

      Log.d(TAG, "Query inventory was successful."); 

      /* 
      * Check for items we own. Notice that for each purchase, we check 
      * the developer payload to see if it's correct! See 
      * verifyDeveloperPayload(). 
      */ 

      // Do we have the infinite gas plan 
      Purchase proVersionPurchase = inventory.getPurchase(SKU_PRO_VERSION); 
      mProVersionPurchased = (proVersionPurchase != null && verifyDeveloperPayload(proVersionPurchase)); 
      Log.d(TAG, "User " + (mProVersionPurchased ? "HAS" : "DOES NOT HAVE") + " proversion"); 

      if(mProVersionPurchased){ 
       //this means user already purchased the full version 
       setProversionPurchased(mProVersionPurchased); 
      } 

      Log.d(TAG, "Initial inventory query finished"); 
     } 
    }; 

    // Callback for when a purchase is finished 
    private IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
     public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 

      Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase); 

      // if we were disposed of in the meantime, quit. 
      if (mHelper == null) return; 

      if (result.isFailure()) { 
       Log.d(TAG, "Error purchasing: " + result); 
       complain("Error purchasing: " + result); 
       //setWaitScreen(false); 
       dismissProgressDialog(); 
       return; 
      } 
      if (!verifyDeveloperPayload(purchase)) { 
       Log.d(TAG, "Error purchasing. Authenticity verification failed."); 
       complain("Error purchasing. Authenticity verification failed."); 
       //setWaitScreen(false); 
       dismissProgressDialog(); 
       return; 
      } 

      Log.d(TAG, "Purchase successful."); 

      if (purchase.getSku().equals(SKU_PRO_VERSION)) { 

       // bought the infinite gas subscription 
       Log.d(TAG, "Proversion purchased."); 
       alert("Thank you for purchasing the Proversion!"); 
       mProVersionPurchased = true; 
       setProversionPurchased(mProVersionPurchased); 
       //setWaitScreen(false); 
       dismissProgressDialog(); 

       ProVersionActivity.this.finish(); 
      } 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_pro_version); 
     getSupportActionBar().setTitle(R.string.vollversion); 

     //for the progress dialog 
     mProgressDialog = new ProgressDialog(this); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setCanceledOnTouchOutside(false); 
     mProgressDialog.setMessage("Processing..."); 
     mProgressDialog.setIndeterminate(true); 

     String lang = getString(R.string.lang); 

     mWebView = (WebView) findViewById(R.id.webView); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.loadUrl("file:///android_asset/html/" + lang + "_iap.htm"); 

     /** 
     * preparing in app billing 
     * */ 
     String base64EncodedPublicKey = LICENSE_KEY; 
     // compute your public key and store it in base64EncodedPublicKey 
     mHelper = new IabHelper(this, base64EncodedPublicKey); 
     // enable debug logging (for a production application, you should set this to false). 
     mHelper.enableDebugLogging(true); 

     mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
      public void onIabSetupFinished(IabResult result) { 

       if (!result.isSuccess()) { 
        Log.d(TAG, "Problem setting up In-app Billing: " + result); 
       } 

       // 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. 
       Log.d(TAG, "Setup successful. Querying inventory."); 
       mHelper.queryInventoryAsync(mGotInventoryListener); 
      } 
     }); 

     mInAppPurchaseButton = (Button) findViewById(R.id.in_app_purchase_button); 
     mInAppPurchaseButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       if (!mHelper.subscriptionsSupported()) { 
        Log.d(TAG, "Subscriptions not supported on your device yet. Sorry!"); 
        complain("Subscriptions not supported on your device yet. Sorry!"); 
        return; 
       } 

       //setWaitScreen(true); 
       showProgressDialog(); 
       Log.d(TAG, "Launching purchase flow for pro version purchase."); 
       mHelper.launchPurchaseFlow(
         ProVersionActivity.this, 
         SKU_PRO_VERSION, 
         //IabHelper.ITEM_TYPE_SUBS, 
         RC_REQUEST, 
         mPurchaseFinishedListener, 
         mPayload); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data); 

     if (mHelper == null) 
      return; 

     // Pass on the activity result to the helper for handling 
     if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { 
      // not handled, so handle it ourselves (here's where you'd 
      // perform any handling of activity results not related to in-app 
      // billing... 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
     else { 
      Log.d(TAG, "onActivityResult handled by IABUtil."); 
     } 
    } 

    private void setProversionPurchased(boolean value){ 

     //temporarily allow the purchase immediately for development purposes. 
     SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(ProVersionActivity.this); 
     SharedPreferences.Editor editor = sharedPref.edit(); 
     editor.putBoolean(SettingsActivity.PREF_KEY_PRO_VERSION, value); 
     editor.apply(); 

     Toast.makeText(this,"Pro version purchased!",Toast.LENGTH_LONG).show(); 
    } 

    private void complain(String message) { 
     Log.e(TAG, "Error: " + message); 
     alert("Error: " + message); 
    } 

    private void alert(String message) { 
     AlertDialog.Builder bld = new AlertDialog.Builder(this); 
     bld.setMessage(message); 
     bld.setNeutralButton("OK", null); 
     Log.d(TAG, "Showing alert dialog: " + message); 
     bld.create().show(); 
    } 

    /** Verifies the developer payload of a purchase. */ 
    private boolean verifyDeveloperPayload(Purchase p) { 

     mPayload = p.getDeveloperPayload(); 
     Log.d(TAG, "payload: "+mPayload); 

     /* 
     * TODO: verify that the developer payload of the purchase is correct. It will be 
     * the same one that you sent when initiating the purchase. 
     * 
     * WARNING: Locally generating a random string when starting a purchase and 
     * verifying it here might seem like a good approach, but this will fail in the 
     * case where the user purchases an item on one device and then uses your app on 
     * a different device, because on the other device you will not have access to the 
     * random string you originally generated. 
     * 
     * So a good developer payload has these characteristics: 
     * 
     * 1. If two different users purchase an item, the payload is different between them, 
     * so that one user's purchase can't be replayed to another user. 
     * 
     * 2. The payload must be such that you can verify it even when the app wasn't the 
     * one who initiated the purchase flow (so that items purchased by the user on 
     * one device work on other devices owned by the user). 
     * 
     * Using your own server to store and verify developer payloads across app 
     * installations is recommended. 
     */ 

     return true; 
    } 

    /** 
    * Method to display registration progress dialog. 
    */ 
    private void showProgressDialog(){ 

     /* Dismiss existing dialog if any. */ 
     dismissProgressDialog(); 

     new DialogAsyncTask().execute(new String[]{}); 
    } 

    private void dismissProgressDialog(){ 
     /* 
     if(mProgressDialog != null && mProgressDialog.isShowing()){ 
      mProgressDialog.dismiss(); 
     } 
     */ 
     RUN_PROGRESS_DIALOG = false; 
    } 

    public static boolean RUN_PROGRESS_DIALOG = true; 

    private class DialogAsyncTask extends AsyncTask<String,String,String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      mProgressDialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... strings) { 

      while(RUN_PROGRESS_DIALOG){} 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      mProgressDialog.dismiss(); 
     } 
    } 

    // We're being destroyed. It's important to dispose of the helper here! 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

     // very important: 
     Log.d(TAG, "Destroying helper."); 
     if (mHelper != null) { 
      mHelper.dispose(); 
      mHelper = null; 
     } 
    } 
} 

Il codice mantiene tornare -1005 risposta in cui non riuscivo a trovare alcun riferimento dal sito degli sviluppatori Android. Ho già trascorso innumerevoli giorni a trovare i problemi e su Google per favore aiutami. Eventuali commenti e risposte saranno molto apprezzati. Grazie mille!

+1

si è app in stato pubblicato sul alpha ? Prova anche a cancellare i dati dall'app Play Store di Google utilizzando Application Manager. A volte il messaggio viene visualizzato a causa della memorizzazione nella cache. Controlla questo link https://www.androidpit.com/how-to-fix-google-play-authentication-is-required-error – random

risposta

1

Come @random indicato, potrebbe essere necessario svuotare la cache - vedere le risposte qui: Android In App Billing - Error Retrieving Information From Server si potrebbe anche voler guardare:

utilizzare il diritto Keys: Android In App Billing - Error Retrieving Information From Server

Aggiunta di un elenco di alpha tester : https://support.google.com/googleplay/android-developer/answer/3131213?hl=en (da: https://stackoverflow.com/a/29926917)

Questi link possono essere utili anche:

+0

FYI c'è un post che discute la tua recente creazione del tag [tag: koans] [su meta qui] (http://meta.stackoverflow.com/questions/306253/a-moan-about-koans) – durron597

0

La causa di questo problema è abbastanza stupida, dopo aver caricato app per canale alfa, ha bisogno di essere pubblicato. Non stavo pubblicandolo, quindi è rimasto in modalità bozza. Dopo aver pubblicato l'app, ha funzionato entro un'ora.

+0

plagio da: https://stackoverflow.com/questions/25762342/android-issue-with-in- app-billing –

0

Nel mio caso, gli utenti di test hanno riscontrato questo errore perché mi ero dimenticato di impostare i prodotti in-app su "Attivo".

Dopo aver impostato i prodotti su "Attivo" e aver aspettato 1-2 ore, gli acquisti in-app hanno iniziato a funzionare.

(L'app si trovava solo nel canale alfa, era già stata pubblicata e gli utenti che stavano visualizzando l'errore avevano i loro account nell'elenco "closed alpha testing" dei messaggi di posta elettronica del tester.L'unico ingrediente che mancava era che i prodotti non erano stati impostato su "Attivo")

products showing 'active' status

Per impostare il prodotto attivo:

  1. Accedere al Google Developer Console e selezionare il proprio app
  2. Clicca prodotti in-app
  3. Fare clic sul nome del prodotto per vedere "Managed Dettagli prodotto"
  4. In alto a destra, selezionare "Attiva" dal menu a discesa
  5. 1-2hrs attesa (si otterrà un popup dicendo i prodotti sta attivando)

product status dropdown

Problemi correlati