您是否曾通过短信收到过一次性密码 (OTP) 或验证码,并注意到在最末尾有一串由 11 个字符组成的奇怪且随机的字母和数字?如果您正在构建移动应用程序或管理客户通知,了解为什么 Android 应用在接收短信时末尾需要几个字母数字字符,对于提供安全、无缝的用户体验至关重要。在这篇综合指南中,我们将揭秘这种加密哈希,解释 Android SMS Retriever API 的工作原理,并向您展示如何可靠且经济地发送这些验证消息。

了解为什么 Android 应用在接收短信时末尾需要几个字母数字字符

在移动应用开发的早期,当应用需要验证用户的手机号码时,它会请求读取用户所有短信的权限。应用会请求 READ_SMSRECEIVE_SMS 权限。一旦获得授权,应用就可以扫描每一条收到的短信,查找验证码并自动填写。

虽然这对用户来说非常方便,但它也带来了巨大的安全和隐私隐患。恶意应用可能会滥用此权限来监视个人对话、读取敏感的银行警报并窃取私密数据。为了保护用户,Google 在 Google Play 商店中严格限制了对这些权限的访问。如今,除非您的应用是设备上的默认短信处理程序,否则如果您的应用请求广泛的短信读取权限,Google 将拒绝您的应用上架。

这种安全强化措施带来了一个新挑战:应用如何在不损害用户隐私的情况下自动读取验证码?答案就是 Google 的 SMS Retriever API。而这个 API 正是为什么 Android 应用在接收短信时末尾需要几个字母数字字符的根本原因。那个奇怪的 11 位代码(例如 FA+9qZSF7WV)是一个唯一的加密签名,它允许 Android 操作系统将该特定短信直接路由到您的应用,且仅限您的应用,而无需任何侵入性权限。

Android SMS Retriever API 的作用

SMS Retriever API 允许您的 Android 应用执行安全的、基于手机号码的验证,而无需用户手动复制和粘贴代码。当短信到达设备时,Android 系统会拦截它。它会查看短信的最末尾是否存在那个特定的 11 位字母数字哈希。如果哈希与您应用的唯一签名匹配,Android 就会提取消息内容并将其直接传递给您的应用。用户无需离开您的应用,无需打开短信收件箱,也无需输入任何数字。

用户同意 API 与 SMS Retriever API

值得注意的是,Google 为此目的提供了两种不同的 API:SMS User Consent API 和 SMS Retriever API。User Consent API 会弹出一个对话框,询问用户是否允许读取单条消息,它不需要在文本末尾添加特殊哈希,但需要用户额外点击一次。而需要 11 位哈希的 SMS Retriever API 则是完全自动且对用户透明的,能够提供摩擦力最低的注册体验。

这 11 位应用哈希码是如何构建的

短信末尾的字母数字字符串并不是随机的一组字符。它是根据您的应用包名及其签名证书生成的、高度特定的、确定性的加密哈希。即使您的包名或开发者密钥库中的一个字母发生了变化,哈希值也会完全改变。

这 11 位字符串的构建遵循严格的过程:

  1. 系统获取您的应用包名(例如 com.example.myapp)。
  2. 它会附加应用辅助凭据的公钥证书签名。
  3. 它通过 SHA-256 加密哈希函数运行这个组合字符串。
  4. 生成的哈希使用 Base64 进行编码。
  5. 提取此 Base64 字符串的前 11 个字符,成为您应用唯一的 SMS 哈希。

由于此哈希对于您的特定应用和开发者签名是唯一的,因此用户手机上的其他应用都无法拦截该验证短信。这防止了恶意应用“嗅探”本应发送给您应用的验证码。

Google 要求的准确短信格式

为了让 SMS Retriever API 成功检测并路由消息,文本必须严格遵守特定格式。如果您在格式上出错,自动验证将失败,您的用户将被迫手动输入代码。消息必须满足以下标准:

  • 消息大小不得超过 140 字节(根据编码不同,大约为 140-160 个字符)。
  • 消息必须以 <#> 前缀开头,或在开头包含一个零宽空格字符。
  • 消息必须以针对您的应用生成的准确 11 位哈希码结尾。

这是一个格式完美的验证短信示例:

<#> 您的验证码是 482910。

FA+9qZSF7WV

为什么这对小型企业和开发者很重要

如果您经营一家本地服务企业——例如牙科诊所、美发沙龙、辅导学校或汽车维修店——您可能会想,为什么这个技术性的开发细节对您很重要。答案在于转化率、客户满意度和运营成本

当客户下载您的应用来预约、检查服务状态或访问其账户时,他们期待现代、无缝的体验。如果您的验证短信没有使用 SMS Retriever API,您的客户就必须离开您的应用,打开短信,记住或复制 6 位代码,切回您的应用并输入。对于非技术用户或老年客户,这种微小的摩擦往往会导致放弃注册和业务流失。

然而,在过去,实现这种自动化水平的成本一直很高。传统的短信 API(如 Twilio)收取高昂的单条消息费率,实施复杂的计费结构(按 160 个字符的片段收费),并需要繁琐的合规程序,如 A2P 10DLC 注册和运营商审批。如果您在短信中附加 11 位哈希,很容易让您的消息超过 160 个字符的限制,导致 Twilio 收取两条消息的费用。

这就是 Android 短信网关教程 变得非常有价值的地方。通过使用 MySMSGate 等服务,您可以将自己的 Android 手机和 SIM 卡变成强大的短信网关。您只需支付每条短信 0.02 美元的固定费率,没有基于片段的双重计费,没有月度合同,也绝对没有运营商注册障碍。您可以轻松地通过自己的业务电话号码发送带有必需字母数字哈希的 OTP 消息。

