我看过许多有关此问题的帖子并测试了许多可能的解决方案,但验证总是错误的。
所以,我通过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上传游戏的帐户测试进行的,因此应用内购买是真实的,但不收费。
我在这里缺少什么?
答案 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);