要构建使用电话号码的应用程序,通常至关重要的是验证用户是否拥有一个号码。从 UX 的角度来说,这样做可能很棘手,尤其是在了解不同区域设置中的电话号码格式时,还要提供一种不麻烦或使用侵入式设备权限的验证机制,例如阅读用户的所有短信。
有许多库可以高效地预先构建手机验证,例如 Firebase Phone Auth(Firebase 手机认证) ,但如果你是高级开发者,并且需要自行构建此功能,Google Play Services 有两个新的 API 可帮助你获取用户的电话号码并进行验证它通过短信无设备权限: 电话选择器 和 短信检索 。像 Flipkart 这样的应用程序在使用这些方法的电话号码注册流程中成功率提高了 12%。
在这里看到在你的服务器使用这些服务的 步骤 :
在这篇文章中,我们将展示你需要为用户提供电话号码选择器的代码,然后使用 SMS Retriever API 从服务器请求验证码,Android 设备将自动接收并解析从用户输入。
注意 :开始之前,你需要构建并测试这是一个具有可接收短信和运行 Google Play 服务 10.2.x 及更高版本的电话号码的设备。
第一步是让用户从你的应用程序中启动短信验证。你的应用程序可能会提示用户输入电话号码,你可以使用电话选择器使其更容易,使用以下代码:
- // 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 Services 需要一个电话号码标识符。然后,它用于创建和启动一个 intent,这将向用户显示 Play Service 对话框,允许用户选择要与应用分享的电话号码。此 API 不需要任何权限,并显示手机或 Google 帐户可用于用户选择的号码。
当用户选择电话号码时,将以运行最新版本的 Play Services 的设备以 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 验证 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 客户端,然后为它开始一个任务。任务有一个成功监听器以及一个失败的覆盖。启动 SMS Retriever 后,你可以将用户的电话号码发送到服务器,并启动生成消息并将其发送到该号码的工作流程。
该消息需要以特定的方式构建。消息必须符合 SMS 消息,因此不能超过 140 个字节。它需要从一个特定的前缀开始:'<#>'或两个连续的零宽度空格字符(U + 200B)。有关 详细信息,请参阅 文档 。它必须以标识你的应用的 11 个字符的哈希结尾,如下所述。
例:
- <#> Use 123456 as your verification code in Example App!
-
- FA+9qCX9VSu
-
一次验证码可以是任何字符串:你可以简单地生成一个随机数。消息需要以根据 这里 的过程确定的哈希结束。Google Play 服务将使用此散列来确定验证消息的应用程序。你只需要为你的应用程序包和签名证书生成一次哈希值:它不会更改,不应由客户端应用程序提供。
然后,你的服务器可以使用现有的 SMS 基础架构或服务将消息发送到手机。收到此邮件后,Google Play 服务会广播包含邮件文字的 intent。以下是代码:
- 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 中,你可以获得附加功能,并从中拉出状态。如果状态指示消息已成功接收,则可以从附加信息中拉出消息。从这里你可以解析验证码并将其发送回服务器以确认电话号码所有权。
有关更多信息,请查看完整的 文档 和今年的 Google I / O 会谈 。
我们早期使用此 API 的合作伙伴喜欢它。以下是他们的一些评价:
Twilio(link:https://www.twilio.com/blog/2017/05/twilio-verification-sdk-android-app-sms-permissions-phone-verification-has-never-been-easier.html) 观察并发现 Android SMS 验证从未如此简单。
“如果你是开发者使用手机号码注册和识别用户帐户,那么你应该使用 Android 的 Twilio 验证 SDK,以最快的方式解决提供顺利,安全和轻松的登录流程的问题“。 - Twilio 的产品负责人 Simon Thorpe
Authy(link:https://authy.com/blog/authy-for-android-app-is-now-easier-to-use-and-safer-too/) 喜欢这些 API 可以与现有的 SMS 基础设施协同工作,而不需要进行许多更改。
“将电话选择器+短信检索器添加到 Authy 2FA 应用程序中为用户提供了神奇的 UX,同时保留了我们的应用程序所需的高安全性。 - Authy 工程部主管 Serge Kruppa
Telesign(link:https://www.telesign.com/blog/post/telesign-app-verify-now-offers-autosms-mode-with-even-lower-friction-during-android-user-verification/) 通过相同的后端框架观察到更好的 UX,更高的安全性和更高的转换率。
“这种具有较低摩擦力的验证模式的一个显着优点是,客户可能会看到用户注册和注册情况下的转化率提高。
增强的安全性也是一个好处,因为 Google Play 服务只能根据消息内的应用程序散列,向目标应用程序提供对 SMS 消息的访问。“ - Priyesh Jain(作者)