探索Adobe AIR中的支付服务API

在开发PlayBook应用程序时,集成支付功能是提升用户体验的关键一步。Adobe AIR为开发者提供了一个强大的API,使得在应用程序内实现支付变得简单。本文将带了解如何使用这个新的API,它从Adobe AIR 0.9.2的Beta 3版本开始提供。

要实际测试这个API,需要先作为供应商注册产品到BlackBerry。目前对这个注册流程还不太熟悉,会在另一篇博客文章中详细介绍。这里提供一个,可以从中获取更多关于支付服务的信息。

尽管上述链接中的当前文档并没有解释如何使用Tablet OS SDK for AIR的支付特定API,但它是可用的。接下来的内容将通过一个示例应用程序,带了解如何使用这个API。可以在上的PaymentService文件夹中找到这个示例应用程序。

示例应用程序概览

示例应用程序的界面包含两个标签和三个箭头图标。用户点击特定的箭头图标,即可购买他们选择的箭头。

应用程序布局

使用之前在文章中介绍的代码,应用程序的布局如下:

<?xml version="1.0" encoding="utf-8"?> <r:QApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:r="http://ns.renaun.com/mxml/2010" margins="{Vector.<Number>([12,12,12,12])}" flow="{ContainerFlow.VERTICAL}" align="{ContainerAlign.NEAR}" size="100" sizeUnit="{SizeUnit.PERCENT}" xmlns:text="qnx.ui.text.*"> <fx:Script source="PaymentServiceSource.as"/> <text:Label text="点击购买箭头:" autoSize="{TextFieldAutoSize.LEFT}"/> <r:Image source="com/renaun/embed/blue_arrowhead.png" click="purchaseObject(event)"/> <r:Image source="com/renaun/embed/green_arrowhead.png" click="purchaseObject(event)"/> <r:Image source="com/renaun/embed/red_arrowhead.png" click="purchaseObject(event)"/> <text:Label id="lblOutput" text="消息将显示在这里" autoSize="{TextFieldAutoSize.LEFT}"/> </r:QApplication>

这段代码声明了一个具有垂直流的QNX容器,并添加了标签和图片。在MXML中的Image类(注意r命名空间)实际上是一个扩展了QNX Image类的类,允许通过设置source属性来设置图片。真正的逻辑发生在点击按钮时。以下是PaymentServiceSource.as文件的代码:

