我按照链接中提到的这些步骤执行此操作.
IInAppBillingService.aidl文件复制到Android项目.
(1)如果您使用的是Eclipse:将IInAppBillingService.aidl文件导入/ src目录.
(2)如果您在非Eclipse环境中进行开发:创建以下目录/ src/com/android/vending/billing并将该IInAppBillingService.aidl文件复制到此目录中.IInAppBillingService.java在/gen您的项目目录./util将TrivialDrive示例目录中的帮助程序类添加到项目中.请记住相应地更改这些文件中的包名称声明,以便您的项目正确编译.但是当我完成它时,Eclipse给了我一个错误:
interface IInAppBillingService should be declared in a file called com\android\vending\billing\IInAppBillingService.aidl.
Run Code Online (Sandbox Code Playgroud)
该aidl文件位于正确的目录中,但未IInAppBillingService.java生成该 文件.
以前有人见过吗?
我是第一次实施In App Billing,我正在使用静态SKU ID测试我的第一次购买.
它第一次运作良好.我致电mHelper.launchPurchaseFlow(...)并完成了测试购买.我的活动收到onActivityResult回调,我确保处理它mHelper.handleActivityResult(...).一切都很棒.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Pass on the activity result to the helper for handling
log("onActivityResult");
if (!this.mHelper.handleActivityResult(requestCode, resultCode, data)) {
log("cleared the launch flow");
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想测试下一部分,所以我重新启动了应用并尝试购买相同的SKU(静态purchasedSKU).
mHelper.launchPurchaseFlow(rootActivity, "android.test.purchased", 10002,
new IabHelper.OnIabPurchaseFinishedListener() {
@Override …Run Code Online (Sandbox Code Playgroud) 我制作了一个Android应用,可以使用应用内结算方式购买商品.购买商品后,可以轻松地在Android电子市场和手机之间同步交易 - 即可在应用中使用.但是,我需要我的服务器知道购买.提供特定于应用程序的数据的决定应该在我的服务器上进行,而不是在客户端应用程序中进行.
例如
问:如何验证来自Android客户端(可能源自Google服务器)的交易数据不是假的?即黑客没有生成数据.
Google服务器 - > Android客户端 - >我的服务器 - > Android客户端
也许这更像是一个PHP问题而不是其他任何东西.究竟我的服务器脚本(PHP)应该怎么做才能验证检索到的数据是否真实?
在向用户提供可下载内容之前,我无法找到关于如何验证服务器上的应用内结算购买的直接答案.
我在app-billing版本3中使用.我使用基于TrivialDrive示例代码中的IabHelper类的代码购买托管产品.一切都很好,花花公子,购买成功完成,我得到一个完整的购买对象和以下原始JSON数据:
{
"orderId":"12999763169054705758.1364365967744519",
"packageName":"my package name",
"productId":"77",
"purchaseTime":1366217534000,
"purchaseState":0,
"purchaseToken":"utfwimslnrrwvglktizikdcd.AO-J1OwZ4l5oXz_3d2SAWAAUgFE3QErKoyIX8WuSEnBW26ntsyDmlLgoUd5lshqIY2p2LnlV4tpH4NITB4mJMX98sCtZizH7wGf6Izw3tfW_GflJDKFyb-g"
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我需要传递purchaseToken和我看到的称为服务器签名的东西.然后,服务器使用私钥来验证购买.它是否正确?如果是这样,我从哪里获得签名,是否真的没有关于购买的服务器端验证的体面文档?
在运行应用程序的Android>示例应用程序> Trivial Drive中,我在执行IAP时得到以下信息:
Error - Authentication is required. You need to sign into your Google Account
Run Code Online (Sandbox Code Playgroud)
我已使用测试帐户(即我在开发者控制台中指定的测试电子邮件地址)切换到手机上的单独帐户,并按照此处的所有步骤操作:
但没有快乐.
还有什么建议?
====更新
我已经在我的手机上抨击了所有Google帐户,现在只有一个帐户 - 即测试帐户.
我在这里尝试了一切:https://android.stackexchange.com/questions/20369/getting-authentication-is-required-when-trying-to-access-the-play-store
我已将我的 Kotlin 应用程序从 4.0 升级到 android-billing 5.0,因此,SkuDetails 现已弃用,因此我将使用迁移说明迁移到使用 ProductDetails 。
之前我使用SkuDetails.price向用户显示应用内购买的购买价格,但我在ProductDetails中找不到类似的方法。
在 Google Play Billing Library 5.0 中,是否有一种未弃用的方法来检索应用内购买或订阅的价格?
android in-app-billing kotlin android-billing play-billing-library
在Android中销售应用内商品的培训课程建议在发出购买请求时使用有效负载:
第五个参数包含一个"开发人员有效负载"字符串,您可以使用该字符串发送有关订单的补充信息(它可以是空字符串).通常,这用于传递唯一标识此购买请求的字符串标记.如果您指定字符串值,Google Play会将此字符串与购买回复一起返回.随后,当您对此次购买进行查询时,Google Play会将此字符串与购买详细信息一起返回.
安全建议:最好传入一个字符串,以帮助您的应用程序识别进行购买的用户,以便您以后可以验证这是该用户的合法购买.对于消耗品,您可以使用随机生成的字符串,但对于非消耗品,您应使用唯一标识用户的字符串.
该实施IAB购买页面也有类似的建议,与有效载荷值应在自己的安全服务器上检查的其他建议:
安全建议:发送购买请求时,创建一个唯一标识此购买请求的字符串标记,并将此标记包含在developerPayload中.您可以使用随机生成的字符串作为标记.当您收到Google Play的购买回复时,请务必检查返回的数据签名,orderId和developerPayload字符串.为了增加安全性,您应该在自己的安全服务器上执行检查.确保验证orderId是您之前未处理过的唯一值,并且developerPayload字符串与您先前使用购买请求发送的令牌相匹配.
查看Google用于演示API的Trivial Drive应用程序的源代码,我发现此警告:
* WARNING: Locally generating a random string when starting a purchase and
* verifying it here might seem like a good approach, but this will fail in the
* case where the user purchases an item on one device and then uses your app on
* a different device, because on the other device you will not have access to the
* random …Run Code Online (Sandbox Code Playgroud) 我已经实施了服务器端验证Google IAP购买令牌.我的移动应用程序将此令牌发送给我,因为它来自Google.
常规令牌看起来像
minodojglppganfbiedlabed.AO-J1OyNtpooSraUdtKlZ_9gYs0o20ZF_0ryTNACmvaaaG5EwPX0hPruUdGbE3XejoXYCYzJA2xjjAxrDLFhmu9WC4fvTDNL-RDXCWjlHKpzLOigxCr1QhScXR8uXtX8R94iV6MmMHqD
但有时我会得到一个像这样的短标记
korpimulxmslxissnschtkdb
当我通过Google Play Developer API验证此令牌时:https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token,对于短令牌,我收到404错误.
问题出在哪儿?这个短令牌可能代表真实交易吗?
我已经关注了Google的"In-App Billing v3"培训.我买了一件物品,但我遇到了问题.
https://developer.android.com/training/in-app-billing/index.html
我已取消并退还购买但该应用程序检测到购买是真的.我无法继续测试我的应用程序,因为我始终检测到购买该项目.
我在logCat中发现的唯一错误是下一个:
[3687] InAppBillingService.logResponseBundle:Bundle不包含响应代码
启动mHelper.queryInventoryAsync(mGotInventoryListener)后出现.
任何的想法?
对于在Android中实施应用内结算的用户来说,这是一个广受欢迎的问题,即如何处理多个帐户.如果用户配置了多个帐户,哪个帐户将用于应用内结算(因为没有选项让用户选择帐户)?挖了很多之后,下段在这里似乎可以解释它..
注意:要进行测试购买,许可测试帐户必须位于用户的Android设备上.如果设备有多个帐户,则会使用下载该应用的帐户进行购买.如果没有任何帐户下载了应用程序,则使用第一个帐户进行购买.用户可以通过展开购买对话框来确认正在进行购买的帐户.
我使用在应用程序计费中涉及的帐户创建开发人员有效负载,以便可以在以后某个时间或其他某个设备上正确还原.但是自Honeycomb以来,没有主账户这样的东西.用户可以删除任何帐户,可能是购买该应用程序的帐户,在这种情况下,帐户列表中的第一个帐户将用于计费.现在,如果我知道使用了哪个帐户,并且它是否"不是安装了应用程序的帐户",我至少可以告知用户以后的购买将不会恢复.
所以,我的问题是......
有没有办法找到用于下载应用程序的帐户?
Google Play似乎确实使用了这些信息.无论如何,我们可以与Google Play互动达到这个级别吗?
注意:PackageManager似乎没有解决这个问题.
android in-app-purchase google-account in-app-billing android-billing