1. 程式人生 > >PayPal Sandbox 線上支付開發測試環境

PayPal Sandbox 線上支付開發測試環境

paypal ipn(Instant Payment Notification),就是Paypal開發的一種能主動通知第三方賣家系統交易狀態的一種機制。IPN的原理很簡單,就是當產生了一個交易之後, 交易狀態發生變化時,如使用者已經付款、或者退款、撤銷時,Paypal利用常用的HTTP POST方式,將交易的一些變數提交給網站的某個頁面(稱之為IPN Handler),當這個頁面接受到請求時候,將這些資料原封不動加上一個指示驗證的cmd=_notify-validate,POST回Paypal的介面地址,如果資料正確,那麼Paypal返回字串VERIFIED,否則為INVALID,如果結果為VERIFIED,那麼你的程式就可以使用這些資料進行操作。
但程式碼的除錯是一件很痛苦的事情,因為作為第三方開發人員,不可能開兩個帳號,每次測試還要之間交易一些錢,所以Paypal專門開發了Sandbox給開發人員進行開發,首先到https://developer.paypal.com/ 註冊一個開發帳號,好了之後再進入Sandbox建立測試用的Paypal虛擬帳號(至少應該建立一個Business的和一個Personal的),這 種賬號註冊方法和Paypal的流程一樣,資訊可以是假的,包括銀行帳號、信用卡(其實Paypal Sandbox會自動生成一些隨機的號碼)。接下來需要啟用Paypal Sandbox的虛擬帳號,注意,這裡不管你在Paypal Sanbox註冊時填什麼郵件地址,有任何傳送到虛擬帳號所填郵箱的郵件都存會在開發帳號的管理介面中的Email頁(導航欄上有)中。登入 Sandbox的虛擬Paypal環境,還需要驗證虛擬帳號的銀行,這裡可以隨便填,然後通過Add Funds來給賬戶充值(想填多少填多少)。然後,還需要啟用IPN的選項,在Business的那個賬戶的Profile設定頁面中,點選,然後點選 Edit按鈕,開啟IPN,這裡如果你使用的是固定的IPN Handle,可以直接將地址填入。
接下來,我們測試的時候,應該將Paypal介面的地址設定為https://www.sandbox.paypal.com/cgi-bin/webscr

最後基本的流程為:
  • 使用者在我們的網站上選擇商品、放入購物車,然後檢查準備支付
  • 網站根據購物車中的商品,生成Paypal的支付表單(也是提交到上面IPN用的Paypal介面地址),包含了此次交易的一些資訊(下次會專門找機會解釋一下)。並在自己的資料庫中生成一張訂單記錄。
  • Paypal在Session中記錄下這些交易資訊
  • 使用者用Paypal賬戶登入Paypal(Sandbox用Sandbox的虛擬帳號),複查明細,點選Pay按鈕
  • Paypal進行交易處理,如果我們的Paypal收款帳號在接受帳款上沒有什麼問題(沒有特別的需要在介面上“Accept”的地方),交易完成,那麼Paypal會發送一個IPN,併發送提示郵件。
  • 我們IPN Handler接受到資訊,首先向Paypal進行校驗,如果資訊正確,然後根據資訊和自己資料庫中進行比對,如果無誤,可以將支付資訊儲存,並修改訂單狀態。
  • 然後Paypal會顯示一個介面表示交易完成,此時如果使用者點選“Return”按鈕,Paypal會將使用者送回我們網站指定地點。
  • 我們網站迎接使用者回來,向用戶表示感謝,並進行提醒,給出訂單號等等。

整個流程基本如下,不過其中有很多要注意的地方:

  1. 我們看到了,介面地址是https開頭的,也就是要求使用SSL進行連線, 其實Paypal Sandbox可以使用http,但是最後實際的Paypal介面,不支援http協議,所以如果你用PHP寫IPN Handler指令碼的話,在驗證資訊的程式碼部分,如果簡簡單單使用fopen、HTTP_Request之類的工具是沒用的,PHP的socks庫不支援SSL
    ,應該使用curl,有兩種方法,一個是使用PHP擴充套件中的libcurl,Paypal官方釋出的SDK中便是使用的這個方法,但Paypal的SDK非常複雜,如果想自己寫,可以使用Snoopy,一個簡單實用的PHP請求庫(它自己說是模擬了瀏覽器的行為),而它使用的是Curl的可執行檔案,通過管道獲得結果,而非php的libcurl,所以自己cURL的主頁上下載一個支援SSL的編譯版本,可能還需要安裝OpenSSL,不過對於Linux系統,可能應該會都帶。
  2. 在支付表單中,可以自己設定notify_url欄位,來指定此次交易的資訊應該傳送到哪個地方,這樣就可以覆蓋在Profile中我們的設定,另外,這個欄位要進行urlencode
  3. 我們得到的IPN資訊中,status對應的便是交易狀態,如Complete表示完成,首字母大寫,而驗證結果則是VERIFIEY或者INVALID,全部大寫,具體的內容,可以檢視Paypal官方的文件訂單管理整合指南