ในการยืนยันหมายเลขโทรศัพท์โดยอัตโนมัติ คุณต้องใช้ทั้งลูกค้าและ ส่วนของขั้นตอนการตรวจสอบเพื่อยืนยัน เอกสารนี้อธิบายวิธี นำส่วนของลูกค้าไปใช้ในแอป Android
หากต้องการเริ่มขั้นตอนการยืนยันหมายเลขโทรศัพท์ในแอป Android คุณจะต้องส่ง หมายเลขโทรศัพท์ไปยังเซิร์ฟเวอร์การยืนยันของคุณ และเรียก SMS Retriever API เพื่อเริ่มต้น ฟังข้อความ SMS ที่มีรหัสแบบใช้ครั้งเดียวสำหรับแอปของคุณ หลังจากที่คุณ ได้รับข้อความ คุณจะส่งรหัสแบบใช้ครั้งเดียวกลับไปยังเซิร์ฟเวอร์ของคุณเพื่อดำเนินการ ของกระบวนการยืนยันตัวตน
ก่อนเริ่มต้น
ทําตามขั้นตอนในส่วนต่อไปนี้เพื่อเตรียมแอป
ข้อกำหนดเบื้องต้นของแอป
ตรวจสอบว่าไฟล์บิลด์ของแอปใช้ค่าต่อไปนี้
- minSdkVersion 19 ขึ้นไป
- compileSdkVersion 28 ขึ้นไป
กำหนดค่าแอป
ในไฟล์ create.gradle ระดับโปรเจ็กต์ของคุณ ให้ใส่ที่เก็บ Maven ของ Google
และที่เก็บส่วนกลางของ Maven
ทั้งในส่วน buildscript
และ allprojects
:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
เพิ่มทรัพยากร Dependency ของบริการ Google Play
สำหรับ SMS Retriever API ไปยังไฟล์บิลด์ Gradle ของโมดูล
ซึ่งโดยทั่วไปคือ app/build.gradle
dependencies {
implementation 'com.google.android.gms:play-services-auth:21.2.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.1.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 Retriever
เมื่อคุณพร้อมที่จะยืนยันหมายเลขโทรศัพท์ของผู้ใช้ ให้ขอรับตัวอย่าง
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 เป็นเวลาสูงสุด 5 นาที ซึ่งมีสตริงที่ไม่ซ้ำกันซึ่งระบุแอปของคุณ
3. ส่งหมายเลขโทรศัพท์ไปยังเซิร์ฟเวอร์ของคุณ
หลังจากได้รับหมายเลขโทรศัพท์ของผู้ใช้และเริ่มฟัง SMS ส่งหมายเลขโทรศัพท์ของผู้ใช้ไปยังเซิร์ฟเวอร์การยืนยันโดยใช้ (โดยปกติจะมีคำขอ HTTPS POST)
เซิร์ฟเวอร์ของคุณจะสร้างข้อความยืนยันและส่งทาง SMS ไปยังโทรศัพท์ หมายเลขที่คุณระบุ โปรดดูดำเนินการยืนยันทาง SMS บนเซิร์ฟเวอร์
4. รับข้อความยืนยัน
เมื่อได้รับข้อความยืนยันในอุปกรณ์ของผู้ใช้แล้ว บริการ Google Play
ประกาศ Intent SmsRetriever.SMS_RETRIEVED_ACTION
ไปยังแอปของคุณอย่างชัดเจน
ซึ่งมีเนื้อหาของข้อความ ใช้BroadcastReceiver
เพื่อรับ
ข้อความยืนยันนี้
ในเครื่องจัดการ onReceive
ของ BroadcastReceiver
ให้รับข้อความของ
ข้อความยืนยัน (และเพิ่มที่อยู่ผู้ส่ง) จาก
เพิ่มเติม:
/**
* 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
นี้โดยใช้ตัวกรอง Intent
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. ส่งรหัสแบบใช้ครั้งเดียวจากข้อความยืนยันไปยังเซิร์ฟเวอร์
ตอนนี้คุณมีข้อความของข้อความยืนยันแล้ว ให้ใช้นิพจน์ทั่วไป หรือตรรกะอื่นๆ ในการรับรหัสแบบใช้ครั้งเดียวจากข้อความ รูปแบบของ โค้ดแบบใช้ครั้งเดียวขึ้นอยู่กับวิธีที่คุณนำโค้ดดังกล่าวไปใช้ในเซิร์ฟเวอร์ของคุณ
ขั้นตอนสุดท้าย ส่งรหัสแบบใช้ครั้งเดียวไปยังเซิร์ฟเวอร์ของคุณผ่านการเชื่อมต่อที่ปลอดภัย วันและเวลา เซิร์ฟเวอร์ของคุณจะได้รับรหัสแบบใช้ครั้งเดียว ซึ่งจะบันทึกว่าหมายเลขโทรศัพท์นั้น ได้รับการยืนยันแล้ว