Usługi Google Play ma dwa nowe interfejsy API, które pomogą Ci uzyskać numer telefonu użytkownika i zweryfikować go za pośrednictwem wiadomości SMS bez uprawnień urządzenia: Selector telefon i SMS Retriever.
Używanie Selector telefonu, aby uzyskać numer
Pierwszym krokiem jest, aby użytkownik zainicjować weryfikację SMS z wewnątrz aplikacji. Twoja aplikacja może poprosi użytkownika o podanie telefonu numer, można użyć funkcji wyboru telefonu, aby to ułatwić, stosując kod tak:
// Construct a request for phone numbers and show the picker
private void requestHint() {
HintRequest hintRequest = new HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build();
PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
apiClient, hintRequest);
startIntentSenderForResult(intent.getIntentSender(),
RESOLVE_HINT, null, 0, 0, 0);
}
HintRequest budowniczy mówi Zagraj Usług że numer telefonu identyfikator jest potrzebne. To jest następnie używane do utworzenia i rozpoczęcia intencji, , która pokaże użytkownikowi okno dialogowe Usługi Play, pozwalając mu wybrać numer telefonu, który ma zostać udostępniony aplikacji. Ten interfejs API nie wymaga żadnych uprawnień i wyświetla numer (y) dostępny na telefonie lub koncie Google użytkownika, który użytkownik może wybrać.
Gdy użytkownik wybierze numer telefonu, zostanie on zwrócony do aplikacji w onActivityResult w formacie E164 na urządzeniach z najnowszą wersją Usług odtwarzania . Zauważ, że w niektórych przypadkach, w zależności od telefonu, możesz nie uzyskać numeru telefonu, więc upewnij się, że numer referencyjny ma wartość inną niż null. Jeśli nie masz numeru, musisz podać sposób, aby użytkownik mógł wpisać go ręcznie.
// Obtain the phone number from the result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESOLVE_HINT) {
if (resultCode == RESULT_OK) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
// credential.getId(); <-- E.164 format phone number on 10.2.+ devices
}
}
}
W tym momencie będziesz mieć numer telefonu dla swojego użytkownika. Chociaż jest to przydatne, prawdopodobnie będziesz chciał sprawdzić, czy użytkownik jest właścicielem tego numeru , na przykład, aby umożliwić mu wysyłanie lub pobieranie wiadomości z innymi użytkownikami lub identyfikowanie się z tym numerem.
Korzystanie z API weryfikacji SMS, aby sprawdzić numer
Prosty sposób, aby zweryfikować numer telefonu własność jest poprzez wysłanie wiadomości SMS do numer, zawierający kod weryfikacyjny jeden raz, a po nich wprowadzić że do swojej aplikacji. Interfejs API do weryfikacji SMS zapewnia możliwość sprawdzania przez aplikację przychodzącego SMS-a, z którego może automatycznie analizować kod.
Aby zacząć, aplikacja będzie SmsRetrieverClient z kodem tak:
SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);
Task<Void> task = client.startSmsRetriever();
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// successfully started an SMS Retriever for one SMS message
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
});
);
To całkiem proste - masz klienta SMS Retriever, a następnie rozpocząć zadanie dla niego. Zadanie ma włączony detektor Success, a także jeden z nich: Niepowodzenie nadpisania. Po uruchomieniu programu SMS Retriever, wyślesz na swój serwer numer telefonu użytkownika i rozpoczniesz jego przepływ pracy dla generowania wiadomości i wysyłania jej na ten numer.
Wiadomość musi być skonstruowana w określony sposób. Wiadomość musi zmieścić się w wiadomości SMS, więc nie może być dłuższa niż 140 bajtów. Numer musi się zaczynać od określonego prefiksu: "< #>" lub dwóch kolejnych znaków o zerowej szerokości (U + 200B). Więcej informacji znajdziesz w documentation dla . Musi się zakończyć 11-znakowym hashem, który identyfikuje twoją aplikację, opisaną poniżej.
Przykład:
< #> Użyj 123456 jako kod weryfikacyjny w przykładzie aplikacji!
FA + 9qCX9VSu
jednorazową kod weryfikacyjny może być dowolny ciąg znaków: wystarczy wygenerować liczbę losową. Komunikat musi się kończyć haszem, który jest określony zgodnie z procedurami tutaj. Usługi Google Play będą korzystać z tego skrótu do określenia, dla której aplikacji ma nastąpić weryfikacja. Konieczne jest wygenerowanie tego skrótu tylko raz dla pakietu aplikacji i certyfikatu podpisu : to się nie zmieni i nie powinno być dostarczane przez aplikację kliencką .
Twój serwer może następnie wysłać wiadomość na telefon przy użyciu istniejącej infrastruktury lub usługi SMS o nazwie . Po odebraniu tej wiadomości usługi Google Play rozgłaszają intencję zawierającą tekst wiadomości o numerze . Oto kod:
public class MySMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
switch(status.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
break;
case CommonStatusCodes.TIMEOUT:
break;
}
}
}
}
W onReceive odbiornika transmisji można uzyskać dodatki i ciągnąć status stamtąd. Jeśli status wskazuje, że wiadomość została pomyślnie odebrana, możesz pobrać wiadomość z dodatków. Tutaj możesz zanalizować kod weryfikacyjny i odesłać go na swój serwer na numer , aby potwierdzić własność numeru telefonu.
Co masz na myśli mówiąc, że to "nie jest bezpieczne"? – Tushar
Nie wiem jak to robi WhatsApp, a może inni też nie wiedzą. Może mógłbyś nas oszukać? –
Właściwie, z mojego doświadczenia WhatsApp * nie * wysyła weryfikację SMS-em przy tworzeniu konta. – kabuko