在線支付接口詳解


    當我們在商城購物時,可能會用到在線支付,你會發現無論你是哪個銀行的銀行卡接口中都會支持,在做項目開發時,也經常會用到支付接口,我們當然希望支持所 有的網銀,但這需要我們針對每個銀行開發一套接口嗎?不是不可以而是沒必要,使用第三方的支付接口就可以滿足,第三方支付平台已經與各大銀行進行簽約,網 站主只需要在此平台申請一個賬號即可支持幾乎所有的種類的銀行卡信用卡的交易,當然是可能支付少量的手續費的。什么是第三方支付呢?

 

    所謂第三方支付,就是一些和各大銀行簽約、並具備一定實力和信譽保障的第三方獨立機構提供的交易支持平台。在通過第三方支付平台的交易中,買方選購商品后,使用第三方平台提供的賬戶進行貨款支付,由第三方通知賣家貨款到達。

    目前提供第三方支付的機構很多,常見的有支付寶、財付通、快錢、網銀在線、易寶支付、雲網等各大支付平台。網站如果需要實現第三方支付首先應該向 第三方支付平台申請一個賬號並簽署協議,協議生效后第三方支付平台將為其開通在線支付功能,通過程序將接口集成到網站中。

第三方支付原理圖:
在線支付原理圖
以上簡要說明了支付過程,當然其中省略了一些步驟(比如購物車,訂單等),我們重點來看支付流程。

1用戶向商城網站發起確認訂單的請求

2商城網站接收到請求保存訂單數據到數據庫或其他存儲介質

3返回訂單確認頁面,頁面上應該顯示訂單金額等信息

4用戶確認支付,發起支付請求。注:支付請求是發送到支付網關(比如支付寶、網銀在線)而不是發送到商城網站。

5顯示支付頁面

6用戶填寫認證信息(賬號密碼等)提交

7這里有兩個步驟一個是扣款成功后頁面跳轉到支付結果頁面(展示給用戶),另一個是支付通知,這兩步沒有先后順序可能同時執行,商城網站接收到支付通知后根據驗證規則驗證信息的有效性,並作出相應的更改操作(例:有效則更改訂單為已付款狀態,無效則記錄非法請求信息)。

    以支付寶為例:如果實現在網站中集成支付寶接口,首先要有一個支付寶賬號,接下來向支付寶申請在線支付業務,簽署協議。協議生效后有支付寶一方會 給網站方一個合作伙伴ID,和安全校驗碼,有了這兩樣東西就可以按照支付寶接口文檔開發支付寶接口了,在上圖的幾個步驟中只有4和7兩個步驟在商城與支付 網關之間有信息交互。在步驟4中指將數據發送到支付網關(支付寶),在步驟7中是的通知驗證部分,驗證網關請求網站某地址,網站按驗證規則對信息進行驗證 記錄並作出響應,我們幾乎在開發任何支付接口時,重點是這兩部分的開發,明白支付接口原理,開發在線支付接口就不難了。

    支付寶目前提供了,擔保交易、標准即時到帳、雙功能等幾種接口,只是在功能上有些差異,網站集成方式是一樣的。以標准即時到帳接口為例,在與支付寶簽署協議后,還需要幾個步驟才能完成集成。
支付寶接口集成步驟
進入支付寶后台在商家服務菜單下有兩個鏈接:
支付寶商家服務
分別可以查詢到PID和Key,依次點擊我的產品,技術服務將會顯示:
自助集成支付寶
選擇“我要自助集成”接下來會看到下載技術文檔的鏈接,點擊下載技術文檔。

    在下載后的文件中有標准支付寶交易服務接口、商家工具、接口集成指南等接文檔,另外還有幾種語言寫的demo。我們可以根據接口文檔按規則全新開 發,也可以再demo基礎上修改集成到網站,需要注意的是開發支付接口需要在公網(服務器必須可以通過外網訪問)才可以完成整個調試過程,如果服務器在外 網訪問不到,則無法接收到支付通知。

看一下demo中每個文件的作用:

  ├alipay_notify.php┈┈┈┈支付寶通知處理類文件

  ├alipay_service.php ┈┈┈支付寶請求處理類文件

  ├alipay_config.php┈┈┈┈┈┈基礎信息配置文件

  ├index.php┈┈┈┈┈┈┈┈┈┈快速付款入口模板文件

  ├notify_url.php ┈┈┈┈┈┈┈服務器異步通知頁面文件

  ├return_url.php ┈┈┈┈┈┈┈頁面跳轉同步通知文件

