关于Android内置付费在大陆和港台不靠谱的事就不详细说了。。也许这个能解决问题。。。。用Adobe绕一下不知道行不行。。未测试。。。

原地址:http://www.adobe.com/cn/devnet/air/articles/android-billing-ane.html

Adobe 开发者中心 / Adobe AIR 开发人员中心 /

使用针对 Android 的应用内付费 Adobe AIR 原生扩展

作者Alex Liebert

  • Milkman Games

Content

  • 使用 Android Market 发布帐户创建应用程序
  • 纳入库
  • API 入门
  • 购买
  • 了解异步事件
  • 还原托管事务
  • 通过虚构购买项目测试 API
  • 通过真实购买项目测试 API
  • 更新应用程序描述符文件
  • 应用程序构建与故障排除
  • 下一步阅读方向

目前尚无评级。欢迎成为第一个对本文进行评级的人。 您发现本文有用 是否

创建日期

29 May 2012

  • 评论 (0)

页面工具

在 Facebook 上共享 在 Twitter 上共享 在 LinkedIn 上共享 书签 打印

Tags

要求

必备知识

使用 Flash Builder 或 Flash Professional 和 Adobe AIR 构建 Android 应用程序的经验,将有助于您充分理解本文的内容。


其他必要产品

Milkman Games In-App Billing Extension for Android

用户级别

中级

必需产品

  • Flash Builder (下载试用版)
  • Flash Professional (下载试用版)

使用来自 Milkman Games 的 In-App Billing Extension for Android,您可以使用 ActionScript 3 快速将应用内付费功能集成到移动 AIR 应用程序中。

In-App Billing Extension for Android 是一种纯粹的原生 Java 解决方案,支持您:

  • 通过应用内付费功能免费为自身提供应用程序,从而赚取利
  • 仅通过少数几行代码即可完成购买
  • 利用一个完整的示例应用程序、ActionScript 3 文档和一个入门指南,快速开始开发
  • 调用测试方法来验证购买的应用程序,然后再开通应用程序

使用 Android Market 发布帐户创建应用程序

在应用程序中使用 In-App Billing 前,您需要在 Android Market 网站上适当地进行相关设置。

  1. 进入 Android Market 发布 主页,使用开发人员帐户登录。
  2. 如果要将 In-App Billing 添加到现有的应用程序,请从列表中选择应用程序。 单击 APK Files 选项卡,上载一个新的 APK 文件。 请不要发布,但单击 Save 保存草稿。
  3. 如果要将 In-App Billing 添加至新的应用程序,请单击 Upload Application。 上载新应用程序的首个 APK 草稿文件。 输入必填信息并单击 Save,但不要单击 Publish。 如果只是构建测试应用程序,则 In-App Billing Extension for Android 程序包包含一个 /tutorial 文件夹,其中包含一些股票截图和图标,方便您借此完成这个流程。
  4. 接下来,您需要添加一些可以通过 In-App Billing 购买的产品。 在主屏幕上,首先单击该应用程序的 In-App Products 链接,转到希望添加的产品(参见图 1)。
Unity Android 内置付费 相关。。。_第1张图片 图 1. 单击 In-App Products。
  1. 若要添加产品,请单击 Add In-App Product。
Unity Android 内置付费 相关。。。_第2张图片 图 2. 输入应用内付费信息。
  1. 对于 Purchase Type,可以在 Managed Per User Account 和 Unmanaged 之间进行选择。 managed 项目是指用户购买一次(且只需购买一次)即可永久拥有的项目,比如游戏新关卡程序包。 unmanaged 项目是指可以反复购买的项目,比如魔咒。
  2. 对于 In-App Product ID,键入唯一字符串标识符来表示您的项目。请记下此 ID,因为稍后将需要在游戏代码中引用它。 填写剩余的必填信息,提供适当的标题、描述和价格(参见图 2)。
  3. 单击 Publish。 这样即可发布产品,以便接受测试。 您目前还不需要发布应用程序草案(并且应当避免在测试过程中这样做)。 完成操作后,从顶部的标签栏返回至 Android 开发人员主页。
  4. 接下来,单击主页中的 Edit Profile,检索 In-App Billing 公钥(参加图 3)。 此外,请记下 Edit Profile 上方列出的电子邮件地址。 这就是与您的开发人员帐户相关联的 Google 帐户。 在这篇文章中,我将会引用此电子邮件地址作为您的开发人员注册电子邮件。
