You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非英文语言下SMS Retriever API自动填充短信功能失效求助

解决SMS Retriever API非英文环境OTP自动填充问题

我完全理解你的困扰——Google Play对高风险权限的限制确实让我们不得不转向更合规的SMS Retriever API,但本地化环境下的兼容性问题确实头疼。下面是针对非英文环境OTP自动填充失效的具体排查和解决方案:

核心排查点:短信格式是关键(与语言无关)

SMS Retriever API识别OTP的核心逻辑不依赖语言,而是要求短信必须满足两个硬性规则,不管用什么语言发送都要严格遵守:

  • 短信末尾必须包含你的应用的11位哈希值(由应用包名和签名生成,不会随语言变化)
  • OTP需要是一串清晰的数字/字母组合,且在短信中有明确的标识(比如对应本地化的“验证码”“Código de verificación”这类关键词)

举个中文环境的正确短信示例:

您的登录验证码是:654321

123abc456def

(末尾的123abc456def就是你的应用专属哈希)

分步解决方案

1. 先确认应用哈希的正确性

很多时候非英文环境失效是因为哈希错误,重新生成并验证:

  • 使用终端命令生成哈希(替换自己的密钥别名、密钥库路径和包名):
    keytool -exportcert -alias YOUR_KEY_ALIAS -keystore YOUR_KEYSTORE_PATH | xxd -p | tr -d "[:space:]" | echo -n YOUR_PACKAGE_NAME `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
    
  • 注意区分debug和release签名生成的哈希(两者不同,测试和生产环境要对应)

2. 本地化短信模板,统一OTP呈现逻辑

针对不同语言地区调整短信内容时,要保证:

  • OTP位置尽量靠前,用当地用户熟悉的关键词标注(比如中文用“验证码”,日语用「認証コード」)
  • 哈希必须单独放在短信最后一行,前面不要有任何多余字符或符号

3. 用adb模拟测试本地化短信

通过adb发送对应语言的测试短信,验证API是否能正常捕获:

adb shell am broadcast -a com.google.android.gms.auth.api.phone.SMS_RETRIEVED --es sms "Tu código de verificación es: 123456\n\nYOUR_APP_HASH"

替换成目标语言的短信内容和你的应用哈希,然后观察广播接收器是否能正确提取OTP。

4. 检查系统层面的兼容性

部分地区设备可能存在系统级限制,需要确认:

  • 应用没有被系统短信拦截器屏蔽
  • 设备上的Google Play Services是最新版本(SMS Retriever依赖GMS,旧版本可能存在本地化兼容bug)

5. 优化OTP提取逻辑,脱离语言依赖

如果短信包含非英文字符,不要依赖英文关键词提取OTP,改用正则匹配数字串。比如匹配6位数字的示例:

Pattern pattern = Pattern.compile("\\d{6}");
Matcher matcher = pattern.matcher(smsBody);
if (matcher.find()) {
    String otp = matcher.group();
    // 将OTP填充到输入框
}

内容的提问来源于stack exchange,提问作者Sai Kiran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:03:56