package { import net.rim.blackberry.events.PaymentErrorEvent; import net.rim.blackberry.events.PaymentSuccessEvent; import net.rim.blackberry.payment.PaymentSystem; import qnx.ui.core.ContainerAlign; import qnx.ui.core.ContainerFlow; import qnx.ui.core.SizeUnit; import qnx.ui.data.DataProvider; public class PaymentServiceSource { private var paymentService:PaymentSystem; private var goods:Array = [ {sku: "1001", name: "蓝色箭头", meta: "销售价格", app: "箭头R", icon: "/com/renaun/embed/blue_arrowhead_small.png"}, {sku: "1002", name: "绿色箭头", meta: "销售价格", app: "箭头R", icon: "/com/renaun/embed/green_arrowhead_small.png"}, {sku: "1003", name: "红色箭头", meta: "销售价格", app: "箭头R", icon: "/com/renaun/embed/red_arrowhead_small.png"} ]; protected function purchaseObject(event:MouseEvent):void { if (!paymentService) { paymentService = new PaymentSystem(); paymentService.addEventListener(PaymentErrorEvent.PAYMENT_SERVER_ERROR, paymentErrorHandler); paymentService.addEventListener(PaymentErrorEvent.USER_CANCELLED, paymentErrorHandler); paymentService.addEventListener(PaymentErrorEvent.PAYMENT_ERROR, paymentErrorHandler); paymentService.addEventListener(PaymentErrorEvent.DIGITAL_GOOD_NOT_FOUND, paymentErrorHandler); paymentService.addEventListener(PaymentSuccessEvent.PAYMENT_SUCCESS, paymentSuccessHandler); // 设置为本地模式以测试每个事件/状态 paymentService.setConnectionMode(PaymentSystem.CONNECTION_MODE_LOCAL); } // 知道这是一种非常脆弱的方式来查找对象。 var obj:Object = goods[getChildIndex(event.target as DisplayObject) - 1]; paymentService.purchase(obj.sku, null, obj.name, obj.meta, obj.app, "file://" + File.applicationDirectory.nativePath + obj.icon); } private function paymentSuccessHandler(event:PaymentSuccessEvent):void { lblOutput.text = "成功: " + event.purchase.date + " - " + event.purchase.licenseKey; } private function paymentErrorHandler(event:PaymentErrorEvent):void { lblOutput.text = "错误[" + event.type + "]: " + event.message; } } }

首先要注意的是net.rim.blackberry.payment.PaymentSystem类。这是购买API发生的地方。创建PaymentSystem的一个新实例,然后调用purchase()方法。看起来很简单,但复杂性在于处理所有成功和错误的情况。这个示例为不同的事件添加了监听器,并将不同的消息输出到底部的标签。

注意:在0.9.2 SDK中有一个错误,如果自动导入net.rim.blackberry.payments.PaymentSuccessEvent而不是net.rim.blackberry.events.PaymentSuccessEvent。这是一个元数据打字错误,将来可能会被修复,目前的工作方式是手动修复导入语句中的打字错误。

PaymentService在本地连接模式下运行,允许开发者在将其连接到作为供应商注册的实际sku之前,测试所有不同的情况。这是通过paymentService.setConnectionMode(PaymentSystem.CONNECTION_MODE_LOCAL);这行代码完成的。如果注释掉这行代码(这是默认的),将处于生产模式,与实时的AppWorld服务器连接。但在BlackBerryTablet OS PlayBook模拟器上,如果尝试这样做,会得到这样的消息:

生产模式消息在模拟器上

让仔细看看paymentService.purchase()方法调用。这是从BlackBerry Tablet OS SDK for Adobe AIR asdocs中获取的当前文档信息。

digitalGoodID:String (默认 = null) — 数字商品ID

只需要提供要购买的数字商品的ID或SKU;不需要同时提供两者。如果同时提供了ID和SKU,则ID优先;如果基于ID无法在支付服务上找到数字商品,则使用SKU。

digitalGoodSKU:String (默认 = null) — 数字商品SKU

见digitalGoodID的描述。

可选参数:

digitalGoodName:String (默认 = null) — 数字商品名称

如果单个ID/SKU在支付服务服务器上代表多个数字商品,并且应该在购买屏幕上显示更具体的数字商品名称,则应提供数字商品名称。例如,如果一个游戏通过支付服务以单一价格点销售额外级别,则可以使用通用的"My game level"数字商品用于所有这些级别。然而,在购买时,游戏应用程序应该用正在购买的级别的名称覆盖"My game level"。这样,最终用户就能清楚地知道他们在购买确认屏幕上购买的是什么。

metaData:String (默认 = null) — 元数据

元数据为应用程序开发者提供了一种在支付服务服务器上存储有关每次购买的信息的方式,并通过net.rim.blackberry.api.payment.PaymentSystem.getExistingPurchases(boolean)检索这些数据。例如,假设一个书籍供应商以单一价格点提供许多标题,并在供应商门户上将它们表示为单一数字商品。在这种情况下,可以提供书籍的ISBN作为元数据,唯一标识已购买的数字商品。然后,可以通过获取先前购买的商品,过滤书籍的数字商品内容ID,并最终枚举每个购买中的ISBN元数据,随时检索整个购买书籍列表。

purchaseAppName:String (默认 = null) — 购买应用程序名称

为了在应用程序内购买过程中进一步给最终用户提供上下文,购买和BlackBerry ID登录屏幕顶部会显示一个横幅,显示购买来源的应用程序的名称和图标(即,购买应用程序)。要自定义显示的名称和图标,只需将它们作为参数提供。如果名称或图标没有作为参数提供,则从购买应用程序的描述符中检索。然而,这可能不适用于动态注册到主屏幕的应用程序;在这些情况下,强烈建议购买应用程序显式提供名称和图标作为购买参数的一部分。

purchaseAppIcon:String (默认 = null) — 购买应用程序图标

见purchaseAppName的描述。

在上面的代码示例中,所有参数都按说明工作。除了没有测试元数据参数数据的方法。在PaymentService设置为本地连接模式的情况下,可以模拟实际购买、取消购买、商品未找到和服务器错误。调用purchase()之后,它看起来像这样:

PaymentService测试模式购买弹出窗口。

这里是可供测试的选项(点击取消按钮也会发送消息)。

不知道这是否完全符合用户在应用程序内购买UI的外观,尤其是文本提到了立即购买按钮。但应该注意到,能够通过购买方法参数定义应用程序名称、商品名称和商品图标。价格似乎来自AppWorld方面,可能由注册商品作为供应商并获得sku的过程驱动。

无论如何,这是目前关于如何开始使用新的PaymentServiceAPI的信息。随着了解更多关于这个API的信息,将会有更多内容。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485