WebObjects/Project WONDER/Frameworks/WOPaypal
我想我们应该首先解决的问题是,您是否使用 PayPal 的即时付款通知服务来接收 PayPal 的通知,表明您的用户已完成某种 PayPal 交易。如果您没有使用该服务,而是每天登录 PayPal 网站处理交易,那么您无需担心监听器和委托,也不必担心从 PayPal 获取请求参数的整个过程。然后,您可以使用按钮或链接组件来启动单个项目的交易或将项目添加到 PayPal 购物篮中。您还可以跳过这封电子邮件的其余部分。;)
但是,如果您有兴趣通过 PayPal 的 IPN(即时付款通知)机制处理交易,您可以查看 WOPayPal 框架中 PayPalAction.java 源代码中的 ipnAction 方法,了解我是如何接收他们的请求(通知)并通过回显他们的交易密钥来验证它的。在收到验证后,PayPal 将发送真实消息。这是您需要处理的内容。他们会提供几个返回代码,您需要能够正确处理它们,但听起来您已经做好了准备。
如果您允许我发表意见,您可能会发现使用现有代码比重写自己的请求处理更具优势。您可以通过复制我的 ipnAction 并将其改编为您的需求来做到这一点,或者通过创建实现几个方法的自己的委托类并将您的委托分配来处理 PayPal 返回的各种响应代码。不要因为上面提到的委托的分配而感到困惑。具体来说,PayPalNotificationLogger 只是一个我创建的简单类,作为示例委托。它所做的只是使用 NSLog 将它收到的消息“记录”到 System.out。在您的应用程序中,您将创建自己的委托类实现,它将执行更有用的操作。
让我简要地尝试说服您使用通知和委托的好处...
想象一家名为 ACME 的小型一人公司。ACME 从客户那里接单,并将其转交给其供应商 ZYX。然后,供应商给 ACME 打电话,确认订单已收到,并提供有关 ACME 何时可以收到货物的详细信息。随着公司不断发展,首席执行官承担了太多的责任,无法继续与 ZYX 对接并处理所有订单管理,因此他雇用了一名助理并安装了一个 PBX 交换机,将来自 ZYX 的电话路由到他的助理。首席执行官教他的新助理订单管理的责任,并将这些责任“委托”给助理。由于效率提高,ACME 发展壮大,所有员工都从股票期权中获利,每个人都过上了幸福的生活。
上面的(相当牵强)示例展示了通知和委托的一般思路。可以说,供应商 ZYX 的回调类似于 PayPal IPN。在这种情况下,交换机等同于 NSNotificationCenter;它检测到来电,然后将电话(NSNotification 消息)发送到相应的监听器。在这种情况下,交换机被编程为检测来自公司 ZYX 的电话,并将其转发给被分配或“委托”了处理来自 ZYX 的电话责任的助理。一旦助理(委托)接听电话,它就会执行它知道如何处理电话的事情之一,具体取决于它接收到的消息类型。
回到现实... 通知和委托是简单的设计模式,您会在整个 Cocoa 和 WebObjects 中看到它们。它们非常有用,并不太复杂。
基本上,通知是一种在不知道接收消息的类详细信息的情况下传递消息的方式。通知由 NSNotificationCenter 广播,NSNotificationCenter 是一个控制器对象,负责将通知消息发送到相应的接收者。通过要求它将特定类型的通知发送到订阅者对象,您可以“订阅”通知中心。通常,您会根据名称请求通知。您还可以向通知中心发送消息,告诉它将通知消息广播给所有相关方。
类似地,委托是将处理某些责任传递给另一个类的方式。使用委托允许您将类“松散耦合”在一起,并通过在特定实例中分配所需的委托类来定制行为。委托只需要实现一组特定的方法,以便它能够处理要传递给它的消息。您甚至可以有多个具有不同行为的委托,并在运行时根据需要交换它们。
我使用通知机制将消息广播到“监听器”(订阅接收特定通知),然后将消息转发到分配的“委托”,以处理 PayPal 通知中的不同条件。在 WOPayPal 的情况下,委托只需要实现方法来处理您感兴趣的 PayPal 消息。委托接口中有 5 个方法
- public void processDeniedPaypalTransaction(WORequest aRequest);
- public void processFailedPaypalTransaction(WORequest aRequest);
- public void processInvalidPaypalTransaction(WORequest aRequest);
- public void processPendingPaypalTransaction(WORequest aRequest);
- public void processValidPaypalTransaction(WORequest aRequest);
因此,基本上,您需要做的只是
- 定义一个包含上述任何方法的类。此类是您处理有关 PayPal 通知消息的委托类。
- 告诉监听器(订阅通知的对象)使用您的委托,而不是只将请求记录到 System.out 的简单默认委托。我在应用程序类的构造函数方法中执行此操作。只需调用 PayPalNotificationListener 上的静态方法,将您的委托类实例作为参数传递。
PayPalNotificationListener.setDelegate(new myPayPalDelegate());
- 如果您想在成功或取消交易后返回自定义组件,请在启动参数或应用程序的属性文件中设置每个组件的属性。
SuccessfulPayPalTransactionComponent = MySuccessPage CancelledPayPalTransactionComponent = MyCancelledTransactionPage
这些页面将由 PayPal 在成功交易或取消交易时调用的 DirectAction 方法返回。要使用这些值,请在各种超链接和按钮组件中将 returnURL 和 cancelURL 值设置为应用程序中 PayPalAction DirectAction 的 URL,例如 http://yoursite.com/cgi-bin/WebObjects/YourApp.woa/wa/PayPalAction/return 或 http://yoursite.com/cgi-bin/WebObjects/YourApp.woa/wa/PayPalAction/cancel.
- 在您的 IPN 首选项中告诉 PayPal 如何找到您的应用程序以及将 IPN 消息发送到哪里。
http://yoursite.com/cgi-bin/WebObjects/YourApp.woa/wa/PayPalAction/ipn
这基本上就是 WOPayPal 的故事。我希望这有助于澄清框架中的工作原理以及如何轻松地利用它。至少,如果您有源代码副本,您可以复制 DirectAction 类的相关部分。如果您有任何其他问题,请告诉我。我保证将来不会这么啰嗦。