I got a problem testing In App Billing ()v3 in my app, I can't buy anything with test accounts. It always shows me a Play Store dialog with
"Error Authentication is required. You must log in with your Google Account"
I can only buy the reserved item "android.test.purchased" without any problem and consume it.
IAB start:
private static final int REQ_CODE_BUY = 51667; private static final String buyFile = "bought"; private Activity activity; private ProgressDialog pD; private IInAppBillingService mService; private ServiceConnection mServiceConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = IInAppBillingService.Stub.asInterface(service); } }; public IABHelper(Activity activity, ProgressDialog pD){ this.activity = activity; this.pD = pD; } public void start(){ Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); activity.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE); } public void destroy(){ if (mService != null) { activity.unbindService(mServiceConn); } }
IAB buy and consume:
public void buy(String sku){ try { Bundle buyIntentBundle = mService.getBuyIntent(3, activity.getPackageName(), sku, "inapp", devPayload); //Bundle buyIntentBundle = mService.getBuyIntent(3, activity.getPackageName(), "android.test.purchased", "inapp", devPayload); PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT"); if(pendingIntent != null){ activity.startIntentSenderForResult(pendingIntent.getIntentSender(), REQ_CODE_BUY, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); pD.show(); } else{ Toast.makeText(activity, R.string.error, Toast.LENGTH_LONG).show(); } } catch (RemoteException e) { e.printStackTrace(); } catch (SendIntentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void consume(final String purchaseToken){ Thread consumeThread = new Thread(new Runnable(){ @Override public void run() { try { int response = mService.consumePurchase(3, activity.getPackageName(), purchaseToken); //int response = mService.consumePurchase(3, activity.getPackageName(), "inapp:com.mumble.artplace:android.test.purchased"); Log.d("response", Integer.toString(response)); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); consumeThread.start(); }
Handle buy response:
public void resolveResponse(int requestCode, int resultCode, Intent data){ if(requestCode == REQ_CODE_BUY){ if(resultCode == Activity.RESULT_OK){ int responseCode = data.getIntExtra("RESPONSE_CODE", 0); String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE"); JSONObject jData; try { if(responseCode == 0){ jData = new JSONObject(purchaseData); String purchaseToken = jData.getString("purchaseToken"); String developerPayload = jData.getString("developerPayload"); if(developerPayload.equals(devPayload))){ consume(purchaseToken); } } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } pD.dismiss(); } else{ if(resultCode == Activity.RESULT_CANCELED){ pD.dismiss(); } } } }
When this happens and i click "OK" it only returns a responseCode RESULT_CANCEL and an Intent with empty extras. I already tried to remove all accounts from my device and leaving only the developer one, only the test ones and tried with other phones without any success. I really don't know where I am wrong... Please help me, thanks