Android অ্যাপে এসএমএস যাচাইকরণের অনুরোধ করা

ফোন নম্বর অটোমেটিক যাচাই করতে, আপনাকে যাচাইকরণ ফ্লোয়ের ক্লায়েন্ট ও সার্ভার, উভয় অংশই প্রয়োগ করতে হবে। এই ডকুমেন্ট থেকে জানা যায় যে কীভাবে Android অ্যাপে ক্লায়েন্ট অংশ প্রয়োগ করতে হয়।

Android অ্যাপে ফোন নম্বর যাচাইকরণ ফ্লো শুরু করতে, আপনি যাচাইকরণ সার্ভারে ফোন নম্বর পাঠান এবং আপনার অ্যাপের জন্য একবার ব্যবহার করার মতো কোড সহ এসএমএস মেসেজ শোনার জন্য SMS Retriever API কল করেন। মেসেজ পাওয়ার পরে, যাচাইকরণ প্রসেস সম্পূর্ণ করতে আপনি একবার ব্যবহার করার মতো কোডটি আপনার সার্ভারে ফেরত পাঠান।

আপনার অ্যাপ প্রস্তুত করতে, নিম্নলিখিত বিভাগে উল্লেখ করা ধাপগুলি সম্পূর্ণ করুন।

অ্যাপের পূর্বশর্ত

আপনার অ্যাপের বিল্ড ফাইল নিম্নলিখিত ভ্যালু ব্যবহার করছে কিনা তা নিশ্চিত করুন:

  • minSdkVersion ১৯ বা তার পরবর্তী ভার্সন
  • compileSdkVersion ২৮ বা তার বেশি হতে হবে

আপনার অ্যাপ কনফিগার করুন

আপনার প্রোজেক্ট-লেভেল build.gradle ফাইলে, buildscript এবং allprojects উভয় বিভাগে Google-এর Maven রিপোজিটরি এবং Maven সেন্ট্রাল রিপোজিটরি অন্তর্ভুক্ত করুন:

buildscript {
    repositories {
        google()
        mavenCentral()
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

আপনার মডিউলের Gradle বিল্ড ফাইলে SMS Retriever API-এর জন্য Google Play পরিষেবা ডিপেন্ডেন্সি যোগ করুন, যা সাধারণত 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
      }
  }
}

এসএমএস রিট্রিভার চালু করুন

ব্যবহারকারীর ফোন নম্বর যাচাই করার জন্য আপনি প্রস্তুত হলে, SmsRetrieverClient অবজেক্টের ইনস্ট্যান্স পান, startSmsRetriever কল করুন এবং এসএমএস রিট্রিভাল টাস্কে সাকসেস ও ফেলিওর লিসেনার অ্যাটাচ করুন:

// 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
    // ...
  }
});

এসএমএস রিট্রিভাল টাস্ক সর্বাধিক পাঁচ মিনিট পর্যন্ত এমন এসএমএস মেসেজের জন্য অপেক্ষা করে যেটিতে আপনার অ্যাপ শনাক্ত করার জন্য অনন্য স্ট্রিং থাকে।

আপনার সার্ভারে ফোন নম্বর পাঠান

ব্যবহারকারীর ফোন নম্বর পাওয়ার পরে এবং এসএমএস মেসেজ শোনার জন্য শুরু করার পরে, যেকোনও পদ্ধতি (সাধারণত HTTPS POST অনুরোধের মাধ্যমে) ব্যবহার করে আপনার যাচাইকরণ সার্ভারে ব্যবহারকারীর ফোন নম্বর পাঠান।

আপনার সার্ভার একটি যাচাইকরণ মেসেজ তৈরি করে এবং আপনার উল্লেখ করা ফোন নম্বরে এসএমএস-এর মাধ্যমে সেটি পাঠায়। সার্ভারে এসএমএস যাচাইকরণ করুন দেখুন।

যাচাইকরণ মেসেজ পান

ব্যবহারকারীর ডিভাইসে যাচাইকরণ মেসেজ পাওয়া গেলে, Play পরিষেবা আপনার অ্যাপে স্পষ্টভাবে একটি SmsRetriever.SMS_RETRIEVED_ACTION ইনটেন্ট ব্রডকাস্ট করে, যার মধ্যে মেসেজের টেক্সট থাকে। এই যাচাইকরণ মেসেজ পেতে BroadcastReceiver ব্যবহার করুন।

BroadcastReceiver-এর onReceive হ্যান্ডলারে, 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 রেজিস্টার করতে, নিম্নলিখিতগুলি ব্যবহার করুন:

  • ইনটেন্ট ফিল্টার: 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>

যাচাইকরণ মেসেজ থেকে একবার ব্যবহারযোগ্য কোডটি আপনার সার্ভারে পাঠান

এখন আপনার কাছে যাচাইকরণ মেসেজের টেক্সট আছে, মেসেজ থেকে ওয়ান-টাইম কোড পেতে রেগুলার এক্সপ্রেশন বা অন্য কোনও লজিক ব্যবহার করুন। একবার ব্যবহারযোগ্য কোডের ফর্ম্যাট নির্ভর করে আপনি কীভাবে আপনার সার্ভারে এটি প্রয়োগ করেছেন তার উপর।

সবশেষে, একটি নিরাপদ কানেকশনের মাধ্যমে আপনার সার্ভারে একবার ব্যবহারযোগ্য কোড পাঠান। আপনার সার্ভার একবার ব্যবহার করার মতো কোড পেলে, এটি রেকর্ড করে যে ফোন নম্বরটি যাচাই করা হয়েছে।