Android手机号码验证

时间:2013-01-17 19:10:48

标签: android sms whatsapp phone-number verification

我需要一种方法来验证我的Android应用程序中设置的手机号码是否正确,如“所有权” - 而不是手机号码的数据验证。

E.g。 WhatsApp的做法......

我知道如何使用代码和内容进行短信验证。问题是它是一个免费的Android应用程序,我不想热衷于在应用程序免费时支付每个发送的短信。糟糕的商业模式......

有没有办法安全无忧地执行此操作?

使用API​​代码似乎不太安全,因此我不担心这个选项:

TelephonyManager tMgr  (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
mPhoneNumber = tMgr.getLine1Number();

2 个答案:

答案 0 :(得分:19)

WhatsApp没有向您发送任何短信,它会将您自己的手机短信发送到您自己的号码。如果您收到短信,一切正常,如果您没有收到短信,则不会拥有该号码。这是检查用户是否使用实际号码注册的唯一便宜且简单的方法。

答案 1 :(得分:2)

  

Google Play服务有两个新API可帮助您获取用户   电话号码并通过短信验证它没有设备权限:   电话选择器和短信搜索器。

     

使用电话选择器获取号码

     

第一步是让用户启动短信验证   在你的应用程序内您的应用可能会提示用户输入手机   数字,您可以使用电话选择器使这更容易使用   像这样的代码:

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

HintRequest构建器告诉Play服务一个电话号码   标识符是必需的。然后用它来创建和启动一个意图,   这将向用户显示播放服务对话框,允许他们使用   选择他们的电话号码与应用分享。这个API没有   需要任何权限,并显示可用的号码   电话或Google帐户供用户选择。

     

当用户选择电话号码时,它将返回到   在运行the的设备上以E164格式在onActivityResult中应用   Play服务的最新版本。请注意,在某些情况下,取决于   你的手机,你可能没有电话号码,所以一定要检查一下   凭证不为空。如果你没有号码,你需要   为您的用户提供一种手动输入的方式。

// 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(); <-- E.164 format phone number on 10.2.+ devices
      }
  }
}
     

此时,您的用户将拥有一个电话号码字符串。而   这很有用,您可能想要验证用户是否拥有此功能   特定数字,例如允许它们发送或检索   与其他用户联系或使用此号码表明自己的信息。

     

使用SMS Verification API验证号码

     

验证电话号码所有权的一种简单方法是发送短信至   数字,包含一次验证码,并拥有它们   将其输入您的应用程序。 SMS验证API为您提供   应用程序能够侦听来自哪个短信   自动解析代码。

     

要开始使用,您的应用将使用SmsRetrieverClient,代码如下:

SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);

Task<Void> task = client.startSmsRetriever();

task.addOnSuccessListener(new OnSuccessListener<Void>() {
  @Override
  public void onSuccess(Void aVoid) {
    // successfully started an SMS Retriever for one SMS message
  }
});

task.addOnFailureListener(new OnFailureListener() {
  @Override
  public void onFailure(@NonNull Exception e) {
  });
);
     

这非常简单 - 你得到一个SMS Retriever客户端,然后启动一个   它的任务。该任务有一个成功监听器和一个on   无法覆盖。启动SMS Retriever后,您将发送   用户的电话号码到您的服务器并启动它的工作流程   生成消息并将其发送到该号码。

     

需要以特定方式构建消息。消息   必须符合SMS消息,因此它不能超过140个字节。它   需要以特定的前缀开头:&#39;&lt;#&gt;&#39;或连续两次   零宽度空格字符(U + 200B)。请参阅documentation   您的更多信息。它必须以11个字符的哈希结尾   识别您的应用,如下所述。

     

示例:

     

&LT;#&GT;在示例应用程序中使用123456作为验证码!

     

FA + 9qCX9VSu

     

一次性验证码可以是任何字符串:您可以简单   生成一个随机数。消息需要以散列结束   根据这里的程序确定。 Google Play服务会   使用此哈希来确定验证消息的用途。   您只需要为您的应用包生成一次此哈希值   签署证书:它不会改变,也不应该被提供   客户端应用。

     

然后,您的服务器可以使用您现有的信息将消息发送到手机   SMS基础设施或服务。收到此消息后,Google   播放服务广播包含文本的意图   信息。这是代码:

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:
          String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
          break;
        case CommonStatusCodes.TIMEOUT:
          break;
      }
    }
  }
}
     

在广播接收器的onReceive中,您可以获得额外内容   从那里拉出状态。如果状态指示该消息   成功收到,您可以从附加内容中提取消息。   从这里,您可以解析验证码并将其发回   您的服务器以确认电话号码所有权。

参考:Effective phone number verification