成本对比:传统短信 API vs. MySMSGate

让我们看看一家每月发送 1,000 条验证和通知消息的本地企业的成本情况。传统 API 不仅收取消息费,还增加了运营商费用、注册成本和片段惩罚费。

功能 / 成本传统 API (例如 Twilio)MySMSGate Android 网关
每条短信价格$0.05 - $0.08 + 运营商费$0.02 (固定费率)
片段计费是 (按 160 字符片段计费)否 (每条消息固定收费)
A2P 10DLC 注册需要 (耗时数周,需付费)不需要
月度合同/费用有 (号码、配置文件维护)无 ($0.00/月,随用随付)
发件人 ID随机短码或租用号码您自己熟悉的业务号码

如表所示,MySMSGate 是注重成本的企业的明显赢家。如果您正在寻找一种更便宜的方式来通知您的客户,请查看我们的 针对小型企业的最便宜短信 API 指南。

如何使用 MySMSGate REST API 发送带有应用哈希的 OTP 短信

将 MySMSGate 集成到您的移动应用后端以发送安全、自动验证的 OTP 消息非常简单。由于 MySMSGate 提供简洁的单端点 REST API,您可以在几分钟内完成集成。下面是一个使用 Python 和 cURL 发送包含应用唯一字母数字哈希的短信的实际示例。

首先,您必须获取应用的 11 位哈希码。您可以在开发机器上使用 keytool 生成,或者在 Android 项目中使用 Google 的 AppSignatureHelper 类。一旦获得哈希(例如 FA+9qZSF7WV),您就可以从后端服务器触发 API 调用。

Python 代码示例

以下是如何使用 Python 流行的 requests 库发送格式化的 OTP 消息:

import requests

api_url = "https://mysmsgate.net/api/v1/send"
headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}

payload = {
    "to": "+1234567890",
    "message": "<#> 您的验证码是 582910。\n\nFA+9qZSF7WV",
    "device_id": "your_connected_android_device_id",
    "sim_slot": 1
}

response = requests.post(api_url, json=payload, headers=headers)

if response.status_code == 200:
    print("OTP 发送成功!")
else:
    print(f"发送 OTP 失败: {response.text}")

cURL 命令行示例

如果您是从命令行测试或使用 shell 脚本,可以通过这个简单的 cURL 请求触发短信:

curl -X POST https://mysmsgate.net/api/v1/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+1234567890",
    "message": "<#> 您的验证码是 582910。\n\nFA+9qZSF7WV",
    "device_id": "your_connected_android_device_id"
  }'

使用 MySMSGate,如果消息因任何原因(例如目标手机断开连接)发送失败,您的余额将自动退还。这确保您只为成功的结果付费。

只需 4 步即可为您的移动应用设置 MySMSGate

设置 MySMSGate 来处理应用验证消息非常快速,且不需要复杂的开发者配置。您可以在不到五分钟内开始发送自动化消息。

  1. 第 1 步:创建免费账户
    访问 MySMSGate 注册页面 并设置您的账户。您将立即获得 Web 控制台和 API 密钥的访问权限。
  2. 第 2 步:连接您的 Android 设备
    在任何装有您业务 SIM 卡的闲置 Android 手机上下载 MySMSGate Android 应用。使用该应用扫描 Web 控制台上显示的二维码。手机将立即链接到您的账户——无需手动输入 API 密钥。
  3. 第 3 步:生成您的应用签名哈希
    使用 Google 的签名辅助工具提取生产环境 Android 应用的 11 位加密哈希。请妥善保存此代码以用于短信模板。
  4. 第 4 步:通过 API 触发您的第一个 OTP
    将我们简单的 REST API 端点集成到您的后端注册流程中。使用 <#> 前缀格式化您的验证消息,并在末尾附加 11 位哈希。您连接的 Android 手机将立即使用其活跃的 SIM 卡发出消息。

通过自己的手机路由消息,您的客户将从他们已经认识并信任的号码收到验证码,从而显著提高您的转化率和阅读率。

常见问题解答

以下是开发者和企业主关于 Android 短信验证哈希和网关设置最常问的问题及解答。

短信末尾的 11 位代码是什么?

它是根据您的 Android 应用包名及其开发者签名证书生成的唯一加密签名。Android SMS Retriever API 使用它来安全地将验证消息直接路由到您的应用,而无需请求广泛的短信读取权限。

我可以自己生成 Android 短信哈希码吗?

可以。您可以在开发机器上使用 keytoolopenssl 等命令行工具生成哈希码,或者在应用内使用 Google 的辅助类以编程方式生成。它必须使用与您为 Google Play 商店签署生产应用时相同的密钥库文件来生成。

为什么 Google 限制 Android 应用的 READ_SMS 权限?

Google 限制该权限是为了保护用户隐私。过去,恶意应用会以验证为借口请求短信读取权限,结果却是为了监视个人消息、银行警报和私密数据。SMS Retriever API 通过仅公开专门发送给您应用的消息来解决这个问题。

MySMSGate 支持发送带有字母数字哈希的短信吗?

是的,绝对支持。MySMSGate 发送的是未经处理的原始短信,完全按照您的格式发送。您可以轻松地在 API 负载中包含 <#> 前缀和 11 位哈希码。您的 Android 手机将完全按要求发送消息,接收者的手机将能成功解析。

通过 MySMSGate 发送验证短信需要多少钱?

MySMSGate 收取每条短信 0.02 美元的固定费率。与传统 API 不同,这里没有月度平台费,没有最低合同限制,也没有基于片段的双重计费。即使您的消息因应用哈希码而超过 160 个字符,您也只需支付单一的固定费率。您可以通过阅读我们的 Twilio 替代方案对比 了解更多信息。