アプリ内購入で Android アプリケーションを作成しています。Android Developer Center ページで、購入データ (json) を署名で検証する必要があることがわかります。これにGoogle Code の PHP ツールを使用しようとしましたが、検証に失敗しました。最初に、このライブラリが json ではなく (私が理解しているように)、 と で結合されたフィールドを持つプレーンテキストが必要であることに失敗し:
ます|
。このプレーンな文字列を分割して取得packageName
し、検証します。次の部分がより興味深いので、コードのこの部分にコメントしました。
$result = openssl_verify($responseData, base64_decode($signature),
$this->_publicKey, self::SIGNATURE_ALGORITHM);
//openssl_verify returns 1 for a valid signature
if (0 === $result) {
return false;
} else if (1 !== $result) {
require_once 'RuntimeException.php';
throw new AndroidMarket_Licensing_RuntimeException('Unknown error verifying the signature in openssl_verify');
}
$responseData
私の購入jsonはどこですか、self::SIGNATURE_ALGORITHM
はOPENSSL_ALGO_SHA1
、$this->_publicKey
です:
$key = self::KEY_PREFIX . chunk_split($publicKey, 64, "\n") . self::KEY_SUFFIX;
$key = openssl_get_publickey($key);
if (false === $key) {
require_once 'InvalidArgumentException.php';
throw new AndroidMarket_Licensing_InvalidArgumentException('Please pass a Base64-encoded public key from the Market portal');
}
$this->_publicKey = $key;
ここで、公開鍵は base64 公開鍵で、次のようになります。
Note:To find the public key portion of this key pair, open your application's
details in the Developer Console, then click on Services & APIs, and look at the
field titled Your License Key for This Application.
しかし、そのような検証は失敗します。API 3 が新しい (2012 年 12 月) ことを読みましたが、他の多くの記事やチュートリアルはそれに対応していません。この検証を修正するには、何を変更する必要がありますか?
このコードは SHA1 を使用していますが、Android デベロッパー センターのページ (最初のリンク) では、公開鍵は X.509 を使用した RSA であると説明されています...何かアイデアはありますか?
UPD:サーバーに常に「購入はOK」と言って、すべての購入をデータベースに追加しようとしているときに、このエラーが私の失敗であることがわかります。base64_decode
サーバー上では2つの異なる場所にあるため、jsonをbase64のサーバーに持っていくので、それを壊します。このライブラリは、openssl を使用して json を検証するコードの一部で機能します。私が理解しているように、以前のバージョンはパッケージ名を検証するだけです。productId
これは、jsonから読み取るように簡単に書き直すことができます。