使用openssl_verify在PHP服务器中对应用内计费v3进行签名验证

时间:2013-10-08 14:06:11

标签: php android openssl in-app-billing

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

所以,我通过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发布商帐户的公钥形成我的密钥的方式:

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上传游戏的帐户测试进行的,因此应用内购买是真实的,但不收费。

我在这里缺少什么?

1 个答案:

答案 0 :(得分: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);