我已经尝试了几天来解决这个问题,使用SDK附带的Dungeons演示代码.我试过谷歌寻求答案,但找不到答案.
android.test.purchased在控制台上创建的产品列表和已发布的订阅(我想要的应用程序的主要功能).但我仍然得到错误,Signature verification failed然后签名与数据不匹配.我怎么解决这个问题?
public static ArrayList<VerifiedPurchase> verifyPurchase(String signedData, String signature)
{
if (signedData == null) {
Log.e(TAG, "data is null");
return null;
}
if (Consts.DEBUG) {
Log.i(TAG, "signedData: " + signedData);
}
boolean verified = false;
if (!TextUtils.isEmpty(signature)) {
String base64EncodedPublicKey = "MIIBIjA....AQAB";
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey);
verified = Security.verify(key, signedData, signature);
if (!verified) {
Log.w(TAG, "signature does not match data.");
return null;
}
}
}
public static boolean verify(PublicKey publicKey, String …Run Code Online (Sandbox Code Playgroud) 我在我的Android应用程序中实现应用程序计费时遇到问题.我收到购买签名验证失败.在第一次我很难,它是base64键,但我检查了很多次,我仍然得到错误,然后我看了一下Security.java文件,我发现我编辑的这个方法获取一些信息关于什么是错的:
public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||
TextUtils.isEmpty(signature)) {
if(TextUtils.isEmpty(signedData)) Log.d(TAG, "SIGNED DATA EMPTY");
if(TextUtils.isEmpty(base64PublicKey)) Log.d(TAG, "KEY IS EMPTY");
if(TextUtils.isEmpty(signature)) Log.d(TAG, "SIGNATURE IS EMPTY");
Log.e(TAG, "Purchase verification failed: missing data.");
return false;
}
PublicKey key = Security.generatePublicKey(base64PublicKey);
return Security.verify(key, signedData, signature);
}
Run Code Online (Sandbox Code Playgroud)
我得到"签名是空的".即使我按照以下步骤操作: - 使用我的发布密钥设置apk - 将其作为草稿添加 - 在设备上安装"adb -d install app.apk"
我正在测试真实购买.谢谢.
编辑购买流程很好,我打电话时收到错误queryInventoryAsync
android billing in-app-purchase in-app-billing android-billing
我正在我的应用程序上的In App Store中工作,我使用了robotmedia的AndroidBillingLibrary,当我使用库购买android.test.purchased时,响应没问题,我需要的所有数据都在那里.
问题是,当我切换到Android In-App Billing v3时,这都是从响应中收到的,没有签名.
{"packageName":"com.my.sampleapp","orderId":"transactionId.android.test.purchased","productId":"android.test.purchased","developerPayload":"","purchaseTime":0,"purchaseState":0,"purchaseToken":"inapp:com.my.sampleapp:android.test.purchased"}
我完全按照这个示例https://developer.android.com/training/in-app-billing/preparing-iab-app.html#GetSample但没有签名.我甚至运行谷歌给出的示例应用程序,但没有运气.
我正确地将我的Base64编码的RSA公钥
mHelper = new IabHelper(this, myPublicKey);
这是我的购买代码 mHelper.launchPurchaseFlow(this, itempackage, 10001, mPurchaseFinishedListener);
OnIabPurchaseFinishedListener mPurchaseFinishedListener = new OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.i("Billing", "purchasing: " + result.getMessage());
if (result.isFailure()) {
Log.i("Billing", "Error purchasing: " + result);
return;
} else if (purchase.getSku().equals("android.test.purchased")) {
Log.i("Billing - signature", purchase.getSignature());
consumeItems();
} else {
Log.i("Billing", "Error purchasing: " + result);
}
}
};
Run Code Online (Sandbox Code Playgroud)
不知何故,我的mPurchaseFinishedListener在购买后没有收到任何东西,但protected …
随着时间的推移,更多的故障排除表明我有一个特定的订阅,处于卡住状态,这意味着我无法取消它,这就是以某种方式导致所有问题.无论是在浏览器上还是在手机或平板电脑上试图取消它都会出现同样的错误:
我尝试了三个帐户.没有这个旧订阅的两个新帐户对我的调试工作正常.我以前订阅此项目的主要帐户是问题发生的地方.所以如果我能以某种方式取消这个订阅,我会很好.
我总共有三个订阅项目.我可以在测试和常规帐户上轻松订阅和取消其他两个没有问题.但是,这个特别的一个,这是一年多了,我无法取消.这导致IabHelper查询中的所有错误.
我该如何取消?不幸的是,由于一些神秘的原因谷歌不允许删除订阅项目.
我的单笔购买工作正常,但没有订阅.在过去的很多天里,我遇到了这个问题,我无法获得我的应用程序的订阅信息,但它失败了:
if (result.isFailure()) {
Log.v(Constants.TAG, "Failed to query inventory: " + result);
return;
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了所有与应用程序结算相关的帖子,并尝试了在我的应用程序的多个版本上的多个设备,Alpha和生产版本上可以完成的所有内容,但无法摆脱此错误:
Failed to query inventory: IabResult: Error refreshing inventory (querying owned subscriptions). (response: -1003:Purchase signature verification failed)
Run Code Online (Sandbox Code Playgroud)
我理解空白签名的问题,但现在应用程序已在生产中发布,但在我的设备上安装时,我的日志中仍会出现相同的错误.所以我现在在Play商店中有一个生产应用程序,订阅不起作用.这是我希望获得签名价值的最后一个绝望的步骤.非常不幸的是,没有真正简单的方法来调试应用内代码.
在以下的verifyPurchases中,Security.java中的代码失败(这似乎是许多人失败的常见地方):
if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||
TextUtils.isEmpty(signature)) {
Log.e(TAG, "Purchase verification failed: missing data.");
return false;
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,订阅的在线帮助很少甚至没有.我尝试了人们提出的其他代码,但无济于事.没有专门针对订阅的教程或示例.我能找到的所有答案都只针对单次购买.
我的base64键很好.新的IabHelper初始化没问题.但是当它进入订阅查询时,它很可能会失败.这是日志:
Querying owned items, item type: subs
10-25 13:52:16.957 7850-7915/com.lifelog24.main D/IabHelper: Package name: com.lifelog24.main
10-25 13:52:16.957 7850-7915/com.lifelog24.main D/IabHelper: Calling getPurchases with continuation token: null
10-25 …Run Code Online (Sandbox Code Playgroud) 在开发Android应用程序时,我在Google Play控制台中添加了两个测试订阅,其中包含一些虚构的价格.现在,该应用程序非常高效,测试订阅价格会显示给Playstore内的用户:
我尝试在播放控制台中停用测试订阅,但此按钮处于非活动状态:
任何人都可以帮我摆脱不需要的订阅吗?
- 提前谢谢,德克
我已经按照以下精彩教程进行了访问:http://blog.blundell-apps.com/simple-inapp-billing-payment/
我已经尽了一切的教程说,看了所有的3倍一遍又一遍,但我仍不能接受的签名intent.getStringExtra(INAPP_SIGNATURE)中onReceive() : BillingReceiver.java
这使我的应用程序崩溃,因为应用程序无法比较签名以验证购买是否正确完成.
这就是我的BillingReceiver的样子:
public class BillingReceiver extends BroadcastReceiver {
private static final String TAG = "BillingService";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "Received action: " + action);
if (ACTION_PURCHASE_STATE_CHANGED.equals(action)) {
String signedData = intent.getStringExtra(INAPP_SIGNED_DATA);
String signature = intent.getStringExtra(INAPP_SIGNATURE);
Log.e(TAG, "<!-- SIGNATURE : "+ intent.getExtras().getString("inapp_signature"));
Log.i(TAG, "<!-- SIGNATURE : "+intent.getStringExtra(INAPP_SIGNATURE));
purchaseStateChanged(context, signedData, signature);
} else if (ACTION_NOTIFY.equals(action)) {
String notifyId = intent.getStringExtra(NOTIFICATION_ID);
notify(context, notifyId);
} …Run Code Online (Sandbox Code Playgroud)