Google 次 Play 购买签名验证失败
Signature vertification failed in Google Play purchase
我在 PHP 中有一个后端,它与 Google Play 服务集成以验证从 APP 进行的购买。购买信息returns收据和签名,我需要验证购买是否正确
我收到:
{
...rest of the data,
receipt": {
"orderId":"...",
"packageName": ...,
"productId":" ...,
"purchaseTime": ...,
"purchaseState": 0,
"purchaseToken": ...,
"autoRenewing": true
},
"signature": ...
}
然后我使用位于 Google Play 管理中心的 public 密钥来验证签名。我通过添加 -----BEGIN PUBLIC KEY----- 和 -----END API KEY---- 将其手动格式化为 PEM。我还将这些行分成 64 个块,并且我还验证了 public 键对应于正确的项目。
最后我使用 phpseclib 库来执行验证,但它总是失败。
$receipt= $transaction['receipt'];
$rsa = new RSA();
$rsa->loadKey(Yii::$app->params['public_key']);
$verify = $rsa->verify(json_encode($receipt), $signature);
我对收据进行了编码,因为验证方法需要一个字符串,但我不确定这一步。我是在测试环境中这样做的,所以购买不是真实的。我怀疑 public 密钥在某种程度上不正确,但我是从开发工具 > 服务和 APIs > 许可和应用计费中获得的。有什么问题吗?
我会说:post 您要验证的签名、明文和 post 您用于验证的密钥。事实上,在我看来很可能(1)签名是 base64 编码的(即你需要 运行 通过 base64_decode
和(2)Google 正在使用PKCS1 填充而 phpseclib 默认为签名的 PSS 填充。您可以通过执行 $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
将签名填充更改为 PKCS1
我在 PHP 中有一个后端,它与 Google Play 服务集成以验证从 APP 进行的购买。购买信息returns收据和签名,我需要验证购买是否正确
我收到:
{
...rest of the data,
receipt": {
"orderId":"...",
"packageName": ...,
"productId":" ...,
"purchaseTime": ...,
"purchaseState": 0,
"purchaseToken": ...,
"autoRenewing": true
},
"signature": ...
}
然后我使用位于 Google Play 管理中心的 public 密钥来验证签名。我通过添加 -----BEGIN PUBLIC KEY----- 和 -----END API KEY---- 将其手动格式化为 PEM。我还将这些行分成 64 个块,并且我还验证了 public 键对应于正确的项目。
最后我使用 phpseclib 库来执行验证,但它总是失败。
$receipt= $transaction['receipt'];
$rsa = new RSA();
$rsa->loadKey(Yii::$app->params['public_key']);
$verify = $rsa->verify(json_encode($receipt), $signature);
我对收据进行了编码,因为验证方法需要一个字符串,但我不确定这一步。我是在测试环境中这样做的,所以购买不是真实的。我怀疑 public 密钥在某种程度上不正确,但我是从开发工具 > 服务和 APIs > 许可和应用计费中获得的。有什么问题吗?
我会说:post 您要验证的签名、明文和 post 您用于验证的密钥。事实上,在我看来很可能(1)签名是 base64 编码的(即你需要 运行 通过 base64_decode
和(2)Google 正在使用PKCS1 填充而 phpseclib 默认为签名的 PSS 填充。您可以通过执行 $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);