果消息格式符合平台要求,短信一次性密码可以实现自动填充。在Android上,SMS RetrieverAPI会读取长度不超过140字节、包含验证码并包含用于识别您应用的11字符哈希值的消息。在iOS和Safari中,通过在输入框标记autocomplete="one-time-code"(原生应用中使用textContentTypeoneTimeCode)即可让键盘提示验证码。在网页端,WebOTPAPI会读取最后一行为@your-domain #code的消息。一个模板即可满足这三者的需求。
核心要点
- 自动填充功能消除了用户在接收验证码与输入验证码之间切换应用的过程,从而减少了用户流失。
- Android SMS Retriever:消息最多140字节,包含验证码和您的11字符应用哈希值;无需短信权限。
- Android SMS User Consent:无需哈希值;消息必须包含一个4–10位的字母数字验证码,且至少包含一个数字;用户点击即可允许。
- iOS和Safari:在输入框使用autocomplete="one-time-code";绑定域名的最后一行可启用Safari的提示功能。
- WebOTP:最后一行 @domain #code,不包含方案、端口或路径;支持Android端和桌面端的Chrome浏览器。
为什么OTP自动填充如此重要?
在“发送验证码”与“输入验证码”之间的每一个步骤都会导致用户流失:切换到短信应用、记忆六位数字、再切换回来。自动填充将这些步骤简化为一次点击。它还能减少输入错误,并且通过与域名绑定的验证码,降低了用户在仿冒网站上输入验证码的风险。它并不能解决送达问题:验证码仍需快速送达,因此请将自动填充功能与快速通道及自动回退机制结合使用。请参阅 OTP送达最佳实践。
Android SMS Retriever API的工作原理是什么?
SMS Retriever API让您的Android应用无需请求读取短信权限即可接收验证消息。Google的文档为该消息设定了三条规则:
- 长度不得超过140字节;
- 包含应用发送回您服务器的一次性密码;
- 包含一个用于识别您应用的11位哈希字符串。
哈希值是根据您应用的包名及其签名证书计算得出的:将包名附加到证书的十六进制形式后,取其SHA-256,进行base64编码并保留前11个字符。调试版本和发布版本通常使用不同的密钥签名,因此它们具有不同的哈希值。您的服务器在构建消息时会添加正确的哈希值。
什么是SMS User Consent API?
当您无法在消息中放入应用哈希值时(例如,因为模板与其他渠道共享),Android的SMS User Consent API会向用户显示一个提示,允许您的应用读取一条消息。根据Google,该消息必须包含一个4–10位的字母数字字符串,且至少包含一个数字;如果您指定了发送者,则必须来自该发送者。API在您启动后会监听约五分钟,然后超时。
iOS上的OTP自动填充是如何工作的?
iOS提供来自键盘的安全码自动填充功能。在原生应用中,请将文本字段的textContentType设置为oneTimeCode;在网页上,请在输入框中添加autocomplete="one-time-code"。当匹配的短信到达时,验证码会出现在键盘上方,用户只需点击即可。Safari尚未实现WebOTP JavaScript API,但Chrome的WebOTP文档指出,如果短信遵循下方的域名绑定格式,通过autocomplete注解,默认键盘会建议该验证码(适用于iOS 14和macOS Big Sur或更高版本)。
什么是WebOTP消息格式?
WebOTP API允许网页通过navigator.credentials.get({ otp: { transport: ['sms'] } })读取验证码。短信必须以人类可读的文本开头,并以如下形式的最后一行结尾:
Your BroadNet code is 482913. @www.example.com #482913- 最后一行以 @ 开头,后跟请求验证码的页面域名。
- 一个空格,然后是 # 和代码。
- 域名中不包含协议、端口或路径,且内部不能有空格。
- 人类可读部分也应包含代码,以便阅读消息的人员查看。
务必在输入中保留autocomplete="one-time-code",这样即使是不支持WebOTP的浏览器也能显示代码。
一个短信模板可以在所有平台上使用吗?
可以,只要它保持在Android字节限制内,且行顺序正确。以下是一个组合模板:
Your BroadNet code is 482913. Do not share it.FA+9qCX9VSu @www.example.com #482913| 平台 | 谁来读取代码 | 消息所需内容 |
|---|---|---|
| Android应用 | SMS Retriever API | 代码及您的11位字符应用哈希值;最多140字节 |
| Android应用(无哈希值) | SMS User Consent API | 包含至少一个数字的4–10位字母数字代码 |
| iOS应用 | 安全码自动填充(oneTimeCode) | 可识别的代码;建议使用绑定域名的行 |
| Safari (iOS, macOS) | autocomplete="one-time-code" | 最后一行 @domain #code |
| Chrome(Android, 桌面端) | WebOTP API | 最后一行 @domain #code |
显示的哈希值仅为占位符:请使用您自己应用的哈希值。请将模板保持在GSM-7字符集中,以确保其保持为一个分段;使用表情符号或带重音符号的字母会将整个消息切换为Unicode编码,这会使容量减半,并可能超出140字节的限制。请参阅短信编码与分段。
如何使用BroadNet发送这些消息?
在您的服务器上构建消息,并通过 OTP API 或 SMS API 发送;换行符是消息文本的一部分。当验证码未送达时,BroadNet的OTP产品会自动回退至短信、WhatsApp、语音和Flash Call;而 MyOTP.App 可以通过一个账户以短信、WhatsApp或Telegram的方式发送验证码。如需了解整个流程,请阅读 如何构建OTP流程 以及我们的 多渠道OTP验证指南。
常见问题
为什么我的Android应用无法读取OTP短信?
通常是因为消息中的应用哈希值与构建版本不匹配(调试密钥和发布密钥不同)、消息长度超过140字节,或者监听器在消息到达后才启动。
在Android上自动填充验证码需要短信权限吗?
不需要。SMS Retriever API和SMS User Consent API都可以在无需短信读取权限的情况下工作。
如何在iOS上启用OTP自动填充?
在原生应用中将textContentType设置为oneTimeCode,或者在网页输入框中添加autocomplete="one-time-code"。
什么是WebOTP短信格式?
首先是可读文本,最后一行是以@开头的域名,随后是一个空格、#和验证码,例如 @www.example.com #482913。
WebOTP可以在Safari中使用吗?
Safari不支持WebOTP JavaScript API,但通过使用autocomplete="one-time-code",其键盘会根据域名绑定格式的消息建议验证码。
我可以使用同一个模板同时适配Android、iOS和网页吗?
可以:文本中包含验证码,应用哈希值单独占一行,最后一行是域名绑定行,所有内容均在140字节以内。
平台规则参考自2026年9月28日的Google SMS Retriever和SMS User Consent文档(developers.google.com)以及Chrome WebOTP文档(developer.chrome.com)。请参阅我们的编辑标准。