Unity Android 内置付费 相关。。。_第3张图片 图 3. 单击 Edit Profile。
  1. 将 Licensing and In-App Billing 部分的公钥(参见图 4)复制到剪贴板。 打开文本编辑器,粘贴剪贴板中的密钥,然后将其保存至文本文件中。 稍后,您将需要用它来填充应用程序。
Unity Android 内置付费 相关。。。_第4张图片 图 4. 复制公钥并指定测试帐户。
  1. 在 Test Accounts 区域,键入您掌握的 Gmail 地址,但不要使用开发人员注册电子邮件帐户。 如果除开发人员注册电子邮件外您没有任何其他 Gmail 帐户,则应登录 Gmail.com 创建一个新的电子邮件帐户以便使用。 在这篇文章中,我将这个新地址称作测试帐户电子邮件。.
  2. .单击 Save。

纳入库

接下来,将 com.milkmangames.nativeextensions.AndroidIAB.ane 库添加到您的项目。(如果您未使用 Flash Builder 4.6 及更高版本或 Flash Professional CS6 及更高版本,您将需要添加 AndroidIABAPI.swc 库。)

在 Flash Professional CS6 中:

  1. 创建一个类型为 AIR for Android 的新项目。
  2. 选择 File > Publish Settings。.
  3. 单击 Script for ActionScript Settings 旁边的扳手图标。
  4. 选择 Library Path 选项卡。
  5. 单击 Browse For Native Extension (ANE) File 并选择 com.milkmangames.nativeextensions.AndroidIAB.ane 文件。

在 Flash Builder 4.6 中:

  1. 转到 Project Properties(在 Package Explorer 中右键单击您的项目并选择 Properties)。
  2. 选择 ActionScript Build Path 并单击 Native Extensions 选项卡。
  3. 单击 Add ANE 并导航到 com.milkmangames.nativeextensions.AndroidIAB.ane 文件。

在 FlashDevelop 中:

  1. 将 AndroidIABAPI.swc 文件复制到您的项目文件夹。
  2. 在资源管理器面板中,右键单击 SWC 并选择 Add To Library。
  3. 在资源管理器面板中,再次右键单击 SWC 文件,选择 Options,然后选择 External Library。

API 入门

只需几次简单的调用,您就可以开始使用 In-App Billing 扩展。 请参阅 example/AndroidIAB.as,了解展示 ActionScript API 使用方法的完整示例。

请按照以下步骤开始操作:

  1. 导入 API 类:
com.milkmangames.nativeextensions.android.*; com.milkmangames.nativeextensions.android.events.*;
  1. 通过调用 AndroidIAB.create() 初始化 API。 您可以先检查 AndroidIAB.isSupported() 方法,以确保当前使用的平台是 Android,而非其他不受支持的平台(比如 iOS 或 Windows):
if (AndroidIAB.isSupported()) { AndroidIAB.create(); }
  1. create() 创建完毕后,访问 AndroidIAB.androidIAB 即可在不知不觉中将 AndroidIAB API 实例转换为可用状态。为所有可能的 API 响应添加事件侦听器:
// billing service ready listeners AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.SERVICE_READY,onReady); AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.SERVICE_NOT_SUPPORTED,onUnsupported); // purchase listeners AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.PURCHASE_SUCCEEDED,onPurchaseSuccess); AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.PURCHASE_REFUNDED,onPurchaseRefunded); AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.PURCHASE_CANCELLED,onPurchaseCancelled); AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.PURCHASE_USER_CANCELLED,onUserCancelled); AndroidIAB.androidIAB.addEventListener(AndroidBillingErrorEvent.PURCHASE_FAILED,onPurchaseFailed); // transaction restore listeners AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.TRANSACTIONS_RESTORED,onsRestored); AndroidIAB.androidIAB.addEventListener(AndroidBillingErrorEvent.TRANSACTION_RESTORE_FAILED,onRestoreF ailed);
  1. AndroidIAB.androidIAB.startBillingService("yourPublisherPublicKeyHere") 方法,以便开始与 Android In-App Billing 服务器进行交互。 使用 Android Market 发布帐户创建应用程序部分提供的获取发布服务器公钥的相关说明。如果当前设备不支持 In-App Billing(因为它不提供 Android Market),您将会收到 AndroidBillingEvent.SERVICE_NOT_SUPPORTED 事件。 否则,当服务准备就绪后,您将会收到 AndroidBillingEvent.SERVICE_READY 事件;一旦出现这种情况,您可以开始调用其他 API 方法进行购买。
