8

Używam aktualny kod do nabycia za rozmowy z zamiarem zakupuIn App Purchase Błąd w kodach Static

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)); 
} 

Teraz onActivityResult jestem sprawdzanie

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); 
    } 
} 

Od Wołam „android.test.canceled "więc powinienem otrzymać BILLING_RESPONSE_RESULT_USER_CANCELED tę odpowiedź, ale to pokazuje, że płatność się powiodła i zwraca kod odpowiedzi jako BILLING_RESPONSE_RESULT_OK bez żadnego innego parametru w tym pliku intent.getExtras. Próbuję statyczne odpowiedzi http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static

Dzięki & Pozdrawiam !!

+0

Byłem zdezorientowany tym samym zachowaniem i myślę, że programiści Androida powinni zmodyfikować kod. Jeśli Ty (lub ktokolwiek inny) nadal musisz przetestować odpowiedź użytkownika, po prostu naciśnij klawisz Backspace. Kod odpowiedzi będzie BILLING_RESPONSE_RESULT_USED_CANCELED. – artsince

Odpowiedz

3

Nie sprawdzamy:

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

Jest możliwe, że proces nie zakończy się pomyślnie. A ponieważ wartość domyślna responseCode w przypadku, gdy przycisk "RESPONSE_CODE" nie występuje w intent jest "0" ....

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

.... responseCode jest inicjowany Constants.BILLING_RESPONSE_RESULT_OK ==>0.

Spróbuj użyć:

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

i dodać ostateczną else blok do obsługi -1.

+0

ResultCode jest równy RESULT_OK podczas używania android.test.canceled – Thys

+0

@MrThys Ok. Czy próbowałeś użyć 'int responseCode = intent.getIntExtra (" RESPONSE_CODE ", -1);'. Czy 'responseCode' nadal inicjuje na' 0'? – Vikram

+0

Jep, ustawiłem domyślną wartość -1 i nadal zwraca 0 – Thys