درخواست رضایت یک بار برای خواندن کد تأیید پیامکی

این صفحه نحوه استفاده از API رضایت کاربر پیامکی را برای درخواست رضایت کاربر برای خواندن یک پیام تأیید پیامکی شرح می‌دهد. در صورت رضایت کاربر، API متن پیام را برمی‌گرداند که از آن می‌توانید کد تأیید را دریافت کرده و فرآیند تأیید را تکمیل کنید.

نصب وابستگی‌ها

کامپوننت احراز هویت Play Services را در فایل build.gradle برنامه خود قرار دهید:

implementation 'com.google.android.gms:play-services-auth:17.0.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:17.4.0'

۱. شماره تلفن کاربر را دریافت کنید

اگر شماره تلفن کاربر را ندارید، قبل از شروع فرآیند تأیید پیامکی، آن را درخواست کنید.

شما می‌توانید شماره تلفن کاربر را به روشی که برای برنامه شما مناسب است، دریافت کنید. اگر برای ایجاد حساب کاربری نیازی به وارد کردن شماره تلفن توسط کاربر نبود، می‌توانید از انتخابگر راهنمای قفل هوشمند برای رمزهای عبور استفاده کنید تا به او در پر کردن آن کمک کنید. برای استفاده از انتخابگر راهنمای کاربر:

کاتلین

private val CREDENTIAL_PICKER_REQUEST = 1  // Set to an unused request code

// Construct a request for phone numbers and show the picker
private fun requestHint() {
    val hintRequest = HintRequest.Builder()
        .setPhoneNumberIdentifierSupported(true)
        .build()
    val credentialsClient = Credentials.getClient(this)
    val intent = credentialsClient.getHintPickerIntent(hintRequest)
    startIntentSenderForResult(
        intent.intentSender,
        CREDENTIAL_PICKER_REQUEST,
        null, 0, 0, 0
    )
}

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
        CREDENTIAL_PICKER_REQUEST ->
            // Obtain the phone number from the result
            if (resultCode == Activity.RESULT_OK && data != null) {
                val credential = data.getParcelableExtra<Credential>(Credential.EXTRA_KEY)
                // credential.getId();  <-- will need to process phone number string
            }
        // ...
    }
}

جاوا

private static final int CREDENTIAL_PICKER_REQUEST = 1;  // Set to an unused request code

// Construct a request for phone numbers and show the picker
private void requestHint() throws IntentSender.SendIntentException {
    HintRequest hintRequest = new HintRequest.Builder()
            .setPhoneNumberIdentifierSupported(true)
            .build();
    PendingIntent intent = Credentials.getClient(this).getHintPickerIntent(hintRequest);
    startIntentSenderForResult(intent.getIntentSender(),
            RESOLVE_HINT, null, 0, 0, 0);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case CREDENTIAL_PICKER_REQUEST:
            // Obtain the phone number from the result
            if (resultCode == RESULT_OK) {
                Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
                // credential.getId();  <-- will need to process phone number string
            }
            break;
        // ...
    }
}

۲. شروع به گوش دادن به پیام‌های دریافتی کنید

در مرحله بعد، متد startSmsUserConsent() از API مربوط به SMS User Consent را فراخوانی کنید تا شروع به گوش دادن به پیام‌های دریافتی کنید. اگر شماره تلفنی که پیام SMS از آن ارسال می‌شود را می‌دانید، آن را مشخص کنید (در غیر این صورت، مقدار null را وارد کنید). به این ترتیب، API مربوط به SMS User Consent فقط روی پیام‌های دریافتی از این شماره فعال می‌شود.

برای شروع گوش دادن:

کاتلین

// Start listening for SMS User Consent broadcasts from senderPhoneNumber
// The Task<Void> will be successful if SmsRetriever was able to start
// SMS User Consent, and will error if there was an error starting.
val task = SmsRetriever.getClient(context).startSmsUserConsent(senderPhoneNumber /* or null */)

جاوا

// Start listening for SMS User Consent broadcasts from senderPhoneNumber
// The Task<Void> will be successful if SmsRetriever was able to start
// SMS User Consent, and will error if there was an error starting.
Task<Void> task = SmsRetriever.getClient(context).startSmsUserConsent(senderPhoneNumber /* or null */);

وقتی پیامک‌های دریافتی را دریافت کردید، می‌توانید از سیستم تأیید خود بخواهید کد تأیید را به شماره تلفن کاربر که در مرحله اول دریافت کرده‌اید، ارسال کند.

