2

我看过很多关于这个问题的帖子并测试了许多可能的解决方案,但验证总是错误的。

所以,我通过 POST 将这两个参数传递给 PHP 服务器:

String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");<br>
String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");

这是我使用的方法:

$result = openssl_verify($responseData, base64_decode($signature),
              key, OPENSSL_ALGO_SHA1);

我使用该方法json_decode来验证 purchaseData 是否正确。我也base64_decode用于 dataSignature。

这就是我使用 Google Publisher 帐户中的公钥形成密钥的方式:

const KEY_PREFIX = "-----BEGIN PUBLIC KEY-----\n";<br>
const KEY_SUFFIX = '-----END PUBLIC KEY-----';

$key = self::KEY_PREFIX . chunk_split($publicKey, 64, "\n") . self::KEY_SUFFIX;

测试是通过在 Google Play 中上传游戏的帐户测试来执行的,因此应用内购买是真实的,但不收取任何费用。

我在这里缺少什么?

4

1 回答 1

0

您已经对密钥进行了格式化,但缺少一个需要从 PEM 中提取公钥的步骤。

以下是步骤:

$key = self::KEY_PREFIX . chunk_split($publicKey, 64, "\n") . self::KEY_SUFFIX;
$key = openssl_get_publickey($key);
$result = openssl_verify($responseData, base64_decode($signature), $key, OPENSSL_ALGO_SHA1);
于 2014-02-26T18:31:50.153 回答