【问题标题】:android in app billing v3 with phpandroid in app billing v3 with php
【发布时间】:2013-05-14 04:16:15
【问题描述】:

我正在尝试在我的远程 php 服务器上验证 android in app billing v3。

但是,我的代码似乎有问题。

我认为这个 openssl_verify 函数有问题。

结果总是失败!

我找不到使用 openssl_verify 验证的第一个参数。实际上,我很困惑在第一个参数处放置的合理格式是什么:(

你能帮我解决吗?

    $result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key); // original // failed

低于完整的测试代码。

    <?php
    $responseCode = 0;
    $encoded='{
            "orderId":"12999763169054705758.1111111111111",
                    "packageName":"com.xxx.yyy",
                    "productId":"test__100_c",
                    "purchaseTime":1368455064000,
                    "purchaseState":0,
                    "purchaseToken":"tcmggamllmgqiabymvcgtfsj.AO-J1OwoOzoFd-G-....."
}';
$data = json_decode($encoded,true);

$signature = "tKdvc42ujbYfLl+3sGdl7RAUPlNv.....";

$publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2kMri6mE5+.....";

$key = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($publicKey, 64, "\n") . "-----END PUBLIC KEY-----";
$key = openssl_get_publickey($key);
if (false === $key) {
        exit("error openssl_get_publickey");
}
var_dump($key);

$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key); // original // failed
//$result = openssl_verify($data, base64_decode($signature), $key); // failed
//$result = openssl_verify($encoded, base64_decode($signature), $key); // failed
//$result = openssl_verify(base64_decode($data["purchaseToken"]), base64_decode($signature), $key); // failed
//$result = openssl_verify(base64_decode($signature),$data["purchaseToken"],  $key,OPENSSL_ALGO_SHA512 ); // failed
if ($result == 1) {
        echo "good";
} elseif ($result == 0) {
        echo "bad";
} else {
        echo "error";
}
echo($result);

谢谢:)

【问题讨论】:

    标签: php android in-app


    【解决方案1】:

    您将错误的$data 值传递给openssl_verify()。此值应该是您从 Google Play 获得的完整 JSON 字符串,而不是其中的购买令牌。重要的是 JSON 字符串不受影响,因为即使您要向其添加空格或换行符,签名也将不再起作用。

    您需要在上面的代码中更改这一行:

    $result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key);

    $result = openssl_verify($data, base64_decode($signature), $key);

    假设您使用正确的公钥并且 JSON 购买字符串有效,您应该会获得成功。但是,我很确定您的 JSON 字符串不是来自 Google 的原始字符串,因为来自 Google 的字符串不包含换行符。这将是一长行 JSON 文本。确保这是您传递给 openssl_verify() 的内容。

    【讨论】:

    • +1 用于两件事,参数和错误的 json 字符串。我纠正了两者,并修复了。谢谢
    • 这有点令人困惑,因为在您的回答中,$data 被解码为 json 为数组。使用来自 Google 的 ORIGINAL JSON 很重要(我知道它在最后的答案中,但我在第一次阅读时错过了它:-))
    • 你有足够的代表来改进答案吗?如果是这样,请务必这样做。否则,我会尝试更新它以更好地澄清它。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2012-12-11
    • 2012-12-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多