簡體   English   中英

從服務器端驗證谷歌播放購買

[英]Verification google play purchase from server side

我現在真的搞砸了理解需求的概念和原因,甚至不知道如何通過編碼來實現。

所以,我用團結制作手機游戲,c#。 使用php,mysql進行高分,並在應用程序購買項目信息中存儲用戶。

我一周前在google play上發布了我的游戲,我的谷歌錢包顯示沒有人,直到現在購買該游戲中的任何項目。

但是,當我檢查我的游戲服務器(mysql數據庫)時,一些用戶有大量應該購買的項目。

這意味着一些用戶使用黑客工具並繞過谷歌游戲檢查過程並欺騙我的游戲並進行假購買。

所以我沒有實現developerPayload,也沒有驗證google play購買收據。

所以現在我刪除了我的數據庫中的整個惡意用戶的項目(這將設置0到該用戶的客戶端項目),並且想要實現google play購買收據的服務器端驗證。

我通過谷歌搜索搜索了許多帖子,但從頭到尾沒有完美的解決方案。

無論如何,我到目前為止實現了這樣的。

首先,在用戶結束谷歌結賬過程(無論這是真的還是假的)之后,我的Unity客戶端的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. [我在代碼上方做得對嗎? 對於“數據”字段,我使用了buy.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服務來使用上面的php代碼之類的openssl_方法?]我正在使用hostgator.com的網絡托管,我的計划已經有了“共享SSL”服務,那么這就足夠了嗎? 或者我應該購買另一個私人SSL服務計划?]

3.如果不使用openssl(不使用SSL服務)方法,是否無法驗證這一點?

總體而言,我是否正確地指導黑客用戶? 非常感謝。

這是我的驗證谷歌訂單的代碼。 它適用於我公司的所有產品。 非常簡單的代碼。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM