Проверка покупки Google Play со стороны сервера

Я теперь действительно испорчен, чтобы понять концепцию и причину необходимости, и даже не знаю, как реализовать кодирование.

Итак, я сделал мобильную игру, используя единство, 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; }