[前車之賤] 7天準(cai)備(keng)支付專案,5分鐘教會你

leontung發表於2017-08-21

專案背景

最近我在為我公司優達學城的支付專案重構做準備,不可避免的需要對接支付寶和微信。
由於在調研和寫demo的過程中,遇到了很多的問題,除了官方文件,網上的資料又十分稀缺(特別是對於Java, PHP和.Net以外的語言,因為沒有官方提供的SDK,所有邏輯都要自己寫,我使用的是Golang),因此寫下此文願能幫助到大家。如果有不正確和希望繼續補充的地方也希望在評論中指出。

方案選定

對於web應用來說,我採用了微信掃碼支付,支付寶電腦網站支付的方案。由於微信官方提供了兩種掃碼支付的方案,我選擇第二種,因為這樣就能和支付寶的的支付邏輯統一。

流程圖

流程說明

  1. 使用者下單。
  2. 伺服器收到請求,生成唯一的訂單號,並且帶上介面要求的引數和簽名,傳送請求。

    1. 支付簽名

      • 微信支付簽名我選擇MD5,我相信MD5各個語言都支援而且都很方便,這裡就不贅述。
      • 支付寶簽名推薦RSA2。這裡寫下Golang版本的核心簽名方法。

        // 使用sha256
        h := sha256.New()
        h.Write(data)
        d := h.Sum(nil)
        sign := rsa.SignPKCS1v15(rand.Reader, r.PrivateKey, crypto.SHA256, d)複製程式碼

        完整程式碼可以移步我的Gist

    2. 傳送請求
      • 微信和支付寶要求的都是POST請求。文件沒有直接說明是POST還是其他方法,我是通過閱讀文件提供的demo的程式碼和原始碼知道的,在開發支付寶的時候我一直以為是GET請求,所有的引數都是param,導致我浪費了挺多時間
      • 微信的Post Body是xml格式,到統一下單的API,注意帶上headerContent-Type: text/xml
      • 支付寶的POST Body是Form表單,我的測試是以x-www-form-urlencoded的形式提交,能夠獲得正確的響應。
  3. 將支付供應商的返回的資料(支付寶是HTML程式碼;微信是二維碼連結,需要根據連結內容生成二維碼)在前端渲染顯示給使用者。
  4. 使用者支付訂單,然後使用者的支付App會通知支付供應商的伺服器。
  5. 使用者支付成功,支付供應商會呼叫商戶提供的回撥API,通知使用者是否支付成功。(如果支付失敗,需要呼叫訂單關閉介面)。
  6. 驗證呼叫的請求是否合法,處理內部邏輯,並且返回對應的響應,支付供應商會根據響應決定是否再次傳送回撥請求。
  7. 如有需要,可以呼叫訂單查詢API,檢查訂單狀態。

沙盒模式測試(重要)

  1. 支付寶的沙盒模式,你必須先下載支付寶提供的沙盒模式的App才能測試。還可以參考論壇上這篇《如何使用沙箱環境測試手機網站》
  2. 微信的沙盒模式,必須按照驗收文件的步驟來做。我有一段時間發現自己不管怎麼樣都無法測試成功,後面在一個地方看到,必須用驗收文件的金額來測試,也就是3.01元。

付款金額單位差異(重要)

  • 微信的單位是分,因此3.01元,提交的時候應該是301。我一直沒注意這個,結果沙盒測試時候一直過不了。最後知道是這個原因的時候,我給自己灌了一瓶82年的可樂。我只能怪自己太年輕。

  • 支付寶單位為元,精確到小數點後兩位,取值範圍[0.01,100000000]。

總結

  • 在做支付開發的時候,先仔細閱讀文件,想清楚步驟再開發。磨刀不誤砍柴工。
  • 支付寶和微信支付的開發團隊如果看到這篇文章,希望能把文件再潤色一下。文件不是給開發者設定障礙,而是提供幫助,讓開發者快速完成開發。

小福利

人工智慧anywhere的時代,我們不希望若干年後的30歲是否要轉行不再寫程式碼,我們不希望糾結於40歲因為落伍而被時代淘汰。我們都希望過上自己喜歡的生活打王者去旅行。那就讓我們一起來組隊學習Google認證的機器學習,不再做程式碼的“搬運工”,能夠把握未來的是現在的你。

相關文章