繁体   English   中英

Android手机号码验证

[英]Android Phone Number Verification

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

比如WhatsApp的做法......

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

有没有办法安全免费地做到这一点?

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

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

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

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帐户上可供用户选择的号码。

当用户选择电话号码时,它将以运行最新版本Play服务的设备以E164格式返回到onActivityResult中的应用程序。 请注意,在某些情况下,根据您的手机,您可能无法获得电话号码,因此请务必检查凭据是否为空。 如果您没有号码,则需要为用户提供一种手动输入的方式。

 // 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 Verification API使您能够让应用程序监听传入的SMS,从中可以自动解析代码。

要开始使用,您的应用将使用以下代码的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客户端,然后为它启动一个任务。 该任务有一个成功侦听器以及一个要覆盖的失败。 启动SMS Retriever后,您将用户的电话号码发送到您的服务器并启动它的工作流程以生成消息并将其发送到该号码。

消息需要以特定方式构建。 该消息必须符合SMS消息,因此不能超过140个字节。 它需要以特定前缀开头:'<#>'或两个连续的零宽度空格字符(U + 200B)。 有关详细信息,请参阅文档 它必须以标识您的应用的11个字符的哈希结尾,如下所述。

例:

<#>在示例应用中使用123456作为验证码!

FA + 9qCX9VSu

一次性验证码可以是任何字符串:您只需生成一个随机数。 消息需要以根据此处的过程确定的散列结束。 Google Play服务将使用此哈希来确定验证邮件的用途。 您只需为应用程序包和签名证书生成一次此哈希值:它不会更改,也不应由客户端应用程序提供。

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

 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中,您可以获得附加功能,并从那里获取状态。 如果状态指示消息已成功接收,则可以从附加内容中提取消息。 从这里,您可以解析验证码并将其发送回您的服务器以确认电话号码所有权。

参考: 有效的电话号码验证

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM