微信支付接口開發——支付
這幾天在做支付服務,系統接入了支付寶、微信、銀聯三方支付接口。個人感覺支付寶的接口開發較為簡單,並且易於測試。
關於數據傳輸,微信是用xml,所以需要對xml進行解析。
1、微信支付的幾種接口
付款碼支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付。幾種支付方式都是大同小異。
2、支付流程
基於APP支付來說,微信支付的大體流程:
1、APP客戶端根據用戶支付請求,將訂單信息(訂單號,金額等)傳至后台服務器
2、后台服務器根據訂單信息,拼裝微信統一下單接口需要的請求參數。其中比較重要的參數為appid
、mch_id
、nonce_str
、sign
、out_trade_no
、total_fee
、notify_url
。
這里參數拼裝需要根據微信提供的簽名算法
假設請求參數為:
"appid":"wxd930ea5d5a258f4f"
"mch_id":"10000100"
"body":"test"
"nonce_str":"ibuaiVcKdpRxkhJA"
需要將以上參數按照規則先拼裝成String
- key值按照ASCII從小到大排序(A->Z),key=value形式並用&連接
String a = "appid=wxd930ea5d5a258f4f&mch_id=10000100&body=test&nonce_str=ibuaiVcKdpRxkhJA"
- 拼接API密鑰 key 是商戶平台設置的密鑰key
signStr = a + "&key=192006250b4c09247ec02edce69f6a2d"
- MD5簽名(轉大寫) 注:微信默認為MD5簽名,也支持HMAC-SHA256簽名方式
sign=MD5(signStr).toUpperCase()
//最終得到sign = "9A0A8659F005D6984697E2CA0A9CF3B7"
然后sign繼續按照規則(A->Z)拼裝進String中。
java中可以用map完成排序
Map<String, String> paramsMap = new TreeMap<String, String>(String::compareTo);
paramsMap.put("appid", APP_APP_ID);
......
//完成簽名得到sign
paramsMap.put("sign",sign);
最后需要將參數轉化成xml格式的string進行接口請求
<xml>
<appid>![CDATA[wxd930ea5d5a258f4f]]</appid>
<mch_id>![CDATA[10000100]]</mch_id>
<device_info>![CDATA[1000]]</device_info>
<body>![CDATA[test]]</body>
<nonce_str>![CDATA[ibuaiVcKdpRxkhJA]]</nonce_str>
<sign>![CDATA[9A0A8659F005D6984697E2CA0A9CF3B7]]</sign>
</xml>
3、微信支付統一下單的接口地址為:https://api.mch.weixin.qq.com/pay/unifiedorder
java中可以利用httpclient進行post調用。參數即之前拼接完成的帶sign簽名參數。
得到微信支付接口的返回值也同樣是xml格式的數據,需要我們將其轉成便於操作的map型數據。
返回的數據包含了return_code
、return_msg
。
return_code
只有SUCCESS
和FAIL
,這是通信成功與否的標識,非業務標識。
只有return_code
是SUCCESS
時,才會有其他數據返回包括result_code
,sign
等。
若result_code
業務標識也同樣為SUCCESS
時候才說明微信方預付單生成成功。
這時會返回我們支付業務需要的prepay_id
預支付會話id。
注意: 這里需要我們進行sign簽名驗證,以保證數據安全性
4、將通過驗簽的prepay_id
等信息返回給APP客戶端。此時APP端可以調起支付接口,
調起了微信支付窗口,讓用戶完成支付操作。
然后微信端會根據之前設置的notify_url
異步通知地址,進行調用。通知服務端支付情況。
5、異步通知接口調用
3、總結
微信支付接口開發還涉及到訂單的相關業務(查詢,關閉),以及退款等相關業務。
微信支付主要需要先了解其業務流程,然后就是調用微信支付的接口,其中就是參數的拼裝與驗簽。這部分可以抽取成一個工具類,比如mapToXml(),xmlToMap(),md5()等等。最后根據接口文檔中返回的數據判斷進行業務操作。
最后吐槽一下,微信測試號沒有提供支付測試環境,需要真實的服務號。