我正在尝试android在应用程序计费v3验证我的远程PHP服务器。
但是,我的代码似乎有问题。
我认为这个openssl_verify函数有问题。
结果总是失败!
我找不到用openssl_verify验证的第一个参数。实际上,我很困惑在第一个参数中放置什么格式是合理的:(
你能帮我解决这个问题吗? $result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key); // original // failed
下面是完整的测试代码。
<?php
$responseCode = 0;
$encoded='{
"orderId":"12999763169054705758.1111111111111",
"packageName":"com.xxx.yyy",
"productId":"test__100_c",
"purchaseTime":1368455064000,
"purchaseState":0,
"purchaseToken":"tcmggamllmgqiabymvcgtfsj.AO-J1OwoOzoFd-G-....."
}';
$data = json_decode($encoded,true);
$signature = "tKdvc42ujbYfLl+3sGdl7RAUPlNv.....";
$publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2kMri6mE5+.....";
$key = "-----BEGIN PUBLIC KEY-----n" . chunk_split($publicKey, 64, "n") . "-----END PUBLIC KEY-----";
$key = openssl_get_publickey($key);
if (false === $key) {
exit("error openssl_get_publickey");
}
var_dump($key);
$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key); // original // failed
//$result = openssl_verify($data, base64_decode($signature), $key); // failed
//$result = openssl_verify($encoded, base64_decode($signature), $key); // failed
//$result = openssl_verify(base64_decode($data["purchaseToken"]), base64_decode($signature), $key); // failed
//$result = openssl_verify(base64_decode($signature),$data["purchaseToken"], $key,OPENSSL_ALGO_SHA512 ); // failed
if ($result == 1) {
echo "good";
} elseif ($result == 0) {
echo "bad";
} else {
echo "error";
}
echo($result);
谢谢:)
您将错误的$data
值传递给openssl_verify()
。该值应该是您从Google Play获得的完整JSON字符串,而不是其中的购买令牌。重要的是JSON字符串不受影响,因为即使您要向其添加空格或换行符,签名也将不再工作。
$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key);
$result = openssl_verify($data, base64_decode($signature), $key);
并且您应该获得成功,假设您正在使用正确的公钥并且JSON购买字符串是有效的。我很确定你的JSON字符串不是来自谷歌的原始字符串,然而,因为那些来自谷歌不包含换行符。它将是一长行JSON文本。确保这是你传递给openssl_verify()
的内容