15

Android のアプリ内課金でテスト アプリを実装しました。Security.java ファイルに公開鍵を入力しました。すべてが機能しますが、支払いを送信すると、アプリがクラッシュします。LogCat に「署名の検証に失敗しました」というエラーが表示されます。これは、次のコードに対応しています。

if (!sig.verify(Base64.decode(signature))) {
                Log.e(TAG, "Signature verification failed.");
                return false;
}

そのビットを false を返すのではなく true を返すように変更すると、すべてが正常に機能します。支払いを送信して安全にアプリに戻ることができます。

これを引き起こしている可能性のあるものについてのアイデアはありますか?

4

5 に答える 5

27

その署名検証エラーは、次の原因で発生する可能性があります。

1.-公開鍵が間違っている。たぶん、あなたはいくつかの文字をコピーするのを忘れました. それは起こります:)

2.- .apk は署名されている必要があります。署名文字列が空になると、debug.keystore は使用できません。

また、アプリ内課金のテストについては、次のことを覚えておいてください。

  • Android マーケットの公開鍵を Security.java に追加します ( String base64EncodedPublicKey = "your public key here")

  • リリース モードでビルドして署名します (Eclipse を使用している場合は、エクスポート ウィザードを使用できます)。

  • リリース版を Android マーケットにアップロードし、公開せずに製品リストを作成します。

  • デバイスにアプリケーションをインストールし ( adb -d install myapp.apk )、デバイスでテスト アカウントをプライマリにします。

于 2012-02-08T12:34:13.360 に答える
21

私の場合、よく隠された問題がありました。

最初にアプリ内課金を設定したとき、静的応答を試して android.test.purchased アイテムを購入しました。生産品に切り替えて在庫照会をしようとしたら、その偽物が原因でした。

したがって、この場合の解決策は、私の所有するアイテムから偽物を削除することでした。

IABHelper.java ファイルに次のスニペットを追加するだけです。

                Purchase p = new Purchase(itemType, purchaseData, signature);
                try {
                    consume(p);
                } catch (IabException e) {
                    e.printStackTrace();
                }

この署名を持つメソッドのelseステートメントで:

int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException

独自のアイテムをクリーンアップしたら、元のヘルパー Java ファイルに戻します。もちろん、これは開発段階のみです。

于 2013-11-30T12:12:30.507 に答える
2

私の場合、同じプレフィックスとサフィックスを持つ間違った公開鍵を貼り付けました。それが正しいことを100%確認してください。

于 2015-08-18T11:08:44.110 に答える