Google Play购买中的签名验证失败

问题描述 投票:0回答:1

我有一个PHP后端,该后端与Google Play服务集成在一起,可以验证通过APP购买的商品。购买信息会返回收据和签名,我需要验证购买是否正确。

我收到:

{ 
   ...rest of the data,
   receipt": {
      "orderId":"...",
      "packageName": ...,
      "productId":" ...,
      "purchaseTime": ...,
      "purchaseState": 0,
      "purchaseToken": ...,
      "autoRenewing": true
   },
"signature": ...
}

而且我使用位于Google Play控制台中的公钥来验证签名。我通过添加----- BEGIN PUBLIC KEY -----和----- END API KEY ----手动将其格式化为PEM。我还将行分成64个大块,还验证了公钥是否与正确的项目相对应。

最后,我使用phpseclib库执行验证,但始终失败。

    $receipt= $transaction['receipt'];
    $rsa = new RSA();
    $rsa->loadKey(Yii::$app->params['public_key']);
    $verify = $rsa->verify(json_encode($receipt), $signature);

我对收据进行编码,因为verify方法需要一个字符串,但是我不确定此步骤。我是在测试环境中执行此操作的,因此购买不是真实的。我怀疑公钥在某种程度上是不正确的,但是我是从开发工具>服务和API>许可和应用程序计费中获得的。有什么问题吗?

google-play google-play-services rsa google-play-console phpseclib
1个回答
0
投票

我会说:张贴您要验证的签名,纯文本并张贴您用来进行验证的密钥。照原样,在我看来,(1)签名是通过base64编码的(即,您需要通过base64_decode运行它,并且(2)Google使用的是PKCS1填充,而phpseclib默认使用PSS填充来签名)您可以通过执行$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);

将签名填充更改为PKCS1。
© www.soinside.com 2019 - 2024. All rights reserved.