AndroidIAB.androidIAB.startBillingService("YOUR_PUBLIC_KEY_HERE"); private function onReady(e:AndroidBillingEvent):void { trace("service now ready- you can call purchase and restore methods."); } private function onUnsupported(e:AndroidBillingEvent):void { trace("sorry, in app billing won't work on this phone!"); }

购买

  1. 若要启动项目购买流程,请调用 purchaseItem(itemId),其中 itemId 是您使用 Android Market 发布帐户创建的其中一个 In-App Product ID:
AndroidIAB.androidIAB.purchaseItem("your_itemid");
  1. 当该流程完成后,您将会收到下列事件之一:
  • AndroidBillingErrorEvent.PURCHASE_FAILED – 如果发生错误且未完成购买,则会触发此事件。 该事件对象的itemId 属性将成为用户刚刚尝试购买的项目的 In-App Product ID。 errorID 属性表示错误的具体原因(参见表 1)。
  • AndroidBillingErrorEvent.PURCHASE_FAILED – 如果发生错误且未完成购买,则会触发此事件。 该事件对象的 itemId 属性将成为用户刚刚尝试购买的项目的 In-App Product ID。 errorID 属性表示错误的具体原因(参见表 1)。
  • AndroidBillingEvent.PURCHASE_USER_CANCELLED – 如果用户通过关闭复选对话框或按 Back 按钮取消购买,则会触发此事件。 该事件对象的itemId 属性将成为用户刚刚尝试购买的项目的 In-App Product ID。

表 1. AndroidBillngErrorEvent.errorID 值和描述

AndroidBillingErrorEvent.errorID 值

描述

AndroidBillingErrorID.REASON_SERVICE_UNAVAILABLE

Internet 连接不可用。

AndroidBillingErrorID.REASON_BILLING_UNAVAILABLE

Android Market 服务连接不可用。

AndroidBillingErrorID.REASON_DEVELOPER_ERROR

配置错误(参见下文)。

AndroidBillingErrorID.REASON_ITEM_UNAVAILABLE

未能在 Android Market 开发人员网站发布 itemId 请求。

发生未知错误。

发生未知错误。

如果收到 AndroidBillingErrorID.REASON_DEVELOPER_ERROR,那么说明您的代码或配置出现问题。 确定应用程序描述符文件是否设置正确,请参见更新应用程序描述符文件请参见更新应用程序描述符文件了解详细信息。 如果当设备关联的 Google 帐户与开发人员注册电子邮件帐户相同时尝试购买某个项目,也可能会报告此项错误,因为 Google 不允许从自己的帐户购买项目。 您可以通过将与设备关联的 Google 帐户切换为测试帐户电子邮件来避免发生此类错误,使用 Android Market 发布帐户创建应用程序中所述。

了解异步事件

Android Billing 服务异步运行;换句话说,事件可在项目购买状态发生变化时随时发送事件,即使您的应用程序在后台运行也是一样。 作为开发人员,您可以随心所欲地处理这些事件,并可持续跟踪用户已有哪些项目或者没有哪些项目。.

例如,您可以通过 Android Market 开发人员网站取消购买或申请退款。 当执行此类操作时,您的应用程序将会收到一个事件,指出退款或取消行为(即使并非在前台执行也是一样)。 当发生这种情况时,您的应用程序将会适时更新自身状态,即删除项目并设置变量,以表明用户已不再拥有该项目。

管理此类操作的其中一种方式是持续本地更新 ShareObject 实例,同时不断提供各出售项目的相关信息。 当您收到 AndroidBillingEvent.PURCHASE_SUCCEEDED 事件时,请更新 SharedObject 实例以表明现已拥有该项目。 此外,您还可能会收到 AndroidBillingEvent.PURCHASE_REFUNDEDAndroidBillingEvent.PURCHASE_CANCELLED 事件。 在这些情况下,您可以更新 SharedObject 实例以表明已经删除特定项目。

如果您拥有非托管项目,比如可以购买并使用多次的消耗型魔咒,则还要负责跟踪应用程序逻辑中已经购买和使用该项目的次数。

有关展示如何管理完整事务事件周期的简单示例,请参阅 In-App Billing Extension for Android 程序包中的 /example/IABExample.as 类。

还原托管事务

