7

リモートphpサーバーで検証するアプリ課金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);

ありがとう :)

4

1 に答える 1

8

$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 購入文字列が有効であると仮定すると、成功するはずです。ただし、Google の文字列には改行が含まれていないため、JSON 文字列は Google の元の文字列ではないと確信しています。JSON テキストの長い 1 行になります。それがあなたが渡しているものであることを確認してくださいopenssl_verify()

于 2013-06-18T21:46:02.937 に答える