我正在使用应用程序内购买制作Android应用程序。在Android Developer Center page我看到我必须用签名验证购买数据(json)。我尝试使用PHP tool from Google Code,但验证失败了。首先失败的是,这个图书馆想要的不是json(据我所知),而是一些带有字段的纯文本,加上:
和|
。它将此纯字符串拆分为packageName
并进行验证。我评论了这部分代码,因为下一部分更有趣:
$result = openssl_verify($responseData, base64_decode($signature),
$this->_publicKey, self::SIGNATURE_ALGORITHM);
//openssl_verify returns 1 for a valid signature
if (0 === $result) {
return false;
} else if (1 !== $result) {
require_once 'RuntimeException.php';
throw new AndroidMarket_Licensing_RuntimeException('Unknown error verifying the signature in openssl_verify');
}
$responseData
是我购买的json,self::SIGNATURE_ALGORITHM
是OPENSSL_ALGO_SHA1
,$this->_publicKey
是:
$key = self::KEY_PREFIX . chunk_split($publicKey, 64, "\n") . self::KEY_SUFFIX;
$key = openssl_get_publickey($key);
if (false === $key) {
require_once 'InvalidArgumentException.php';
throw new AndroidMarket_Licensing_InvalidArgumentException('Please pass a Base64-encoded public key from the Market portal');
}
$this->_publicKey = $key;
其中公钥是base64公钥,如下所述:
Note:To find the public key portion of this key pair, open your application's
details in the Developer Console, then click on Services & APIs, and look at the
field titled Your License Key for This Application.
但是这样的验证失败了。我读到API 3是新的(2012年12月),许多其他文章和教程并不对应。我需要更改什么来更正此验证?
此代码使用SHA1,但在Android开发者中心页面(第一个链接)上描述了公钥是带有X.509的RSA ......有什么想法吗?
UPD :在尝试让服务器始终说“购买没问题”并将所有购买添加到数据库时,发现此错误是我的失败。我把json带到base64中的服务器,因为在服务器上我base64_decode
它在两个不同的地方,所以我打破了它。此库在部分使用openssl验证json的代码中工作。据我所知,Previos版本只是验证包名称;从json读取productId
可能很容易重写。