在 Android Market 开发人员网站中,标记为 managed 的任何应用内付费项目均视为一次性永久购买项目。 这个指定专指用户需要购买并保留的额外游戏关卡或虚拟帽子等项目。

由于这些项目需要托管,Google 会对用户是否购买这些项目的相关记录进行保存。 当然,您还必须在应用程序内保留此类相关记录。

用户可以从设备卸载应用程序,也可以购买新设备,然后在新设备上安装应用程序。 在这种情况下,您需要还原用户之前购买的所有项目。 例如,若要检测用户是否重新安装应用程序(或者可能只是首次安装),您可以保留 SharedObject 实例中 firstTimeuse 变量的默认值 true。 如果已经设置 firstTimeUse,则应用程序可能会调用 restoreManagedTransactions() 函数,这样即可重现该用户存储的所有托管购买事件。 随后,应用程序便可侦听这些事件并更新事件记录,以反映用户的购买情况。 然后,系统会将 firstTimeUse 设置为 false,这样在应用程序下次启动时将不会再重复这一过程。 RestoreManagedTransactions() 并不意味着在应用程序每次运行时均要使用,只需首次在新设备上运行应用程序时使用。

下列代码演示了 restoreManagedTransactions() 调用:

// if the application has not been run since installing, call this AndroidIAB.androidIAB.restoreManagedTransactions();

调用函数后,系统会为用户已经购买的各托管项目(如果有的话)均触发一个 AndroidBillingEvent.PURCHASE_SUCCEEDED 事件。 事件处理器可检查 event 对象的 itemId 属性,并将该项目授予用户。

当再无其他项目需要还原时,将会发送 AndroidBillingEvent.TRANSACTIONS_RESTORED 事件。

如果调用函数时发生错误,则会发送 AndroidBillingErrorEvent.TRANSACTION_RESTORE_FAILED事件

In-App Billing Extension for Android 程序包中的 /example/IABExample.as 类将再次展示完整事务事件周期管理方法示例。

通过虚构购买项目测试 API

In-App Billing Extension for Android 提供了大量内置测试方法,以便您以此确保正确执行计费设置。 这些方法将尝试联系计费服务,为不同的虚构项目用例(比如退款或成功购买)发送适当的事件。 在集成真实项目之前,请务必确保这些方法切实有效。

这些调用函数将为您指出与设备关联的 Google 帐户是开发人员注册电子邮件还是测试帐户电子邮件,如前文所述。 以下示例应当单独测试,并设置事件处理器来处理结果;我们并不打算在此后连续调用它们。

// this will start a purchase dialog and on success callback the PURCHASE_SUCCEEDED event: AndroidIAB.androidIAB.testPurchaseItemSuccess(); // this will start a purchase dialog then fake a PURCHASE_REFUNDED event AndroidIAB.androidIAB.testPurchaseItemRefunded(); // this will start a purchase dialog then fake a PURCHASE_CANCELLED event AndroidIAB.androidIAB.testPurchaseItemCancelled(); // this will start a purchase dialog and fake a PURCHASE_FAILED error event, // with a reason of ITEM_UNAVAILABLE AndroidIAB.androidIAB.testPurchaseItemUnavailable();

通过真实购买项目测试 API

您还可以使用真实 In-App Purchase ID 测试未发布应用程序的购买流程,但存在以下几个限制:

  • 设备关联的 Google 帐户必须是测试帐户电子邮件而开发人员注册电子邮件。 这是因为 Google 不允许从自己的帐户购买项目。 遗憾的是,更改 Google 帐户的唯一方式是恢复出厂设置,用户可以通过选择 Settings > Privacy > Factory Reset 完成此操作;当出现提示时,输入测试帐户电子邮件。
  • 应用程序必须保存在 Android Market 开发人员网站中,如使用 Android Market 发布帐户创建应用程序中所述。 但不需要发布。 无需公开应用程序即可进行测试。
  • 必须发布当前测试的 In-App Purchase ID(它们均将作为代码的 itemId),如使用 Android Market 发布帐户创建应用程序中所述。 但不需要发布应用程序本身。
  • 这样即可从测试帐户电子邮件关联帐户中取出现金。 您可以在购买后登录 Android Market 开发人员网站,单击 Cancel Entire Order 或 Refund Some Money,以防止出现这种状况。 这将会触发异步 AndroidBillingEvent.PURCHASE_CANCELLEDAndroidBillingEvent.PURCHASE_REFUNDED 事件。
