本文轉自:https://www.cnblogs.com/lazb/p/5881678.htmlphp
1.什麼是第三方支付html
所謂第三方支付,就是一些和各大銀行簽約、並具有必定實力和信譽保障的第三方獨立機構提供的交易支持平臺。在經過第三方支付平臺的交易中,買方選購商品後,使用第三方平臺提供的帳戶進行貨款支付,由第三方通知賣家貨款到達。mysql
目前提供第三方支付的機構不少,常見的有支付寶、財付通、快錢、網銀在線、易寶支付、雲網等各大支付平臺。網站若是須要實現第三方支付首先應該向第三方支付平臺申請一個帳號並簽署協議,協議生效後第三方支付平臺將爲其開通在線支付功能,經過程序將接口集成到網站中。sql
爲何要使用第三方支付?由於第三方支付平臺已經與各大銀行進行簽約,網站主只須要在此平臺申請一個帳號便可支持幾乎全部的種類的銀行卡信用卡的交易。數據庫
2.第三方支付原理數組
以上簡要說明了支付過程,固然其中省略了一些步驟(好比購物車,訂單等),咱們重點來看支付流程。安全
2.1用戶向商城網站發起確認訂單的請求服務器
2.2商城網站接收到請求保存訂單數據到數據庫或其餘存儲介質函數
2.3返回訂單確認頁面,頁面上應該顯示訂單金額等信息工具
2.4用戶確認支付,發起支付請求。注:支付請求是發送到支付網關(好比支付寶、網銀在線)而不是發送到商城網站。
2.5顯示支付頁面
2.6用戶填寫認證信息(帳號密碼等)提交
2.7這裏有兩個步驟一個是扣款成功後頁面跳轉到支付結果頁面(展現給用戶),另外一個是支付通知,這兩步沒有前後順序可能同時執行,商城網站接收到支付通知後根據驗證規則驗證信息的有效性,並做出相應的更改操做(例:有效則更改訂單爲已付款狀態,無效則記錄非法請求信息)。
以支付寶爲例:若是實如今網站中集成支付寶接口,首先要有一個支付寶帳號,接下來向支付寶申請在線支付業務,簽署協議。協議生效後有支付寶一方會給網站方一個合做夥伴ID,和安全校驗碼,有了這兩樣東西就能夠按照支付寶接口文檔開發支付寶接口了,在上圖的幾個步驟中只有4和7兩個步驟在商城與支付網關之間有信息交互。在步驟4中指將數據發送到支付網關(支付寶),在步驟7中是的通知驗證部分,驗證網關請求網站某地址,網站按驗證規則對信息進行驗證記錄並做出響應,咱們幾乎在開發任何支付接口時,重點是這兩部分的開發,明白支付接口原理,開發支付接口就不難了。
3.支付寶接口開發
3.1接口簡介與測試
支付寶目前提供了,擔保交易、標準即時到賬、雙功能等幾種接口,只是在功能上有些差別,網站集成方式是同樣的。以標準即時到賬接口爲例,在與支付寶簽署協議後,還須要幾個步驟才能完成集成。
選擇「我要自助集成」接下來會看到的連接,點擊下載技術文檔。
在下載後的文件中有標準支付寶交易服務接口、商家工具、接口集成指南等接文檔,另外還有幾種語言寫的demo.咱們能夠根據接口文檔按規則全新開發,也能夠再demo基礎上修改集成到網站,須要注意的是開發支付接口須要在公網(服務器必須能夠經過外網訪問)才能夠完成整個調試過程,若是服務器在外網訪問不到,則沒法接收到支付通知。
看一下demo中每一個文件的做用:
這裏已經下載好了(見資源目錄pay文件夾),爲了便於調試增長修改了若干文件,並增長了一張數據表保存訂單信息,咱們修改一下配置文件完成一個測試過程。
alipay_config.php是基礎信息配置文件,咱們須要將在支付寶後臺獲取的PID與Key寫入到配置文件中。
配置項:
其中方框內的數據是咱們須要重點修改的。支付通知地址與返回地址的區別,前面已經提到,在步驟7中有兩項:支付結果頁面與支付通知信息,支付結果頁面是用戶支付完成後會自動跳轉到這個地址這裏是返回地址($return_url)。
支付通知地址一樣是用戶支付完成後,支付寶會請求該地址($notify_url),可是支付通知是支付寶服務器直接請求,不會被用戶看到。這兩個地址必須是以http開頭的完整路徑格式爲了完成測試過程,這裏已經將/pay/alipay/notify_url.php改寫,將$notify_url設置爲可訪問到此文件的URL便可。這幾項配置好後再根據數據庫腳本(pay/orders.sql)建立一張數據表。並根據數據庫的配置信息修改mysql_config.php.經過對支付寶提供的demo作簡單修改就能夠完成建立支付請求(步驟4)了,這裏更改了支付首頁等頁面(見源碼包pay目錄)。咱們先測試一下:
數據庫中增長了一條「訂單信息」.
若是點擊「確認支付」按鈕或者確認支付 連接將會跳轉到支付寶頁面,點擊按鈕時經過表單POST方式將信息提交到支付網關,因爲支付請求數據無需讓用戶看到,這裏都寫在隱藏域中了。確認支付 連接是經過URL傳參,由於支付寶接口容許以POST或者GET方式提交,因此兩種方式均可以。把參數提交給支付網關後,頁面跳轉到到支付頁面。咱們看到以下圖所示:
咱們看到支付寶爲咱們提供了兩種支付方式,一種是經過支付寶帳戶支付,另外一種是經過銀行卡支付。例如選擇使用銀行卡支付,填寫郵箱或手機號跳轉到以下頁面:
咱們開單支付寶幾乎支持全部的銀行卡支付,同時有信用卡和網點方式付款,選擇對應的銀行下一步按提示付款便可。付款完成後頁面會返回到咱們在配置文件中配置的$return_url地址,同時「訂單狀態」也會發生改變。
注:測試時若是沒有在外網測試(即支付通知地址沒法在外網訪問)則支付通知沒法被請求到,沒法自動完成訂單狀態的修改。
3.2支付寶接口規範與代碼分析
支付寶接口規範可參考/pay/doc/標準支付寶交易服務接口(專用於防釣魚網站)。Pdf,裏面已經有了比較詳細的說明。
3.2.1如何建立支付請求
在前面的測試中咱們點擊了「確認支付」將信息將信息提交到了支付寶的支付網關,咱們能夠思考一下應該發送哪些參數給支付網關。關於請求參數列表能夠參考標準支付寶交易服務接口(專用於防釣魚網站)。Pdf中的3.2.2.須要注意的是並非咱們把這些參數原封不動的提交到支付寶就能夠了,爲了保證數據安全支付寶目前使用的是MD5簽名防止數據篡改機制。
在提交數據前須要將須要提交的數據以必定規則(見接口文檔)組裝成字符串,加上安全校驗碼(Key)組成一個新字符串,經過MD5生成一個32字節的簽名,咱們提交支付請求時還須要把這個簽名也提交過去。看一下表單源碼
支付寶接收到參數後會進行驗證請求參數的合法性,驗證無誤後將顯示支付頁面,不然提示錯誤。
3.2.2 如何驗證支付通知
在用戶支付完成後,支付寶會請求網站支付通知地址(這個地址應在建立支付請求時做爲參數傳遞過去)。返回參數列表參見標準支付寶交易服務接口(專用於防釣魚網站)。Pdf3.3.1.支付寶的返回數據中一樣有一個簽名串(採起和支付請求一樣的簽名方式),在支付通知文件中首先要對數據進行簽名驗證。除了驗證簽名,還須要將參數中的notify_id提交到支付寶的驗證網關支付寶系統這個通知的真實性,通知驗證。支付寶系統判斷通知是不是本身發送,若是是以字符串格式返回 true,不然返回false,咱們經過驗證服務器返回的數據驗證請求的真實性,若是都驗證經過則能夠進行更改訂單數據、給用戶發送郵件通知等操做。關於驗證簽名能夠看一下通知文件中的源碼。帶demo中將參數中的notify_id提交到支付寶是經過POST方式提交併取得返回數據,代碼片斷:
這裏重點就是fsockopen函數,在發送電子郵件時咱們已經接觸過,經過此函數打開套接字鏈接,相似於之前學過的fopen函數返回的是一個文件句柄,以後可使用文件函數( fgets()、fgetss()、fputs()、fclose() feof()等)對其進行操做,代碼中使用了fputs()(同fwrite())函數,寫入數據來模擬表單以POST方式提交數據,最後經過fgets()函數獲取返回的數據保存到數組中,最後進行驗證,具體參照源碼。