2017-03-06 36 views
2

我已經實施了訂閱服務的應用內結算。一切都很好,但我正處於需要確保安全的地步。我遇到的各種建議都建議通過Plus API使用登錄用戶的帳戶ID。然而,如果用戶不使用他們的Gmail帳戶登錄,我怎麼會得到這個?我的想法是生成一個從用戶帳戶ID和SKU合併創建的令牌。然後檢查我的服務器以驗證購買。有沒有辦法獲得用戶的帳戶ID?我希望能夠通過一次購買在多個設備上使用該應用程序。如果用戶未使用任何社交api登錄,是否有方法在多個設備上驗證用戶?在Android上沒有用戶登錄驗證有效載荷的正確方法是什麼?

回答

3

經過多次試驗和錯誤和研究,我找到了一個解決方案。因此,對於任何人誰可能有相同需求/問題:

首先,添加到您的build.gradle文件:

編譯「com.google.android.gms:發揮服務-auth的: 10.2.0'

然後,在需要獲得用戶的帳號ID添加此活動:

public class MainActivity extends AppCompatActivity{ 

    private static final int REQUEST_CODE_EMAIL = 1; 
    TextView email, mAcctId; 
    Button getID; 
    String accountName; 
    String TAG = "test"; 
    private static final int REQ_SIGN_IN_REQUIRED = 55664; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     email = (TextView) findViewById(R.id.email); 
     mAcctId = (TextView)findViewById(R.id.accountID); 
     //Shows a popup allowing user to select email if more than one exists 
     try { 
      Intent intent = AccountPicker.newChooseAccountIntent(null, null, 
        new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE }, false, null, null, null, null); 
      startActivityForResult(intent, REQUEST_CODE_EMAIL); 
     } catch (ActivityNotFoundException e) { 
      // TODO 
     } 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_CODE_EMAIL && resultCode == RESULT_OK) { 
      accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
      email.setText(accountName); 

      //Call async task to get accountID for selected email 
      new RetrieveAccountID().execute(accountName); 

     } 
    } 

    private class RetrieveAccountID extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      String accountName = params[0]; 
      String token = null; 
      try { 
       token = GoogleAuthUtil.getAccountId(getApplicationContext(), accountName); 
      } catch (IOException e) { 
       Log.e(TAG, e.getMessage()); 
      } catch (UserRecoverableAuthException e) { 
       startActivityForResult(e.getIntent(), REQ_SIGN_IN_REQUIRED); 
      } catch (GoogleAuthException e) { 
       Log.e(TAG, e.getMessage()); 
      } 
      return token; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      ((TextView) findViewById(R.id.accountID)).setText("AccountID: " + s); 
     } 
    } 

} 

運行,這將使你的用戶選擇電子郵件在一個TextView中和另一個TextView中該電子郵件的accountID。現在可以使用它爲用戶電子郵件特有的應用程序創建令牌/密鑰。當用戶在不同的設備上使用應用時,這也可以用來驗證令牌/密鑰。

相關問題