paypal ipn(Instant Payment Notification),就是Paypal開(kāi)發(fā)的一種能主動(dòng)通知第三方賣(mài)家系統交易狀態(tài)的一種機制。IPN的原理很簡(jiǎn)單,就是當產(chǎn)生了一個(gè)交易之后,交易狀態(tài)發(fā)生變化時(shí),如用戶(hù)已經(jīng)付款、或者退款、撤銷(xiāo)時(shí),Paypal利用常用的HTTP POST方式,將交易的一些變量提交給網(wǎng)站的某個(gè)頁(yè)面(稱(chēng)之為IPN Handler),當這個(gè)頁(yè)面接受到請求時(shí)候,將這些數據原封不動(dòng)加上一個(gè)指示驗證的cmd=_notify-validate,POST回Paypal的接口地址,如果數據正確,那么Paypal返回字符串VERIFIED,否則為INVALID,如果結果為VERIFIED,那么你的程序就可以使用這些數據進(jìn)行操作。
但代碼的調試是一件很痛苦的事情,因為作為第三方開(kāi)發(fā)人員,不可能開(kāi)兩個(gè)賬號,每次測試還要之間交易一些錢(qián),所以Paypal專(zhuān)門(mén)開(kāi)發(fā)了Sandbox給開(kāi)發(fā)人員進(jìn)行開(kāi)發(fā),首先到https://developer.paypal.com/ 注冊一個(gè)開(kāi)發(fā)賬號,好了之后再進(jìn)入Sandbox建立測試用的Paypal虛擬賬號(至少應該建立一個(gè)Business的和一個(gè)Personal的),這種賬號注冊方法和Paypal的流程一樣,信息可以是假的,包括銀行賬號、信用卡(其實(shí)Paypal Sandbox會(huì )自動(dòng)生成一些隨機的號碼)。接下來(lái)需要激活Paypal Sandbox的虛擬賬號,注意,這里不管你在Paypal Sanbox注冊時(shí)填什么郵件地址,有任何發(fā)送到虛擬賬號所填郵箱的郵件都存會(huì )在開(kāi)發(fā)賬號的管理界面中的Email頁(yè)(導航欄上有)中。登錄 Sandbox的虛擬Paypal環(huán)境,還需要驗證虛擬賬號的銀行,這里可以隨便填,然后通過(guò)Add Funds來(lái)給賬戶(hù)充值(想填多少填多少)。然后,還需要激活I(lǐng)PN的選項,在Business的那個(gè)賬戶(hù)的Profile設置頁(yè)面中,點(diǎn)擊,然后點(diǎn)擊 Edit按鈕,打開(kāi)IPN,這里如果你使用的是固定的IPN Handle,可以直接將地址填入。
接下來(lái),我們測試的時(shí)候,應該將Paypal接口的地址設置為https://www.sandbox.paypal.com/cgi-bin/webscr
最后基本的流程為:
用戶(hù)在我們的網(wǎng)站上選擇商品、放入購物車(chē),然后檢查準備支付
網(wǎng)站根據購物車(chē)中的商品,生成Paypal的支付表單(也是提交到上面IPN用的Paypal接口地址),包含了此次交易的一些信息(下次會(huì )專(zhuān)門(mén)找機會(huì )解釋一下)。并在自己的數據庫中生成一張訂單記錄。
Paypal在Session中記錄下這些交易信息
用戶(hù)用Paypal賬戶(hù)登錄Paypal(Sandbox用Sandbox的虛擬賬號),復查明細,點(diǎn)擊Pay按鈕
Paypal進(jìn)行交易處理,如果我們的Paypal收款賬號在接受帳款上沒(méi)有什么問(wèn)題(沒(méi)有特別的需要在界面上“Accept”的地方),交易完成,那么Paypal會(huì )發(fā)送一個(gè)IPN,并發(fā)送提示郵件。
我們IPN Handler接受到信息,首先向Paypal進(jìn)行校驗,如果信息正確,然后根據信息和自己數據庫中進(jìn)行比對,如果無(wú)誤,可以將支付信息保存,并修改訂單狀態(tài)。
然后Paypal會(huì )顯示一個(gè)界面表示交易完成,此時(shí)如果用戶(hù)點(diǎn)擊“Return”按鈕,Paypal會(huì )將用戶(hù)送回我們網(wǎng)站指定地點(diǎn)。
我們網(wǎng)站迎接用戶(hù)回來(lái),向用戶(hù)表示感謝,并進(jìn)行提醒,給出訂單號等等。
整個(gè)流程基本如下,不過(guò)其中有很多要注意的地方:
我們看到了,接口地址是https開(kāi)頭的,也就是要求使用SSL進(jìn)行連接,其實(shí)Paypal Sandbox可以使用http,但是最后實(shí)際的Paypal接口,不支持http協(xié)議,所以如果你用PHP寫(xiě)IPN Handler腳本的話(huà),在驗證信息的代碼部分,如果簡(jiǎn)簡(jiǎn)單單使用fopen、HTTP_Request之類(lèi)的工具是沒(méi)用的,PHP的socks庫不支持SSL,應該使用curl,有兩種方法,一個(gè)是使用PHP擴展中的libcurl,Paypal官方發(fā)布的SDK中便是使用的這個(gè)方法,但Paypal的SDK非常復雜,如果想自己寫(xiě),可以使用Snoopy,一個(gè)簡(jiǎn)單實(shí)用的PHP請求庫(它自己說(shuō)是模擬了瀏覽器的行為),而它使用的是Curl的可執行文件,通過(guò)管道獲得結果,而非php的libcurl,所以自己cURL的主頁(yè)上下載一個(gè)支持SSL的編譯版本,可能還需要安裝OpenSSL,不過(guò)對于Linux系統,可能應該會(huì )都帶。
在支付表單中,可以自己設置notify_url字段,來(lái)指定此次交易的信息應該發(fā)送到哪個(gè)地方,這樣就可以覆蓋在Profile中我們的設置,另外,這個(gè)字段要進(jìn)行urlencode。
我們得到的IPN信息中,status對應的便是交易狀態(tài),如Complete表示完成,首字母大寫(xiě),而驗證結果則是VERIFIEY或者INVALID,全部大寫(xiě),具體的內容,可以查看Paypal官方的文檔訂單管理整合指南。
本文來(lái)自CSDN博客,轉載請標明出處:http://blog.csdn.net/lee576/archive/2008/11/05/3229648.aspx
聯(lián)系客服