5. 退款或取消购买。

更新应用程序描述符文件

您需要将 AIR 应用程序描述符文件配置为使用 AIR 3.0 SDK(或更高版本),纳入 In-App Billing 扩展,并使用一些特定于 Android Billing 的设置更新 Android 描述文件附件。如需有效的示例,请查看 example/app.xml。.

  1. 在应用程序描述符文件中将您的 AIR SDK 设置为 3.0:
<application xmlns="http://ns.adobe.com/air/application/3.0">
  1. 在描述符中纳入一个扩展链接:
<extensions> <extensionID>com.milkmangames.extensions.AndroidIAB</extensionID> </extensions>
  1. 更新您的 Android 描述文件附件。必须具有 android.permission.INTERNETcom.android.vending.BILLING 权限,In-App Billing 才能生效。 同时还必须在 元素内添加 com.android.vending.billing.IN_APP_NOTIFYcom.android.vending.billing.RESPONSE_CODEcom.android.vending.billing.PURCHASE_STATE_CHANGED 操作,如下所示:
<android> <manifestAdditions><![CDATA[ <manifest android:installLocation="auto"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.vending.BILLING" /> <application> <service android:name="com.milkmangames.extensions.android.IABBillingService" /> <receiver android:name="com.milkmangames.extensions.android.IABBillingReceiver"> <intent-filter> <action android:name="com.android.vending.billing.IN_APP_NOTIFY" /> <action android:name="com.android.vending.billing.RESPONSE_CODE" /> <action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" /> </intent-filter> </receiver> </application> </manifest> ]]></manifestAdditions> </android>

应用程序构建与故障排除

如果您使用的是 Flash Builder 4.6 或更高版本,或者 Flash Professional CS6 或更高版本,并且已按照上述要求添加了 In-App Billing for Android 扩展库,那么您可以像平常一样直接从 IDE 进行编译。如果未采用上述配置,并且通过命令行使用扩展构建应用程序,那么您需要指定包含 com.milkmangames.nativeextensions.AndroidIAB.ane 文件的目录。

以下是一个命令行构建示例:

[PATH_TO_AIR_SDK]\bin\adt -package -target apk-debug -storetype pkcs12 -keystore [YOUR_KEYSTORE_FILE] -storepass [YOUR_PASSWORD] anesample.apk app.xml anesample.swf -extdir [DIRECTORY_CONTAINING_ANE_FILE]

如果您的应用程序没有收到预期的事件,则尝试使用以下技巧:

  • 确保已将应用程序草案保存至 Android Market 开发人员网站,如使用 Android Market 发布帐户创建应用程序中所述。
  • 确保已经更新应用程序描述符文件,如更新应用程序描述符文件中所述。
  • 确保设备关联的 Google 电子邮件地址是开发人员注册电子邮件或测试帐户电子邮件。
  • 如果要测试 IABSample 应用程序的运行状况,请确保创建的 In-App Product ID 使用以下设置: 托管产品命名为 my_levelpack,非托管产品命名为 my_spell。 有关产品设置方法,请参阅 See 使用 Android Market 发布帐户创建应用程序。

下一步阅读方向

现在您的 In-App Billing Extension for Android 已经启动并正常运行,您可能希望深入探讨 ActionScript 3 文档 或了解Game Center、iAd、AdMob或 Milkman Games 的其他可用工具。.


根据 Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License 授予本作品许可。

更多相关文章

  1. 如何在Android系统源码中添加一个C项目?
  2. [cocos2d-x 学习] 如何编译自己的项目(从win32交叉编译到android)
  3. Cocos2d-x项目编译为Android应用——命令行方式
  4. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)
  5. Android完整的app项目
  6. Android 4.0为Launcher主界面所有应用程序图标添加统一背景主题
  7. Android 项目接入Flutter

随机推荐

  1. android应用程序跳转到系统的各个设置页
  2. (转) Android的Window类
  3. Android小项目——简单计算器的实现
  4. Android监听WIFI网络的变化并且获得当前
  5. Android使用XML全攻略(1)
  6. [安卓]Android(安卓)Developer Tools(Ecl
  7. Android 二维码开发功能实现(五)-----对z
  8. Android(安卓)AIDL基本步骤
  9. Socket Android手机客户端与PC服务端局域
  10. sscanf函数引起android 5.0卡死,C++中慎用