หากต้องการยืนยันหมายเลขโทรศัพท์โดยอัตโนมัติ คุณต้องใช้ทั้งส่วนของไคลเอ็นต์และเซิร์ฟเวอร์ในขั้นตอนการยืนยัน เอกสารนี้อธิบายวิธีใช้ส่วนของไคลเอ็นต์ในแอป Android
หากต้องการเริ่มขั้นตอนการยืนยันหมายเลขโทรศัพท์ในแอป Android ให้ส่งหมายเลขโทรศัพท์ไปยังเซิร์ฟเวอร์ยืนยันและเรียกใช้ SMS Retriever API เพื่อเริ่มรอรับข้อความ SMS ที่มีรหัสแบบใช้ครั้งเดียวสำหรับแอป หลังจากได้รับข้อความแล้ว ให้ส่งรหัสแบบใช้ครั้งเดียวกลับไปยังเซิร์ฟเวอร์เพื่อดำเนินการตามกระบวนการยืนยันให้เสร็จสมบูรณ์
โปรดทำตามขั้นตอนในส่วนต่อไปนี้เพื่อเตรียมแอป
ข้อกำหนดเบื้องต้นของแอป
ตรวจสอบว่าไฟล์ Build ของแอปใช้ค่าต่อไปนี้
- minSdkVersion ตั้งแต่ 19 ขึ้นไป
- compileSdkVersion ตั้งแต่ 28 ขึ้นไป
กำหนดค่าแอป
ในไฟล์ build.gradle ระดับโปรเจ็กต์ ให้รวม
ที่เก็บ Maven ของ Google และ ที่เก็บ Maven Central ไว้ในทั้งส่วน
buildscript และ allprojects ดังนี้
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
เพิ่มทรัพยากร Dependency ของ Google Play Services สำหรับ SMS Retriever API ลงใน
ไฟล์ Build ของ Gradle ของโมดูล ซึ่งโดยทั่วไปจะเป็นไฟล์ app/build.gradle ดังนี้
dependencies {
implementation 'com.google.android.gms:play-services-auth:22.0.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.3.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
}
}
}
เริ่ม SMS Retriever
เมื่อพร้อมที่จะยืนยันหมายเลขโทรศัพท์ของผู้ใช้แล้ว ให้รับอินสแตนซ์ของออบเจ็กต์ SmsRetrieverClient เรียกใช้ startSmsRetriever และแนบ Listener สำหรับความสำเร็จและความล้มเหลวลงในงานการดึงข้อมูล 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 using 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 นาที
ส่งหมายเลขโทรศัพท์ไปยังเซิร์ฟเวอร์
หลังจากได้รับหมายเลขโทรศัพท์ของผู้ใช้และเริ่มรอรับข้อความ SMS แล้ว ให้ส่งหมายเลขโทรศัพท์ของผู้ใช้ไปยังเซิร์ฟเวอร์การยืนยันโดยใช้วิธีใดก็ได้ (โดยปกติจะใช้คำขอ HTTPS POST)
เซิร์ฟเวอร์จะสร้างข้อความยืนยันและส่งข้อความดังกล่าวทาง SMS ไปยังหมายเลขโทรศัพท์ที่คุณระบุ ดูหัวข้อ ทำการยืนยัน SMS ในเซิร์ฟเวอร์
รับข้อความยืนยัน
เมื่ออุปกรณ์ของผู้ใช้ได้รับข้อความยืนยัน Play Services จะออกอากาศ Intent SmsRetriever.SMS_RETRIEVED_ACTION ไปยังแอปของคุณอย่างชัดเจน ซึ่ง Intent นี้จะมีข้อความ ใช้ BroadcastReceiver เพื่อรับข้อความยืนยันนี้
ใน Handler onReceive ของ BroadcastReceiver ให้รับข้อความยืนยัน (และที่อยู่ของผู้ส่งหากต้องการ) จากส่วนเพิ่มเติมของ Intent
/**
* BroadcastReceiver to wait for SMS messages. This can be registered either
* in the AndroidManifest or at runtime. Filters 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)
คุณสามารถลงทะเบียน Receiver ในไฟล์ 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>
ส่งรหัสแบบใช้ครั้งเดียวจากข้อความยืนยันไปยังเซิร์ฟเวอร์
เมื่อได้ข้อความยืนยันแล้ว ให้ใช้นิพจน์ทั่วไปหรือตรรกะอื่นๆ เพื่อรับรหัสแบบใช้ครั้งเดียวจากข้อความ รูปแบบของรหัสแบบใช้ครั้งเดียวจะขึ้นอยู่กับวิธีที่คุณใช้รหัสเหล่านี้ในเซิร์ฟเวอร์
สุดท้าย ให้ส่งรหัสแบบใช้ครั้งเดียวไปยังเซิร์ฟเวอร์ผ่านการเชื่อมต่อที่ปลอดภัย เมื่อเซิร์ฟเวอร์ได้รับรหัสแบบใช้ครั้งเดียว เซิร์ฟเวอร์จะบันทึกว่าหมายเลขโทรศัพท์ได้รับการยืนยันแล้ว