15

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

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

商品や詳細が見られるGoogle Playアクティビティに乗り、購入を押し、テストアカウントのパスワードを入力し、アクティビティから抜け、お祝いのメッセージを受け取り、

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

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

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

4

5 に答える 5

4

In App Billing のドキュメントには、Initiate your connection to Google Playというセクションがあります。

IabHelper をインスタンス化するには、base64 でエンコードされた公開鍵が必要であることがわかります。このコードは、Google Play デベロッパー コンソールから取得できます。コンソールにログインし、[アプリ] をクリックして、[サービスと 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);
}

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

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

于 2014-01-23T18:17:14.207 に答える
2

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

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

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

これを考えると、解決策は、完全な購入情報が Play Services に反映されるまでそのエラーを黙らせることだと思います.... iabhelper を使用すると、次のようになりました。

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

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

于 2014-03-29T06:32:21.610 に答える
1

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

 mHelper.launchPurchaseFlow(this,
            SKU_INFINITE_GAS, IabHelper.ITEM_TYPE_SUBS,
            RC_REQUEST, mPurchaseFinishedListener, payload);
于 2015-10-14T12:34:59.173 に答える
0

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

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

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

この助けを願っています

于 2013-11-29T09:00:48.967 に答える