說明:這里只涉及到微信支付和淘寶支付
以官網的接口為准,主要關注【網關】、【接口】、【參數】【加密方式】【簽名】【回調】
第一步,了解自己的項目要集成的支付方式
常見的有掃碼支付、網頁支付、APP支付。
第二步,了解支付商(微信/支付寶)的支付接口
微信和支付寶的接口所需要的參數內容大致是一樣的,不同的在於參數名,簽名方式不一樣
其中掃碼支付和網頁支付的接口是同一個,因為網頁支付是可以通過APP掃碼支付和登錄支付賬號進行支付的;而APP支付的接口是另一個
微信支付開發流程:
關鍵的配置參數有:【支付網關】、【appid】、【私鑰】、【簽名方式】、【回調地址】、【商戶號】、【簽名】
支付參數有:【訂單號】、【訂單金額】、【訂單描述】
微信的簽名方式目前規定使用的是MD5;
回調地址:POST請求方式,必須是公網可訪問(可以是IP也可以是域名),不能帶任何參數、回調的參數要以流的方式進行接收,且為XML格式;
私鑰:用於簽名,簽名的目的就是加密數據,防止交易數據被篡改。
流程
- 打包參數(根據統一下單接口的要求提供必需參數)
所有參數以key=value方式存在,各參數之間&方式連接,最后用私鑰進行MD5加密,然后將得到的簽名以sgin為key放入到參數的最后面,並轉為XML格式字符串。
- 統一下單
(1) 這一步最主要的用途就是得到支付接口所需要的prepay_id
(2) 以POST方式發送http請求,所有參數要轉為XML格式串
- 打包參數(根據支付接口的要求提供必需參數)
所有參數以key=value方式存在,各參數之間&方式連接,最后用私鑰進行MD5加密,然后將得到的簽名以sgin為key放入到參數的最后面。
- 調用支付接口
支付寶支付開發流程:
- 支付寶比微信要簡單些,因為支付寶對簽名進行了封裝,只需要把參數打包,調用方式就進行了簽名等必要操作(微信支付也可以按此方式自己進行封裝),返回的串可以直接給支付接口。
- 封裝的接口有sdkExecute和pageExecute,當支付方式為APP時,調用sdkExecute,當為NATIVE時調用pageExecute
- 簽名:使用RSA2
開發時遇到的問題(微信的要仔細些,坑多)
- 因參數名不對,導致失敗
微信的一個坑:微信的統一下單與支付接口,某些參數名不一樣,而實際表示的內容是一樣的。
比如商戶號:統一下單中是mch_id,而支付接口中是partnerid
- 因簽名加密方式不對,導致失敗
微信的一個坑:微信提供的demo中,如果不是沙箱環境,就使用HMACSHA256的加密方式進行簽名,而實際生產環境中是要使用MD5的,且兩次加密的方式必需一致。MD5加密后的串是32位,HMACSHA256加密后的串是64位,可以通過這個差別來判斷出前后簽名使用的加密方式是否一致。
- 回調處理業務邏輯
回調時要做的幾件事:
- 驗證簽名
- 簽名驗證通過后,再進行訂單號,商戶號,訂單金額,appid的一致性驗證
參數名不一樣:因為我開始是將微信和支付寶的回調處理業務邏輯放在一起的,而微信和支付寶返回的參數名是不一樣的,所以最好還是分開處理
訂單金額單位不一樣:微信是分,支付寶是元。所以在處理時,我統一將單位換算為分,那么在接收訂單金額時,支付寶返回的就有可能是帶小數點的,在處理時就用到了Double去處理,Double處理后的數據是帶了小數點,我當時在做訂單金額比較時,先用Integer對數據進行轉換后再相減,Integer對帶了小數點的數字是轉換不了的(而且當時后台程序也沒報錯),所以這里要注意,后面我統一使用的是Double