- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
编辑:因为有些人仍在检查这个线程,我想提一下,这是非常过时的,因为它是关于应用程序购买中的 v2,现在已弃用。请查看latest (目前是 v3)文档,非常简单
关于这个问题有很多话题,我想我理解这个问题,但是,目前我无法测试真实的购买,因为我目前没有有效的信用卡,谷歌接受,只有大师,这是不被接受的。这就是我寻求帮助的原因(不是购买验证,而是验证我的思维过程是否良好)。
首先,问题来自于新的 verifyPurchase
方法。新方法检查签名,应该没问题。但是,Google 没有为测试 ID 提供任何签名,例如 android.test.purchased
。这导致下面的方法总是失败,并且它总是在验证时返回false,即使假购买已经完成,并且我有一个确认对话框,购买确实成功了。方法:
public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
//if(BuildConfig.DEBUG) return true;
if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||
TextUtils.isEmpty(signature)) {
Log.e(TAG, "Purchase verification failed: missing data.");
return false;
}
PublicKey key = Security.generatePublicKey(base64PublicKey);
return Security.verify(key, signedData, signature);
}
问题来自 TextUtils.isEmpty()
检查,因为签名将为空,代码将返回 false。我的临时测试解决方法在代码中,已注释掉。如果我在测试方法的开头添加 if(BuildConfig.DEBUG) return true;
,一切正常,用户可以启动并运行高级功能,所以问题确实是关于签名。
另一个问题是,如果我购买了 android.test.purchased
,我无法查询用户的库存,所以我无法确定我的检查器方法是否检查用户是否已购买高级功能,有效。
我的两个问题:
如果我从 verifyPurchase
中删除 if(BuildConfig.DEBUG) return true;
行,并替换 android.test.purchased
id使用我提供的真实 SKU 的真实 ID,我可以确定在我的情况下一切都会正常工作吗?我再说一遍,添加调试功能后一切正常。如果您需要查看更多代码,请告诉我!
下面的方法检查用户是否购买了高级功能,如果他/她购买了,那么它会设置相应的首选项,否则,如果有任何问题,它会保持原样。这种方法是否正确?我在 Application
类中执行此操作,在每个应用程序启动时,以防止修补。
private void checkPremium()
{
//get the helper up and running
final IabHelper helper=new IabHelper(INSTANCE, getBase64Key());
helper.startSetup(new IabHelper.OnIabSetupFinishedListener()
{
@Override
public void onIabSetupFinished(IabResult result)
{
//if the helper is in a correct state, check the inventory
if(result.isSuccess())
{
helper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener()
{
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inv)
{
//if the inventory is reachable, check if we got the premium
if(result.isSuccess())
{
setPremium(inv.hasPurchase(ActWidgetSearch.SKU));
}
}
});
}
}
});
}
提前致谢!
最佳答案
几天前我遇到了和你一样的问题。对于那些从 Google Play 下载您的实时应用程序的人,如果测试 ID(“android.test.purchased”)如您所说的那样工作,他们将能够购买您的应用程序内购买。 Google Play 将其视为“真实购买”,并且通过与您的个人 SKU 相同的 channel 。见下文:
Test Purchases (In-app Billing Sandbox)
Once authorized with testing access, those users can side-load your app and test the full merchandising, purchase, and fulfillment flow for your products. Test purchases are real orders and Google Play processes them in the same way as other orders. When purchases are complete, Google Play prevents the orders from going to financial processing, ensuring that there are no actual charges to user accounts, and automatically canceling the completed orders after 14 days.
http://developer.android.com/google/play/billing/billing_testing.html#test-purchases
我现在刚刚测试了我自己的个人 SKU,我可以肯定地说它们正在发挥作用! (我在我的 Google Merchant 帐户中看到了订单)。所以出去走走,赚点钱:)
旁注,开发人员对开发人员...您能否向我展示有关如何在 Application 类中运行我的购买验证的任何示例或教程链接?我认为这是我绝对想从你那里窃取的想法。干杯!
关于android - Google Play 结算 - sku android.test.purchased 的签名验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22657519/
我得到了这个printHashKey函数,它运行良好。 fun printHashKey() { try { val info : PackageInfo = packageM
如何使用正确的签名 key 为我的 Android 应用包签名? 最佳答案 我尝试在此处和 this question 中使用多个答案, 但不知何故我收到了这个错误,因为我的 android/app/
我的 gradle 文件中有这个: android { signingConfigs { mySigningConfig { keyAlias 'the
请至少选择一个签名版本以在 Android Studio 2.3 中使用 现在在 Android Studio 中生成一个签名的 APK 时,它显示了两个选项(复选框),即 1. V1(Jar 签名)
我想表示一些标量值(例如整数或字符串)通过它的实际值或一些 NA 值,然后存储它们在集合中(例如列表)。目的是处理缺失值。 为此,我实现了一个签名 module type Scalar = sig
为什么这不完全有效? sum :: (Num a, Num b) => a -> b -> c sum a b = a + b 当然,错误消息与签名有关,但我仍然不明白原因。 Couldn't mat
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我从对物体的思考中得出了一个术语。当我们扩展一个类时,扩展类将具有与父类相同的签名,因此术语 IS-A 来自...示例 class Foo{ } class Foo2 extends Foo{ } c
我需要在有符号整数和它们作为字节序列的内部表示之间进行转换。在 C 中,我使用的函数如下: unsigned char hibyte(unsigned short i) {return i>>8;}
我正在尝试使用给定的 RSA 参数对一些数据进行签名。 我给出了模数、指数、D、DP、DQ、P、Q 和 InverseQ。什么库或方法最容易使用来计算此签名。在 C# 中,一旦您提供参数,它们就会有一
这些签名之间有什么区别? T * f(T & identifier); T & f(T & identifier); T f(T & identifier); void f(T * identifie
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where and why do I have to put the “template” and “typ
我有一个签名,我需要在签名旁边添加图片。但我不确定 css 的确切程度和内容。目前它显示在文字下方,我应该把图片放在哪里?在相同的 tr 或 td 中?
查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为: public class LinkedHashMap extends HashMap im
背景:我继承了一个基于 linux 的嵌入式系统,其中包含一个 SMTP 代理和一些我不得不忍受的古怪限制。它位于 SMTP 客户端和服务器之间。当 SMTP 客户端连接时,代理会打开与服务器的连接,
这是 C++17 形式的规则 ([basic.lval]/8),但它在其他标准中看起来很相似(在 C++98 中是“lvalue”而不是“glvalue”): 8 If a program attem
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我即将开展一个项目,希望使用电子签名板使用 C# 捕获客户的签名、在设备上显示文本等。 现在,在我开始做进一步的研究之前,我想向你们征求一些意见/建议,我应该使用哪些设备.. 我现在的要求非常笼统:我
呢喃自己在心中开始扩张地盘,仿佛制式地广播了三次。 漾起的涟绮,用谈不上精腻的手段。 拒绝天亮,却又贪恋着贪恋多情的日光。 川流不息的画面是他们,而我的落幕停在右脚,它渴望着下台,而我只剩自言
我是一名优秀的程序员,十分优秀!