簡體   English   中英

Android - 通過服務器端驗證保護應用內購買

[英]Android - protecting in app purchases with server side verification

我是 android 開發的新手,但創建了一個應用程序,我實現了應用程序內購買以從應用程序中刪除廣告。 我只是做了一個非常基本的實現,我基本上檢查用戶是否購買了“no_ads”項目,如果是真的,則不顯示任何廣告。 問題是我看到很多“購買”都登錄在 firebase 上,而在 play 控制台上什么也沒有,這當然意味着我的用戶正在使用這些黑客應用程序。 所以我的問題是,如何在服務器上保護/驗證這些購買,使這些黑客應用程序無用? 我已經有一個我的應用程序使用的服務器,所以為我實現任何服務器端代碼都沒有問題。 如果有人能給我指點教程,那就太好了。 謝謝

我對減少應用內購買欺詐的小貢獻

外部服務器上的簽名驗證,在您的 Android 代碼上:

verifySignatureOnServer()

  private boolean verifySignatureOnServer(String data, String signature) {
        String retFromServer = "";
        URL url;
        HttpsURLConnection urlConnection = null;
        try {
            String urlStr = "https://www.example.com/verify.php?data=" + URLEncoder.encode(data, "UTF-8") + "&signature=" + URLEncoder.encode(signature, "UTF-8");

            url = new URL(urlStr);
            urlConnection = (HttpsURLConnection) url.openConnection();
            InputStream in = urlConnection.getInputStream();
            InputStreamReader inRead = new InputStreamReader(in);
            retFromServer = convertStreamToString(inRead);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }

        return retFromServer.equals("good");
    }

convertStreamToString()

 private static String convertStreamToString(java.io.InputStreamReader is) {
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";
    }

虛擬主機根目錄下的verify.php

<?php
// get data param
$data = $_GET['data'];

// get signature param
$signature = $_GET['signature'];

// get key
$key_64 = ".... put here the base64 encoded pub key from google play console , all in one row !! ....";



$key =  "-----BEGIN PUBLIC KEY-----\n".
        chunk_split($key_64, 64,"\n").
       '-----END PUBLIC KEY-----';   
//using PHP to create an RSA key
$key = openssl_get_publickey($key);


// state whether signature is okay or not
$ok = openssl_verify($data, base64_decode($signature), $key, OPENSSL_ALGO_SHA1);
if ($ok == 1) {
    echo "good";
} elseif ($ok == 0) {
    echo "bad";
} else {
    die ("fault, error checking signature");
}

// free the key from memory
openssl_free_key($key);

?>

注意事項:

  • 您應該在您的 java 代碼中加密 URL,如果沒有,可以通過在解壓縮的應用程序 apk 中進行簡單的文本搜索來輕松找到該 URL

  • 也最好將 php 文件名、url 參數、好/壞響應更改為毫無意義的東西。

  • 如果不會拋出主線程上的網絡異常,則 verifySignatureOnServer() 應在單獨的線程中運行。 另一種方法是使用 Volley。

應用內計費庫更新

使用庫,需要驗證的數據由Purchase.getOriginalJson()返回,簽名由Purchase.getSignature()

希望它會有所幫助...

  1. 當用戶進行應用內購買時在數據庫中添加條目。
  2. 當用戶打開您的應用程序時,檢查購買是否有效。
  3. 如果有效,則繼續下一個活動,否則顯示錯誤消息。

暫無
暫無

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

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