关于Android内置付费在大陆和港台不靠谱的事就不详细说了。。也许这个能解决问题。。。。用Adobe绕一下不知道行不行。。未测试。。。
原地址:http://www.adobe.com/cn/devnet/air/articles/android-billing-ane.html
Adobe 开发者中心 / Adobe AIR 开发人员中心 /
29 May 2012
页面工具 |
使用 Flash Builder 或 Flash Professional 和 Adobe AIR 构建 Android 应用程序的经验,将有助于您充分理解本文的内容。
其他必要产品
Milkman Games In-App Billing Extension for Android
中级
使用来自 Milkman Games 的 In-App Billing Extension for Android,您可以使用 ActionScript 3 快速将应用内付费功能集成到移动 AIR 应用程序中。
In-App Billing Extension for Android 是一种纯粹的原生 Java 解决方案,支持您:
在应用程序中使用 In-App Billing 前,您需要在 Android Market 网站上适当地进行相关设置。
接下来,将 com.milkmangames.nativeextensions.AndroidIAB.ane 库添加到您的项目。(如果您未使用 Flash Builder 4.6 及更高版本或 Flash Professional CS6 及更高版本,您将需要添加 AndroidIABAPI.swc 库。)
在 Flash Professional CS6 中:
在 Flash Builder 4.6 中:
在 FlashDevelop 中:
只需几次简单的调用,您就可以开始使用 In-App Billing 扩展。 请参阅 example/AndroidIAB.as,了解展示 ActionScript API 使用方法的完整示例。
请按照以下步骤开始操作:
com.milkmangames.nativeextensions.android.*; com.milkmangames.nativeextensions.android.events.*;
AndroidIAB.create()
初始化 API。 您可以先检查 AndroidIAB.isSupported()
方法,以确保当前使用的平台是 Android,而非其他不受支持的平台(比如 iOS 或 Windows):if (AndroidIAB.isSupported()) { AndroidIAB.create(); }
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);
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!"); }
purchaseItem(itemId)
,其中 itemId
是您使用 Android Market 发布帐户创建的其中一个 In-App Product ID:AndroidIAB.androidIAB.purchaseItem("your_itemid");
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 值 |
描述 |
|
Internet 连接不可用。 |
|
Android Market 服务连接不可用。 |
|
配置错误(参见下文)。 |
|
未能在 Android Market 开发人员网站发布 |
|
发生未知错误。 |
如果收到 AndroidBillingErrorID.REASON_DEVELOPER_ERROR
,那么说明您的代码或配置出现问题。 确定应用程序描述符文件是否设置正确,请参见更新应用程序描述符文件请参见更新应用程序描述符文件了解详细信息。 如果当设备关联的 Google 帐户与开发人员注册电子邮件帐户相同时尝试购买某个项目,也可能会报告此项错误,因为 Google 不允许从自己的帐户购买项目。 您可以通过将与设备关联的 Google 帐户切换为测试帐户电子邮件来避免发生此类错误,使用 Android Market 发布帐户创建应用程序中所述。
Android Billing 服务异步运行;换句话说,事件可在项目购买状态发生变化时随时发送事件,即使您的应用程序在后台运行也是一样。 作为开发人员,您可以随心所欲地处理这些事件,并可持续跟踪用户已有哪些项目或者没有哪些项目。.
例如,您可以通过 Android Market 开发人员网站取消购买或申请退款。 当执行此类操作时,您的应用程序将会收到一个事件,指出退款或取消行为(即使并非在前台执行也是一样)。 当发生这种情况时,您的应用程序将会适时更新自身状态,即删除项目并设置变量,以表明用户已不再拥有该项目。
管理此类操作的其中一种方式是持续本地更新 ShareObject 实例,同时不断提供各出售项目的相关信息。 当您收到 AndroidBillingEvent.PURCHASE_SUCCEEDED
事件时,请更新 SharedObject 实例以表明现已拥有该项目。 此外,您还可能会收到 AndroidBillingEvent.PURCHASE_REFUNDED
或 AndroidBillingEvent.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 类将再次展示完整事务事件周期管理方法示例。
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();
您还可以使用真实 In-App Purchase ID 测试未发布应用程序的购买流程,但存在以下几个限制:
AndroidBillingEvent.PURCHASE_CANCELLED
或 AndroidBillingEvent.PURCHASE_REFUNDED
事件。您需要将 AIR 应用程序描述符文件配置为使用 AIR 3.0 SDK(或更高版本),纳入 In-App Billing 扩展,并使用一些特定于 Android Billing 的设置更新 Android 描述文件附件。如需有效的示例,请查看 example/app.xml。.
<application xmlns="http://ns.adobe.com/air/application/3.0">
<extensions> <extensionID>com.milkmangames.extensions.AndroidIAB</extensionID> </extensions>
android.permission.INTERNET
和 com.android.vending.BILLING
权限,In-App Billing 才能生效。 同时还必须在 元素内添加 com.android.vending.billing.IN_APP_NOTIFY
、com.android.vending.billing.RESPONSE_CODE
和 com.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]
如果您的应用程序没有收到预期的事件,则尝试使用以下技巧:
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 授予本作品许可。