這里已經下載好了(會附加在本文附件中),為了便於調試增加修改了若干文件,並增加了一張數據表保存訂單信息(見附件),我們修改一下配置文件完成一個測試過程。

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目錄)。我們先測試一下:

下訂單頁面
點擊“下訂單”按鈕

確認訂單頁面
根據上圖的流程現在已經走到了步驟3,此時已經生成了訂單號(為了便於測試使用了時間戳作為訂單號),並且將訂單信息寫入到數據庫。我們看一下數據庫:
訂單頁面
數據庫中增加了一條“訂單信息”。

如果點擊“確認支付”按鈕或者確認支付 鏈接將會跳轉到支付寶頁面,點擊按鈕時通過表單POST方式將信息提交到支付網關,由於支付請求數據無需讓用戶看到,這里都寫在隱藏域中了。確認支付 鏈接是通過URL傳參,因為支付寶接口允許以POST或者GET方式提交,所以兩種方式都可以。把參數提交給支付網關后,頁面跳轉到到支付頁面。我們看到 如下圖所示:

支付寶支付頁面

我們看到支付寶為我們提供了兩種支付方式,一種是通過支付寶賬戶支付,另一種是通過銀行卡支付。例如選擇使用銀行卡支付,填寫郵箱或手機號即可跳轉到下一 個頁面進行選擇銀行,支付寶幾乎支持所有的銀行卡支付,同時有信用卡和網點方式付款,選擇對應的銀行下一步按提示付款即可。付款完成后頁面會返回到我們在 配置文件中配置的$return_url地址,同時“訂單狀態”也會發生改變。

付款成功后訂單狀態

注:測試時如果沒有在外網測試(即支付通知地址無法在外網訪問)則支付通知無法被請求到,無法自動完成訂單狀態的修改。
      也有的開發者在瀏覽器的跳轉頁面做訂單狀態的更改(不推薦這樣做,因為瀏覽器端服務器無法控制,比如突然斷網,瀏覽器關閉等)

支付寶接口規范可參考附件和示例文件,里面已經有了比較詳細的說明,比如要對支付通知進行響應等。

如何創建支付請求?

    在前面的測試中我們點擊了“確認支付”將信息將信息提交到了支付寶的支付網關,我們可以思考一下應該發送哪些參數給支付網關。關於請求參數列表可 以參考附件中的標准支付寶交易服務接口(專用於防釣魚網站).Pdf中的3.2.2。需要注意的是並不是我們把這些參數原封不動的提交到支付寶就可以了, 為了保證數據安全支付寶目前使用的是MD5簽名防止數據篡改機制。

    在提交數據前需要將需要提交的數據以一定規則(見接口文檔)組裝成字符串,加上安全校驗碼(Key)組成一個新字符串,通過MD5生成一個32字節的簽名,我們提交支付請求時還需要把這個簽名也提交過去。看一下表單源碼

支付寶支付表單

支付寶接收到參數后會進行驗證請求參數的合法性,驗證無誤后將顯示支付頁面,否則提示錯誤。

如何驗證支付通知?

在用戶支付完成后,支付寶會請求網站支付通知地址(這個地址應在創建支付請求時作為參數傳遞過去)。返回參數列表參見標准支付寶交易服務接口(專用於防釣 魚網站).Pdf3.3.1。支付寶的返回數據中同樣有一個簽名串(采取和支付請求同樣的簽名方式),在支付通知文件中首先要對數據進行簽名驗證。除了驗 證簽名,還需要將參數中的notify_id提交到支付寶的驗證網關支付寶系統這個通知的真實性,通知驗證。支付寶系統判斷通知是否是自己發送,如果是以 字符串格式返回 true,否則返回false,我們通過驗證服務器返回的數據驗證請求的真實性,如果都驗證通過則可以進行更改訂單數據、給用戶發送郵件通知等操作。關於 驗證簽名可以看一下通知文件中的源碼。帶demo中將參數中的notify_id提交到支付寶是通過POST方式提交並取得返回數據,代碼片段:

支付寶處理支付通知代碼

這里重點就是fsockopen函數,在發送電子郵件時我們已經接觸過,通過此函數打開套接字連接,類似於以前學過的fopen函數返回的是一個文 件句柄,之后可以使用文件函數( fgets()、fgetss()、fputs()、fclose() feof()等)對其進行操作,代碼中使用了fputs()(同fwrite())函數,寫入數據來模擬表單以POST方式提交數據,最后通過 fgets()函數獲取返回的數據保存到數組中,最后進行驗證,具體參照附件中的源碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM