Для автоматической проверки телефонных номеров необходимо реализовать как клиентскую, так и серверную части потока проверки. В этом документе описывается, как реализовать клиентскую часть в приложении Android.
Чтобы начать процесс проверки номера телефона в приложении Android, вы отправляете номер телефона на свой сервер проверки и вызываете API SMS Retriever, чтобы начать прослушивание SMS-сообщения, содержащего одноразовый код для вашего приложения. После получения сообщения вы отправляете одноразовый код обратно на свой сервер, чтобы завершить процесс проверки.
Чтобы подготовить свое приложение, выполните действия, описанные в следующих разделах.
Предварительные условия приложения
Убедитесь, что файл сборки вашего приложения использует следующие значения:
- MinSdkVersion 19 или выше
- compileSdkVersion версии 28 или выше
Настройте свое приложение
В файле build.gradle на уровне проекта включите репозиторий Maven от Google и центральный репозиторий Maven в разделы buildscript
и allprojects
:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
Добавьте зависимость сервисов Google Play для API SMS Retriever в файл сборки Gradle вашего модуля , который обычно называется app/build.gradle
:
dependencies {
implementation 'com.google.android.gms:play-services-auth:21.3.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.2.0'
}
1. Получите номер телефона пользователя.
Вы можете получить номер телефона пользователя любым подходящим для вашего приложения способом. Часто лучшим пользовательским опытом является использование подборщика подсказок, чтобы предложить пользователю выбрать из сохраненных на устройстве телефонных номеров и тем самым избежать необходимости вручную вводить номер телефона. Чтобы использовать подборщик подсказок:
// 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);
}
// 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(); <-- will need to process phone number string
}
}
}
2. Запустите программу для извлечения SMS.
Когда вы будете готовы проверить номер телефона пользователя, получите экземпляр объекта SmsRetrieverClient
, вызовите startSmsRetriever
и присоедините прослушиватели успешного и неудачного выполнения к задаче получения SMS:
// Get an instance of SmsRetrieverClient, used to start listening for a matching
// SMS message.
SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);
// Starts SmsRetriever, which waits for ONE matching SMS message until timeout
// (5 minutes). The matching SMS message will be sent via a Broadcast Intent
// with action SmsRetriever#SMS_RETRIEVED_ACTION.
Task<Void> task = client.startSmsRetriever();
// Listen for success/failure of the start Task. If in a background thread, this
// can be made blocking using Tasks.await(task, [timeout]);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// Successfully started retriever, expect broadcast intent
// ...
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Failed to start retriever, inspect Exception for more details
// ...
}
});
Задача извлечения SMS будет в течение пяти минут ожидать SMS-сообщения, содержащего уникальную строку, идентифицирующую ваше приложение.
3. Отправьте номер телефона на ваш сервер
После того, как вы получили номер телефона пользователя и начали прослушивать SMS-сообщения, отправьте номер телефона пользователя на ваш сервер проверки любым способом (обычно с помощью HTTPS POST-запроса).
Ваш сервер генерирует проверочное сообщение и отправляет его по SMS на указанный вами номер телефона. См. Выполнение проверки SMS на сервере .
4. Получайте проверочные сообщения
Когда на устройстве пользователя получено сообщение о проверке, сервисы Play явно транслируют в ваше приложение намерение SmsRetriever.SMS_RETRIEVED_ACTION
, содержащее текст сообщения. Используйте BroadcastReceiver
для получения этого сообщения о проверке.
В обработчике onReceive
объекта BroadcastReceiver
получите текст проверочного сообщения (и, при необходимости, адрес отправителя) из дополнительных данных объекта Intent:
/**
* BroadcastReceiver to wait for SMS messages. This can be registered either
* in the AndroidManifest or at runtime. Should filter Intents on
* SmsRetriever.SMS_RETRIEVED_ACTION.
*/
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:
// (Optional) Get SMS Sender address - only available in
// GMS version 24.20 onwards, else it will return null
String senderAddress = extras.getString(SmsRetriever.EXTRA_SMS_ORIGINATING_ADDRESS);
// Get SMS message contents
String message = extras.getString(SmsRetriever.EXTRA_SMS_MESSAGE);
// Extract one-time code from the message and complete verification
// by sending the code back to your server.
break;
case CommonStatusCodes.TIMEOUT:
// Waiting for SMS timed out (5 minutes)
// Handle the error ...
break;
}
}
}
}
Зарегистрируйте этот BroadcastReceiver
с фильтром намерений com.google.android.gms.auth.api.phone.SMS_RETRIEVED
(значение константы SmsRetriever.SMS_RETRIEVED_ACTION
) и разрешением com.google.android.gms.auth.api.phone.permission.SEND
(значение константы SmsRetriever.SEND_PERMISSION
) в файле AndroidManifest.xml
вашего приложения, как в следующем примере, или динамически с помощью Context.registerReceiver
.
<receiver android:name=".MySMSBroadcastReceiver" android:exported="true"
android:permission="com.google.android.gms.auth.api.phone.permission.SEND">
<intent-filter>
<action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
</intent-filter>
</receiver>
5. Отправьте одноразовый код из проверочного сообщения на ваш сервер.
Теперь, когда у вас есть текст сообщения проверки, используйте регулярное выражение или какую-то другую логику, чтобы получить одноразовый код из сообщения. Формат одноразового кода зависит от того, как вы реализовали их на своем сервере.
Наконец, отправьте одноразовый код на ваш сервер по защищенному соединению. Когда ваш сервер получает одноразовый код, он регистрирует, что номер телефона был проверен.