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

Android应用上架Google Play后OTP自动读取失效,哈希密钥问题求助

解决Google Play上SMS自动读取功能失效及哈希密钥生成错误问题

你遇到的核心问题其实是Google Play应用签名机制替换了你的APK签名密钥,导致你之前配置的哈希密钥不匹配,同时生成哈希时的错误也和密钥文件不对应直接相关。下面一步步帮你解决:

一、理解问题根源

当你启用了Google Play App Signing(现在是默认开启状态),Google会用官方的发布证书重新签名你的APK,而非你本地的上传密钥或debug密钥。你之前在服务器更新的开发/发布环境哈希,其实和Google Play实际使用的签名密钥不匹配,这就是功能失效的核心原因。

而你碰到的public keys in reply and keystore dont match错误,通常是因为你使用的keystore文件和命令中的alias不对应,或是误用了本地的上传密钥而非Google Play的发布证书。

二、正确生成Google Play环境的11位哈希密钥

步骤1:下载Google Play发布证书

  1. 打开Google Play控制台,进入你的应用
  2. 点击左侧菜单发布 > 设置 > 应用签名
  3. 在「发布证书」区域,下载PEM格式的证书文件(通常命名为deployment_cert.pem)

步骤2:生成11位哈希(两种方法任选)

方法一:直接通过PEM生成(推荐,无需转换keystore)

在终端执行以下命令,替换your_package_name为你的应用包名,deployment_cert.pem为你下载的证书路径:

openssl x509 -in deployment_cert.pem -pubkey -noout | openssl rsa -pubin -outform DER | xxd -p | tr -d "[:space:]" | echo -n your_package_name `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

方法二:转换为keystore后生成

如果你习惯使用keytool工具,可以先把PEM转换成标准keystore格式:

# 1. 将PEM转换为PKCS12格式
openssl pkcs12 -export -in deployment_cert.pem -out play-release.p12 -name play-alias

# 2. (可选)将PKCS12转换为JKS格式
keytool -importkeystore -srckeystore play-release.p12 -srcstoretype pkcs12 -destkeystore play-release.jks -deststoretype JKS

# 3. 生成11位哈希
keytool -exportcert -alias play-alias -keystore play-release.jks | xxd -p | tr -d "[:space:]" | echo -n your_package_name `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

执行过程中会要求设置密码,自定义一个即可。

三、解决public keys in reply and keystore dont match错误

这个错误的常见修复方向:

  • 确认命令中的alias和keystore创建时设置的别名完全一致(比如方法二中的play-alias)
  • 确保使用的是Google Play发布证书转换的keystore,而非本地的上传密钥或debug密钥
  • 检查包名、keystore路径等参数是否输入正确

四、代码层面的优化与验证

1. 完善广播接收器生命周期

你的代码中动态注册了广播接收器,记得在onDestroy中注销,避免内存泄漏:

override fun onDestroy() {
    super.onDestroy()
    try {
        applicationContext.unregisterReceiver(smsBroadcast)
        LocalBroadcastManager.getInstance(this).unregisterReceiver(smsBroadcast)
    } catch (e: IllegalArgumentException) {
        Log.d("SMSReceiver", "接收器已注销,无需重复操作")
    }
}

2. 增加监听启动日志

在startSMSListener中添加日志,方便排查是否成功启动监听:

private fun startSMSListener() {
    val client = SmsRetriever.getClient(this)
    val task = client.startSmsRetriever()
    task.addOnSuccessListener {
        Log.d("SmsRetriever", "SMS监听已成功启动")
    }
    task.addOnFailureListener { e ->
        Log.e("SmsRetriever", "启动SMS监听失败", e)
    }
}

3. 验证短信格式

确保服务器发送的短信末尾包含生成的11位哈希,格式示例如下:

Your verification code is 123456. FA+9qCX9VSu

注意哈希前有一个空格,且短信内容总长度不能超过140字节。

五、测试验证

  1. 将生成的新哈希更新到服务器
  2. 上传APK到Google Play内部测试渠道(避免直接发布到生产环境)
  3. 从Google Play安装测试版本,验证SMS自动读取功能是否恢复正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:41:26