gpt4 book ai didi

Android - 通过服务器端验证保护应用内购买

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:53:03 25 4
gpt4 key购买 nike

我是 Android 开发的新手,但创建了一个应用程序,并且我实现了应用程序内购买以从应用程序中删除广告。我只是做了一个非常基本的实现,我主要检查用户是否购买了“no_ads”项目,如果是,则不会显示任何广告。问题是我看到很多“购买”记录在 firebase 上,而游戏控制台上什么也没有,这当然意味着我的用户正在使用那些黑客应用程序。所以我的问题是,如何在服务器上保护/验证这些购买,以便这些黑客应用程序无用?我已经有我的应用程序使用的服务器,因此为我实现任何服务器端代码都没有问题。如果有人能指出我的教程,那就太好了。谢谢

最佳答案

我为减少应用内购买欺诈做出的小贡献

在外部服务器上,在您的 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()

希望对你有帮助...

关于Android - 通过服务器端验证保护应用内购买,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com