專案背景
最近我在為我公司優達學城的支付專案重構做準備,不可避免的需要對接支付寶和微信。
由於在調研和寫demo的過程中,遇到了很多的問題,除了官方文件,網上的資料又十分稀缺(特別是對於Java, PHP和.Net以外的語言,因為沒有官方提供的SDK,所有邏輯都要自己寫,我使用的是Golang),因此寫下此文願能幫助到大家。如果有不正確和希望繼續補充的地方也希望在評論中指出。
方案選定
對於web應用來說,我採用了微信掃碼支付,支付寶電腦網站支付的方案。由於微信官方提供了兩種掃碼支付的方案,我選擇第二種,因為這樣就能和支付寶的的支付邏輯統一。
流程圖
流程說明
- 使用者下單。
伺服器收到請求,生成唯一的訂單號,並且帶上介面要求的引數和簽名,傳送請求。
支付簽名
- 傳送請求
- 微信和支付寶要求的都是POST請求。文件沒有直接說明是POST還是其他方法,我是通過閱讀文件提供的demo的程式碼和原始碼知道的,在開發支付寶的時候我一直以為是GET請求,所有的引數都是param,導致我浪費了挺多時間。
- 微信的Post Body是xml格式,到統一下單的API,注意帶上header
Content-Type: text/xml
。 - 支付寶的POST Body是Form表單,我的測試是以
x-www-form-urlencoded
的形式提交,能夠獲得正確的響應。
- 將支付供應商的返回的資料(支付寶是HTML程式碼;微信是二維碼連結,需要根據連結內容生成二維碼)在前端渲染顯示給使用者。
- 使用者支付訂單,然後使用者的支付App會通知支付供應商的伺服器。
- 使用者支付成功,支付供應商會呼叫商戶提供的回撥API,通知使用者是否支付成功。(如果支付失敗,需要呼叫訂單關閉介面)。
- 驗證呼叫的請求是否合法,處理內部邏輯,並且返回對應的響應,支付供應商會根據響應決定是否再次傳送回撥請求。
- 如有需要,可以呼叫訂單查詢API,檢查訂單狀態。
沙盒模式測試(重要)
- 支付寶的沙盒模式,你必須先下載支付寶提供的沙盒模式的App才能測試。還可以參考論壇上這篇《如何使用沙箱環境測試手機網站》。
- 微信的沙盒模式,必須按照驗收文件的步驟來做。我有一段時間發現自己不管怎麼樣都無法測試成功,後面在一個地方看到,必須用驗收文件的金額來測試,也就是3.01元。
付款金額單位差異(重要)
微信的單位是分,因此3.01元,提交的時候應該是301。我一直沒注意這個,結果沙盒測試時候一直過不了。最後知道是這個原因的時候,我給自己灌了一瓶82年的可樂。我只能怪自己太年輕。
支付寶單位為元,精確到小數點後兩位,取值範圍[0.01,100000000]。
總結
- 在做支付開發的時候,先仔細閱讀文件,想清楚步驟再開發。磨刀不誤砍柴工。
- 支付寶和微信支付的開發團隊如果看到這篇文章,希望能把文件再潤色一下。文件不是給開發者設定障礙,而是提供幫助,讓開發者快速完成開發。
小福利
在人工智慧anywhere的時代,我們不希望若干年後的30歲是否要轉行不再寫程式碼,我們不希望糾結於40歲因為落伍而被時代淘汰。我們都希望過上自己喜歡的生活打王者去旅行。那就讓我們一起來組隊學習Google認證的機器學習,不再做程式碼的“搬運工”,能夠把握未來的是現在的你。