2015-05-24 15 views
5

Ora ho davvero incasinato la comprensione del concetto e del motivo del bisogno, e persino non so come implementarlo tramite la codifica.Verifica acquisto Google Play dal lato server

Quindi, ho creato un gioco mobile usando unity, C#. Utilizzato php, mysql per i punteggi migliori e memorizza le informazioni sugli articoli acquistati in app degli utenti.

Ho rilasciato il mio gioco una settimana fa su Google Play, il mio portafoglio Google mostra che nessuno finora ha acquistato elementi in quel gioco.

Ma, quando ho controllato il mio server di gioco (database mysql), alcuni utenti hanno un numero enorme di articoli che dovrebbero essere acquistati.

Ciò significa che alcuni utenti hanno utilizzato lo strumento di hacking e bypassano il processo di verifica del gioco di google e hanno ingannato il mio gioco e fatto acquisti falsi.

Quindi non ho implementato developerPayload, né la convalida della ricevuta di acquisto di Google Play.

Così ora ho eliminato l'intero elemento dell'utente malintenzionato sul mio DB, (questo imposterà 0 sull'elemento del cliente dell'utente), e voglio implementare la verifica lato server della ricevuta di acquisto di Google Play.

Ho cercato molti post su google, ma non c'è una soluzione perfetta dal primo all'ultimo.

Ad ogni modo, l'ho implementato finora in questo modo.

In primo luogo, dopo che l'utente ha chiuso il processo di checkout di Google (se questo è vero o falso), la funzione OnPurchaseSucceded del mio unità client ha chiamato, lì ho implementato per iniziare a comunicare il mio script php sul mio server.

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. 
} 

e qui le domande,

1. [ho fatto proprio sopra il codice? per il campo "dati", ho usato purchase.OriginalJson, ma è giusto? in caso contrario, che cosa devo usare?]

e dopo riceve queste informazioni da php (verifyURL di codice di cui sopra),

$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; 
} 

altre domande,

2. [ho bisogno pagato I servizi SSL utilizzano il metodo openssl_ come sopra il codice php?] Sto usando il web hosting di hostgator.com, il mio piano ha già il servizio 'Shared SSL', quindi è sufficiente? o dovrei acquistare un altro piano di servizi SSL privato?]

3. Non c'è modo di verificarlo senza utilizzare il metodo openssl (per non utilizzare i servizi SSL)?

4. In generale sto facendo la giusta direzione per gestire l'utente hacker? Grazie mille.

risposta

1

ecco il mio codice per verificare l'ordine di Google. funziona bene con tutti i prodotti della mia azienda. Codice molto semplice

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; 
} 
Problemi correlati