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 類的相關部分。如果您有任何其他問題,請告訴我。我保證將來不會這麼囉嗦。