2017-01-31 62 views
1

我已經構建了一個向用戶提供購買物品的能力的Android應用程序,並且Google購買對話框已成功返回付款,但是由於活動結果應用程序失敗在Security.java驗證方法總是返回false「sig.verify(Based64.decode(signature))」。安卓應用內結算安全驗證方法總是返回假

任何幫助它爲什麼發生,我必須做什麼。 我已經發布了應用程序到Play商店,並且我沒有使用android.test。* sku我有我自己的skus

回答

2

您是否正確初始化它?

獲取公鑰:

public PublicKey getAPKKey(String keyFactoryAlgorithm) throws Exception{ 
    byte[] decodedKey = Base64.decode("...your google play public key...", Base64.DEFAULT); 
    KeyFactory keyFactory = KeyFactory.getInstance(keyFactoryAlgorithm); 
    return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey)); 
} 

你可以找到在谷歌Play開發者控制檯你的公鑰。

然後驗證簽名:

// get purchase data 
Bundle ownedItems = ... query purchases 
String purchaseData = ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST").get(0); // just index 0 for demonstration 
String signature = ownedItems.getStringArrayList("INAPP_DATA_SIGNATURE_LIST").get(0); // just index 0 for demonstration 

PublicKey pkey = getAPKKey("RSA"); 
Signature sig = Signature.getInstance("SHA1withRSA"); 
sig.initVerify(pkey); 
sig.update(purchaseData.getBytes()); 

if(sig.verify(Base64.decode(signature, Base64.DEFAULT))) { 
    // ok 
} else { 
    // not ok 
} 
+0

謝謝,但它無法解析Base64.DEFAULT。 –

+0

@AmjadOmari確保從android.util.Base64導入正確的Base64。它自API Version 8開始出現,並且應該在那裏。 –

+0

我已經爲Base64導入了正確的一個,但sig.verify仍然返回false,並且我檢查了我正在使用正確的谷歌播放公共密鑰「此應用程序的許可證密鑰」, –