8

Sto usando codice corrente per l'acquisto per chiamare l'intenzione di acquistoIn App Errore di acquisto nei codici statici

Bundle buyIntentBundle = mService.getBuyIntent(3, pContext.getPackageName(), "android.test.canceled", "inapp", "bGoa+V7g/yqDXv"); 
Set<String> allKeys = buyIntentBundle.keySet(); 
Object responseCode= buyIntentBundle.get("RESPONSE_CODE"); 
Object intent= buyIntentBundle.get("BUY_INTENT"); 
Log.i(TAG,"buyIntentBundle"+buyIntentBundle.keySet()+"responseCode"+responseCode+"intent"+intent); 
PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT"); 
if (pendingIntent != null) { 
    pContext.startIntentSenderForResult(pendingIntent.getIntentSender(), 2013, new Intent(), Integer.valueOf(0), Integer.valueOf(0),Integer.valueOf(0)); 
} 

Ora onActivityResult Sto controllando

if (requestCode == 2013) {   
    Log.i(TAG, "onactivity result called inside request code"); 
    int responseCode = intent.getIntExtra("RESPONSE_CODE", 0); 
    String purchaseData = intent.getStringExtra("INAPP_PURCHASE_DATA"); 
    String dataSignature = intent.getStringExtra("INAPP_DATA_SIGNATURE");  
    if (responseCode == Constants.BILLING_RESPONSE_RESULT_OK) { 
    try { 
     JSONObject jo = new JSONObject(purchaseData); 
     String sku = jo.getString("productId"); 
     Toast.makeText(pContext, "You have bought the " + sku + ". Excellent choice, adventurer!", Toast.LENGTH_SHORT); 
     JSONObject o = new JSONObject(purchaseData); 
     String mOrderId = o.optString("orderId"); 
     String mPackageName = o.optString("packageName"); 
     String mSku = o.optString("productId"); 
     long mPurchaseTime = o.optLong("purchaseTime"); 
     int mPurchaseState = o.optInt("purchaseState"); 
     String mDeveloperPayload = o.optString("developerPayload"); 
     String mToken = o.optString("token", o.optString("purchaseToken")); 
     try { 
      mService.consumePurchase(3, pContext.getPackageName(), mToken); 
     } catch (RemoteException e) { 
        e.printStackTrace(); 
     }//consumePurchase 
    } 
    catch (JSONException e) { 
       Toast.makeText(pContext, "Failed to parse purchase data.", Toast.LENGTH_SHORT); 
       e.printStackTrace(); 
    } 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_USER_CANCELED) { 
     Toast.makeText(pContext, "User cancelled purchase.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE) { 
     Toast.makeText(pContext, "Your Device doesn't support inapp billing.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE) { 
     Toast.makeText(pContext, "Item is not available for billing.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_DEVELOPER_ERROR) { 
     Toast.makeText(pContext, "Can't purchase item due to some developer error.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_ERROR) { 
     Toast.makeText(pContext, "Can't purchase item due to some error in response.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED) { 
     Toast.makeText(pContext, "You already own this item.", Toast.LENGTH_SHORT); 
    }else if (responseCode == Constants.BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED) { 
     Toast.makeText(pContext, "You don't own this item.", Toast.LENGTH_SHORT); 
    } 
} 

Dal momento che io chiamo "android.test.canceled "quindi dovrei ricevere BILLING_RESPONSE_RESULT_USER_CANCELED questa risposta ma viene visualizzato come pagamento andato a buon fine e restituisce responseCode come BILLING_RESPONSE_RESULT_OK con nessun altro parametro in tale intent.getExtras. Sto cercando le risposte statiche http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static

Grazie & Saluti !!

+0

Sono stato confuso dallo stesso comportamento e penso che i veri sviluppatori Android dovrebbero modificare il codice. Se tu (o chiunque altro) hai ancora bisogno di testare la risposta user_cancelled, basta premere backspace. Il codice di risposta sarà BILLING_RESPONSE_RESULT_USED_CANCELED. – artsince

risposta

3

Non sta verificando:

if (resultCode == Activity.RESULT_OK) { 
    .... 
} 

E 'possibile che il processo non viene completata correttamente. E dal momento che il valore predefinito per responseCode nel caso in cui il tasto "RESPONSE_CODE" non è presente nel intent è "0" ....

int responseCode = intent.getIntExtra("RESPONSE_CODE", 0); 

.... responseCode è inizializzato a Constants.BILLING_RESPONSE_RESULT_OK ==>0.

Provare a utilizzare:

int responseCode = intent.getIntExtra("RESPONSE_CODE", -1); 

E aggiungere un else blocco finale per gestire -1.

+0

Il resultCode è uguale a RESULT_OK quando si utilizza android.test.canceled – Thys

+0

@MrThys Ok. Hai provato a utilizzare 'int responseCode = intent.getIntExtra (" RESPONSE_CODE ", -1);'. 'ResponseCode' viene ancora inizializzato su' 0'? – Vikram

+0

Jep, ho impostato il valore predefinito su -1 e restituisce ancora 0 – Thys

Problemi correlati