Проверка подписи биллинга в приложении в приложении на php-сервере

Я работаю над 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(); } ?>