2015-05-24 14 views
5

Tôi giờ đã thực sự sai lầm khi hiểu khái niệm và lý do cần thiết, và thậm chí không biết cách thực hiện bằng cách viết mã.Xác minh mua google play từ phía máy chủ

Vì vậy, tôi đã tạo trò chơi dành cho thiết bị di động bằng cách sử dụng tính thống nhất, C#. Được sử dụng php, mysql cho điểm cao và lưu trữ của người dùng trong thông tin mục mua ứng dụng.

Tôi đã phát hành trò chơi của mình một tuần trước tại google play, ví google của tôi cho thấy không ai cho đến bây giờ đã mua bất kỳ mục nào trong trò chơi đó.

Tuy nhiên, khi tôi kiểm tra máy chủ trò chơi của mình (cơ sở dữ liệu mysql), một số người dùng có số lượng lớn mặt hàng cần mua.

Điều này có nghĩa là một số người dùng đã sử dụng công cụ hack và bỏ qua quá trình kiểm tra chơi google và đánh lừa trò chơi của tôi và mua hàng giả.

Vì vậy, tôi đã không triển khai developerPayload cũng như không xác thực biên nhận mua hàng trên google play.

Vì vậy, bây giờ tôi đã xóa toàn bộ mục của người dùng độc hại tại DB của tôi, điều này sẽ đặt 0 thành mục của khách hàng của người dùng đó và muốn triển khai xác minh phía máy chủ của biên lai mua trên google play.

Tôi đã tìm kiếm nhiều bài đăng bằng cách googling, nhưng không có giải pháp hoàn hảo nào từ đầu đến cuối.

Dù sao, tôi đã thực hiện cho đến thời điểm này. Trước tiên, sau khi người dùng kết thúc quá trình thanh toán google (cho dù đây là thực hay giả), chức năng OnPurchaseSucceded của khách hàng thống nhất của tôi được gọi, tôi đã thực hiện để bắt đầu giao tiếp tập lệnh php trên máy chủ của mình.

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

và đây thắc mắc,

1. [Ý của tôi làm ngay trên mã? đối với trường 'dữ liệu', tôi đã sử dụng purchase.OriginalJson, nhưng điều này có đúng không? nếu không, những gì tôi nên sử dụng?]

và sau khi nhận được những thông tin từ php (verifyURL mã ở trên),

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

câu hỏi khác,

2. [Tôi có cần trả tiền Các dịch vụ SSL sử dụng phương pháp openssl_ như trên mã php?] Tôi đang sử dụng máy chủ lưu trữ web của hostgator.com, có kế hoạch của tôi đã có dịch vụ 'Shared SSL' rồi, điều này có đủ không? hoặc tôi có nên mua gói dịch vụ SSL riêng tư khác không?]

3. Không có cách nào để xác minh điều này mà không sử dụng phương pháp openssl (không sử dụng dịch vụ SSL)?

4. Nhìn chung, tôi đang làm đúng hướng để đối phó với người dùng hack? Cảm ơn nhiều.

Trả lời

1

đây là mã của tôi để xác minh đơn đặt hàng trên Google. nó hoạt động tốt với tất cả các sản phẩm của công ty tôi. Mã rất đơn giản.

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; 
} 
Các vấn đề liên quan