web-dev-qa-db-ja.com

署名の検証に失敗しました-Androidアプリ内購入

Androidアプリケーションのアプリ課金に実装しました。テスト定数では問題なく動作しますが、実際の製品では機能しません。

アプリケーションを下書きとしてGooglePlayにアップロードし、製品を作成して公開し、まったく同じアプリケーションをデバイスにインストールし(適切なbase64EncodedPublicKeyを含む)、適切なテストアカウント(デバイスのプライマリアカウントと設定したアカウント)を使用しました私の開発者アカウントで)

フローは、Google Playアクティビティに参加して、製品とその詳細を確認し、購入を押して、テストアカウントのパスワードを紹介し、アクティビティから抜け出し、お祝いのメッセージを受け取り、

製品の署名検証に失敗しました(応答:-1003:購入署名検証に失敗しました)

アイテムは実際に購入されます(Google Checkoutに表示され、2回目の購入を試みると「アイテムは既に所有されています」と表示されます)。また、GoogleのTriviaDriveサンプルコードのみを使用しました。

どんな提案も非常に役に立ちます。ありがとうございました!

15
gabi906

アプリ内請求のドキュメントには、 Google Playへの接続を開始する というセクションがあります。

IabHelperをインスタンス化するには、base64でエンコードされた公開鍵が必要であることがわかります。このコードは、GooglePlayデベロッパーコンソールから入手できます。コンソールにログインし、[アプリ]をクリックして、[サービスとAPI]タブに移動します。

IabHelper mHelper;

@Override
public void onCreate(Bundle savedInstanceState) {
   // ...
   String base64EncodedPublicKey;

   // compute your public key and store it in base64EncodedPublicKey
   mHelper = new IabHelper(this, base64EncodedPublicKey);
}

ドキュメントで提案されているセキュリティの推奨事項を検討してください。

セキュリティに関する推奨事項:GooglePlayが提供する正確なパブリックライセンスキーの文字列値をハードコーディングしないことを強くお勧めします。代わりに、実行時にサブストリングからパブリックライセンスキー文字列全体を構築するか、コンストラクターに渡す前に暗号化されたストアから取得することができます。このアプローチにより、悪意のあるサードパーティがAPKファイルの公開ライセンスキー文字列を変更することがより困難になります。

4
Sergio del Amo

このエラーがIABのv3で発生する可能性がある別の理由は、あるデバイスで製品(サブスクリプションなど)を購入し、購入情報が別のデバイスのPlayストアアプリのキャッシュに完全に反映されない場合です。

KitKat電話でサブスクリプションを購入した後、別の電話(Gingerbread)でこの-1003エラーが発生するという恐ろしい時期がありました。 getpurchases()メソッドが(正しい)リスト購入を含むINAPP_PURCHASE_ITEM_LISTのみを返していたという事実にまでさかのぼりました。 INAPP_PURCHASE_DATA_LISTおよびINAPP_DATA_SIGNATURE_LISTはnullとして返されました。 (これは、Playアプリでサブスクリプションを確認できたにもかかわらずです。)

署名がnullだったので、もちろん署名検証エラーが発生しました。なぜそれが機能しなかったのかについて頭を悩ませたりパニックに陥ったりした後、突然、私が何もしなくても機能しました。 Google Services/Playアプリが最終的にキャッシュをフラッシュし、それ自体を更新したと思います。

これを考えると、解決策は、完全な購入情報がPlay開発者サービスに伝播するまでそのエラーを黙らせることかもしれないと思います.... iabhelperを使用すると次のようになります。

if (result.getResponse() != IabHelper.IABHELPER_VERIFICATION_FAILED)
                    complain("Failed to query inventory: " + result);
Log.d(TAG, "Query inventory was NOT successful.");

これはかなり大きなバグのようです。Playストアは、購入についてすべてを知るまで待ってから、アプリに渡す必要があると思います。この問題が購入フローの他の領域に現れるかどうかはわかりませんが、問題はありません。

2
fattire

「itemType」を設定していないため、サブスクリプションでこの問題が発生しました

 mHelper.launchPurchaseFlow(this,
            SKU_INFINITE_GAS, IabHelper.ITEM_TYPE_SUBS,
            RC_REQUEST, mPurchaseFinishedListener, payload);
1
stefan

必ずUTF8でファイルをキーでエンコードしてください

0
Reign.85

1>製品の署名検証に失敗しました(応答:-1003:購入署名検証に失敗しました)

このエラーの背後にある理由は、Base64Encodedが一致しないためです。出版社のアカウントからライセンスキーを取得し、テキストエディタでコピーして、スペースを削除して貼り付けます。

2>「アイテムはすでに所有されています」アプリ内購入についてGoogleからOK応答を受け取ったら、アプリ内製品を消費して、購入および配信されたことを通知する必要があります。しかし、どういうわけかあなたがクラッシュしたり、それを消費するのを忘れた場合、グーグルはあなたがそれを消費するまでそれを再び購入することを許可しません。あなたのシナリオでは、アプリが署名検証に失敗したエラーをスローしました..それが2番目の問題の理由です

この助けを願っています

0
all-ok