برای پنج دقیقه‌ی بعدی، وقتی دستگاه یک پیامک حاوی کد یکبار مصرف دریافت می‌کند، سرویس‌های Play یک اینتنت را به برنامه‌ی شما ارسال می‌کنند تا از کاربر اجازه‌ی خواندن پیام را بگیرد. یک پیام فقط در صورتی ارسال را آغاز می‌کند که معیارهای زیر را داشته باشد:

  • این پیام حاوی یک رشته الفبایی-عددی ۴ تا ۱۰ کاراکتری با حداقل یک عدد است.
  • اگر شماره تلفن فرستنده را مشخص کرده باشید، پیام توسط آن شماره ارسال شده است.

این پخش‌ها را با یک گیرنده پخش که مجوز SEND_PERMISSION دارد و به اهداف SMS_RETRIEVED_ACTION پاسخ می‌دهد، مدیریت کنید. برای ایجاد و ثبت گیرنده پخش:

کاتلین

private val SMS_CONSENT_REQUEST = 2  // Set to an unused request code
private val smsVerificationReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
            val extras = intent.extras
            val smsRetrieverStatus = extras?.get(SmsRetriever.EXTRA_STATUS) as Status

            when (smsRetrieverStatus.statusCode) {
                CommonStatusCodes.SUCCESS -> {
                    // Get consent intent
                    val consentIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
                    try {
                        // Start activity to show consent dialog to user, activity must be started in
                        // 5 minutes, otherwise you'll receive another TIMEOUT intent
                        startActivityForResult(consentIntent, SMS_CONSENT_REQUEST)
                    } catch (e: ActivityNotFoundException) {
                        // Handle the exception ...
                    }
                }
                CommonStatusCodes.TIMEOUT -> {
                    // Time out occurred, handle the error.
                }
            }
        }
    }
}

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    val intentFilter = IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)
    registerReceiver(smsVerificationReceiver, SmsRetriever.SEND_PERMISSION, intentFilter)
}

جاوا

private static final int SMS_CONSENT_REQUEST = 2;  // Set to an unused request code
private final BroadcastReceiver smsVerificationReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
            Bundle extras = intent.getExtras();
            Status smsRetrieverStatus = (Status) extras.get(SmsRetriever.EXTRA_STATUS);

            switch (smsRetrieverStatus.getStatusCode()) {
                case CommonStatusCodes.SUCCESS:
                    // Get consent intent
                    Intent consentIntent = extras.getParcelable(SmsRetriever.EXTRA_CONSENT_INTENT);
                    try {
                        // Start activity to show consent dialog to user, activity must be started in
                        // 5 minutes, otherwise you'll receive another TIMEOUT intent
                        startActivityForResult(consentIntent, SMS_CONSENT_REQUEST);
                    } catch (ActivityNotFoundException e) {
                        // Handle the exception ...
                    }
                    break;
                case CommonStatusCodes.TIMEOUT:
                    // Time out occurred, handle the error.
                    break;
            }
        }
    }
};

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

    // ...

    IntentFilter intentFilter = new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION);
    registerReceiver(smsVerificationReceiver, SmsRetriever.SEND_PERMISSION, intentFilter);
}

با شروع یک فعالیت برای EXTRA_CONSENT_INTENT ، شما از کاربر اجازه یک‌باره برای خواندن محتوای پیام را درخواست می‌کنید.

۳. کد تأیید را از یک پیام دریافت کنید

در متد onActivityResult() ، پاسخ کاربر به درخواست مجوز شما را مدیریت کنید. اگر کد نتیجه RESULT_OK را دریافت کردید، به کاربر اجازه داده شده است تا محتوای پیام را بخواند و شما می‌توانید متن پیام را از intent دریافت کنید.

کاتلین

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
        // ...
        SMS_CONSENT_REQUEST ->
            // Obtain the phone number from the result
            if (resultCode == Activity.RESULT_OK && data != null) {
                // Get SMS message content
                val message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE)
                // Extract one-time code from the message and complete verification
                // `message` contains the entire text of the SMS message, so you will need
                // to parse the string.
                val oneTimeCode = parseOneTimeCode(message) // define this function

                // send one time code to the server
            } else {
                // Consent denied. User can type OTC manually.
            }
    }
}

جاوا

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        // ...
        case SMS_CONSENT_REQUEST:
            if (resultCode == RESULT_OK) {
                // Get SMS message content
                String message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE);
                // Extract one-time code from the message and complete verification
                // `sms` contains the entire text of the SMS message, so you will need
                // to parse the string.
                String oneTimeCode = parseOneTimeCode(message); // define this function

                // send one time code to the server
            } else {
                // Consent canceled, handle the error ...
            }
            break;
    }
}

وقتی متن پیام را دریافت کردید، می‌توانید کد تأیید را تجزیه و تحلیل کنید و فرم را به صورت خودکار پر کنید یا به هر طریق دیگری روند تأیید را تکمیل کنید.