Apple内购签名验证失败:SHA256withECDSA算法验证令牌签名无效
解决Apple内购签名验证异常:SignatureVerificationException (SHA256withECDSA无效)
当使用Apple的app-store-server-library-java验证内购交易时,遇到SignatureVerificationException: The Token's Signature resulted invalid when verified using the Algorithm: SHA256withECDSA异常,可按以下步骤排查解决:
1. 确认根证书配置正确
- 优先使用库的默认证书加载逻辑:
SignedDataVerifier的构造方法若不传入rootCAs参数,会自动加载Apple官方的根证书链,避免手动导入时出现证书遗漏、损坏或不匹配的问题。 - 若必须手动导入,确保包含所有Apple官方根证书(Apple Root CA - G3、Apple Root CA - G2、Apple Intermediate Certificate等),且证书文件无损坏、读取路径正确。
2. 环境与Token必须匹配
- 沙箱环境生成的交易Token,必须对应
Environment.SANDBOX;生产环境Token对应Environment.PRODUCTION,二者不能混用。 - 可解码JWT Token查看payload中的
environment字段,确认和代码配置一致。
3. Bundle ID完全匹配
- 代码中配置的
bundleId必须与App Store Connect中注册的Bundle ID完全一致,包括大小写、特殊字符,任何差异都会导致验证失败。
4. 确保Token完整有效
- 检查
signedTransaction是完整的JWT字符串,无截断、篡改情况。可使用本地JWT库解析Token,查看payload中的bundleId、transactionId等字段是否符合预期。
5. 升级库到最新版本
- 旧版本的app-store-server-library-java可能存在证书兼容或签名逻辑的bug,确保使用官方最新版本。
修改后的示例代码(使用默认根证书)
fun verifyCertificate() { val bundleId = "my bundle id" val environment = Environment.SANDBOX // 依赖库自动加载官方根证书,无需手动传入 val signedDataVerifier = SignedDataVerifier(bundleId, null, environment, false) val signedTransaction = "eyJhbGci..." try { val transaction = signedDataVerifier.verifyAndDecodeTransaction(signedTransaction) println(transaction) } catch (e: VerificationException) { e.printStackTrace() } }
内容的提问来源于stack exchange,提问作者nayan dhabarde
相关产品推荐
相关产品推荐

