android 应用内结算安全验证方法总是 return false
android in-app billing Security verify method always return false
我构建了一个 android 应用程序,可以让用户购买商品,google 购买对话框 return 付款成功,但是 activity 结果应用程序失败 Security.java 验证方法总是 return false "sig.verify(Based64.decode(signature))".
任何帮助为什么会发生以及我必须做什么。
我已将应用程序发布到 Play 商店,但我不使用 android.test.* sku 我有自己的 skus
你初始化正确了吗?
获取public密钥:
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));
}
您可以在 Google Play 开发者控制台中找到您的 public 密钥。
然后验证签名:
// 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
}
我构建了一个 android 应用程序,可以让用户购买商品,google 购买对话框 return 付款成功,但是 activity 结果应用程序失败 Security.java 验证方法总是 return false "sig.verify(Based64.decode(signature))".
任何帮助为什么会发生以及我必须做什么。 我已将应用程序发布到 Play 商店,但我不使用 android.test.* sku 我有自己的 skus
你初始化正确了吗?
获取public密钥:
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));
}
您可以在 Google Play 开发者控制台中找到您的 public 密钥。
然后验证签名:
// 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
}