Я работаю над IAB v3 в своем приложении для Android. После каждой успешной покупки я хочу, чтобы мое приложение отправило обратно данные знака и подпись на мой php-сервер для проверки открытым ключом, созданным консолью разработчика Google. Я нашел следующий код.
<?php // $data and $signature are assumed to contain the data and the signature // fetch public key from certificate and ready it $fp = fopen("/src/openssl-0.9.6/demos/sign/cert.pem", "r"); $cert = fread($fp, 8192); fclose($fp); $pubkeyid = openssl_get_publickey($cert); // state whether signature is okay or not $ok = openssl_verify($data, $signature, $pubkeyid); if ($ok == 1) { echo "good"; } elseif ($ok == 0) { echo "bad"; } else { echo "ugly, error checking signature"; } // free the key from memory openssl_free_key($pubkeyid); ?>
Теперь у меня проблема. Открытый ключ, предоставленный google, находится в кодировке String Base64. Я не знаю, как преобразовать этот строковый ключ в формат «.pem».
Если я поместил свой кодированный ключ Base64 в «$ pubkeyid» по вышеуказанному коду. Будет дано предупреждение.
Warning: openssl_verify() [function.openssl-verify]: supplied key param cannot be coerced into a public key in myxxx.php.
Как я могу преобразовать свой открытый ключ String Base64 Encoded в формат приема php?
У кого-нибудь есть вышеупомянутый опыт или решение? Пожалуйста помоги. Большое спасибо.
Чтобы преобразовать открытый ключ с открытым кодом base64, вы получаете от Google то, которое вы можете использовать на PHP, попробуйте следующее:
$base64EncodedPublicKeyFromGoogle = "..."; // This is the public key for your app you get from Google. $openSslFriendlyKey = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($base64EncodedPublicKeyFromGoogle, 64, "\n") . "-----END PUBLIC KEY-----";
Затем вы можете передать это в openssl_get_publickey()
.
$publicKeyId = openssl_get_publickey($openSslFriendlyKey);
Как вы можете видеть, формат от Google почти правильный. Его просто нужно разбить на 64-символьные строки и добавить / добавить в правый верхний / нижний колонтитул.
Вы также можете использовать команду OpenSSL для преобразования открытого ключа следующим образом:
openssl enc -base64 -d -in publickey.base64 -A | openssl rsa -inform DER -pubin > publickey.pem
Затем вы можете прочитать в сгенерированном файле publickey.pem
с PHP и передать его содержимое функции openssl_get_publickey()
.
Эта проблема была устранена этим API.
https://github.com/mgoldsborough/google-play-in-app-billing-verification
Полное решение вопроса о постере:
<?php // $data and $signature are assumed to contain the data and the signature // Paste your google public key below: $base64EncodedPublicKeyFromGoogle = "###############################" //Convert the key to the right format for open SSL $openSslFriendlyKey = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($base64EncodedPublicKeyFromGoogle, 64, "\n") . "-----END PUBLIC KEY-----"; $publicKeyId = openssl_get_publickey($openSslFriendlyKey); // free the key from memory openssl_free_key($publicKeyId); //Perform signature verification. Don't forget to decode the signature! $ok = openssl_verify($data, base64_decode($signature), $publicKeyId, OPENSSL_ALGO_SHA1); if ($ok == 1) { echo "good"; } elseif ($ok == 0) { echo "bad"; } else { echo openssl_error_string(); } ?>