Я теперь действительно испорчен, чтобы понять концепцию и причину необходимости, и даже не знаю, как реализовать кодирование.
Итак, я сделал мобильную игру, используя единство, c #. Используется php, mysql для получения рекорда и сохраняет информацию о пользователе в приложении.
Я выпустил свою игру неделю назад в google play, мой кошелек Google пока не показывает никому, пока не приобрел какие-либо предметы в этой игре.
Но, когда я проверил свой игровой сервер (база данных mysql), некоторые пользователи имеют огромное количество предметов, которые необходимо приобрести.
Это означает, что некоторые пользователи использовали инструмент взлома и обходили процесс проверки игры в Google, обманывали мою игру и делали поддельную покупку.
Таким образом, я не реализовал DeveloperPayload и не подтвердил получение покупки в Google Play.
Итак, теперь я удалил весь элемент злонамеренного пользователя в моей БД (это установит 0 для этого клиента), и вы хотите выполнить проверку на стороне сервера для получения покупки в Google Play.
Я искал много сообщений по поисковой системе, но нет идеального решения от первого до конца.
Во всяком случае, я реализовал так далеко.
Во-первых, после того, как пользователь завершил процесс проверки Google (независимо от того, является ли это реальным или поддельным), я вызывал функцию OnPurchaseSucceded моего единственного клиента, там я реализовал, чтобы начать передавать мой php-скрипт на моем сервере.
private void OnPurchaseSucceded(Purchase purchase) { /* // Optional verification of the payload. Can be moved to a custom server if (!VerifyDeveloperPayload(purchase.DeveloperPayload)) { return; }*/ StartCoroutine(VerifyReceiptCo(purchase)); } IEnumerator VerifyReceiptCo(Purchase purchase) { WWWForm hsFm = new WWWForm(); hsFm.AddField("data", purchase.OriginalJson); hsFm.AddField("signature", purchase.Signature); WWW hs = new WWW(verifyURL, hsFm); yield return hs; Debug.Log("verify result is " + hs.text); // if result is true(validated), give item to user. }
и здесь вопросы,
1. [Я сделал правильный код выше? для поля данных, я использовал purchase.OriginalJson, но так ли это? если нет, что я должен использовать?]
и после получения этой информации от php (verifyURL выше кода),
$base64EncodedPublicKey = "MY game's public key from google play console"; $signedData = $_POST['data']; $signature = $_POST['signature']; $key = openssl_pkey_get_public($base64EncodedPublicKey); $verified = (openssl_verify($signedData, base64_decode($signature), $key, OPENSSL_ALGO_SHA1) > 0); $result = openssl_verify($signedData, base64_decode($signature), $key, OPENSSL_ALGO_SHA1); if ($verified) { echo 'verified : result is'.$result; } else { echo 'fail : result is'.$result; }
другие вопросы,
2. [Мне нужны платные услуги SSL для использования метода openssl_, например, выше php-кода?] Я использую хостинг hostgator.com, там у моего плана уже есть услуга «Общий SSL», тогда этого достаточно? или я должен купить другой частный тарифный план SSL?]
3. Нет ли способа проверить это без использования метода openssl (для использования служб SSL)?
4. В целом, правильно ли я занимаюсь взломом пользователя? Большое спасибо.
вот мой код для проверки порядка Google. он отлично работает со всеми продуктами моей компании. Очень простой код.
function verifyGoogleOrderLocal($packageName, $jsonData, $sig) { $public_keys = array( 'package1' => 'key1', 'package2' => 'key2', ); if(!$public_keys[$packageName]) { return array("success"=>0,"reason"=>'no public key defined'); } $key = get_openssl_key($public_keys[$packageName]); if(!$key) { return array("success"=>0,"reason"=>'invalid public key'); } $result = openssl_verify($jsonData, base64_decode($sig), $key, OPENSSL_ALGO_SHA1); $resp = array('success'=>$result); if($result==0) $resp['reason'] = 'invalid signature'; return $resp; } function get_openssl_key($publicKey) { $key = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($publicKey, 64, "\n") . '-----END PUBLIC KEY-----'; $key = openssl_get_publickey($key); return $key; }