Android IAB Error - Authentication required

匿名 (未验证) 提交于 2019-12-03 03:03:02

问题:

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

回答1:

Soomla IAB error while purchasing in Game on Android this was my question, i think is the same problem, so , the problem is on the Google developer console, in order to buy you must publish the apk ,even if it is a beta or Alpha, and after ,you can test with testers approved accounts.



回答2:

In my case It was mistake of product Id, The product Id from Play-store and in app SKU_NAME should be same for in app billing.


It is not mention properly in iab sample project which one is productId
i.e SKU_GAS ="gas" and SKU_PREMIUM="premium" in project
then
"gas" and "premium" must be available on play-store as productId.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!