2013-03-14 61 views
15

我已經在Android應用程序的應用程序結算中實現了該功能,儘管它與測試常數無關,但它在實際產品上仍然存在問題。簽名驗證失敗 - Android應用程序內購買

我上傳了Google Play上的應用程序草稿,創建併發布了產品,在設備上安裝了完全相同的應用程序(包含正確的base64EncodedPublicKey)並使用了正確的測試帳戶(設備上的主帳戶&其中一個是我的開發者帳戶設置的)

流程是我在Google Play活動中查看產品及其詳細信息,我按購買,介紹測試帳戶密碼,從活動中跳出,收到祝賀信和

簽名驗證失敗產品(響應:-1003:購買 簽名驗證失敗)

該項目實際上是購買的(它出現在谷歌Checkout,並且在第二次購買atempt它說:「項目已經擁有」)。此外,我只使用Google的TriviaDrive示例代碼。

任何建議是非常有幫助的。謝謝!

+4

看起來你base64EncodedPublicKey是錯誤的?三重檢查 – Rawkode 2013-03-14 12:58:35

+3

此消息表示Google已使用與您在應用中使用的密鑰不同的密鑰簽署購買信息。我會仔細檢查密鑰是否正確,是否正確分配並正確輸入簽名驗證。由於一切順利,這可能是問題的唯一可能原因。 – 2013-03-14 12:59:27

+5

我不認爲這些評論都可以解決這個問題。我得到了完全相同的錯誤,並且積極,我在我的代碼庫中包含適當的公鑰。另外,我不認爲這可能是一個關鍵問題,因爲setupBilling和購買工作的初始部分(需要一個好鑰匙來做這些事情)。我唯一能想到的就是測試環境。儘管沒有具體的線索。 – 2013-08-05 16:56:17

回答

0

1>簽名驗證失敗的產物(響應:-1003:購買簽名驗證失敗)

此錯誤背後的原因是,Base64Encoded不匹配。從發佈者帳戶獲取許可證密鑰,在某些文本編輯器中複製它,刪除任何空格並粘貼。

2>「已經擁有的商品」 當我們從應用內購買的谷歌獲得OK響應時,我們需要使用應用內商品 來通知其已被購買和交付。 但是,如果不知何故,如果你的崩潰或你忘了消費它谷歌將不會允許購買它,直到你消耗它。 在您的方案應用扔簽名驗證失敗的錯誤..thats對於第二個問題

希望這有助於

4

在應用程序內結算文檔有一個叫Initiate your connection to Google Play部分原因。

它告訴你,你需要一個base64編碼的公鑰來實例化你的IabHelper。您可以從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); 
} 

請考慮在文件中提出的安全建議:

安全建議:強烈建議由 谷歌提供,你不 硬編碼的確切公共許可證密鑰字符串值玩。相反,您可以在運行時從子字符串構造整個公共許可證密鑰 字符串,或者在將其傳遞給構造函數之前從加密的 存儲中檢索它。這種方法使得 更難以讓惡意的第三方修改APK文件中的公開 許可證密鑰字符串。

2

另一個原因這個錯誤可能出現在IAB的V3是,如果你在一個設備上購買的產品(比如,訂閱),以及購買信息不完全使其進入Play商店應用的緩存在另一臺設備上。

我有一個可怕的時期,在Kitkat手機上購買訂閱後,另一個電話(薑餅)得到這個-1003錯誤。我將其追溯到getpurchases()方法只返回帶有(正確)列表購買的INAPP_PURCHASE_ITEM_LIST的事實。 INAPP_PURCHASE_DATA_LIST和INAPP_DATA_SIGNATURE_LIST返回爲空。 (即使我可以在Play應用中看到訂閱)。

簽名爲空,所以當然得到了簽名驗證錯誤。經過大量的頭部劃傷/恐慌,爲什麼它沒有工作,突然間它沒有任何工作。我認爲Google Services/Play應用程序最終會刷新緩存並自行更新。

鑑於此,我認爲,解決方案可能是隻沉默的錯誤,直到全部的購買信息傳播到播放服務.... W/iabhelper它是這樣的:

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

這似乎是一個相當大的bug - 我認爲Play商店應該等到知道所有購買商品之後再將其傳遞給應用程序。我不知道這個問題是否表現在採購流程的其他領域,但是你們應該去做。

0

一定要在UTF8與關鍵

1

文件我有這個問題,我的訂閱編碼,因爲我還沒有設置「ITEMTYPE」

mHelper.launchPurchaseFlow(this, 
      SKU_INFINITE_GAS, IabHelper.ITEM_TYPE_SUBS, 
      RC_REQUEST, mPurchaseFinishedListener, payload); 
相關問題