JAVA微信支付接口開發——支付


微信支付接口開發——支付

這幾天在做支付服務,系統接入了支付寶、微信、銀聯三方支付接口。個人感覺支付寶的接口開發較為簡單,並且易於測試。
關於數據傳輸,微信是用xml,所以需要對xml進行解析。

1、微信支付的幾種接口

微信支付開發文檔

付款碼支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付。幾種支付方式都是大同小異。


2、支付流程

基於APP支付來說,微信支付的大體流程:
1、APP客戶端根據用戶支付請求,將訂單信息(訂單號,金額等)傳至后台服務器
2、后台服務器根據訂單信息,拼裝微信統一下單接口需要的請求參數。其中比較重要的參數為appidmch_idnonce_strsignout_trade_nototal_feenotify_url

這里參數拼裝需要根據微信提供的簽名算法
假設請求參數為:

"appid":"wxd930ea5d5a258f4f"
"mch_id":"10000100"
"body":"test"
"nonce_str":"ibuaiVcKdpRxkhJA"

需要將以上參數按照規則先拼裝成String

  1. key值按照ASCII從小到大排序(A->Z),key=value形式並用&連接
String a = "appid=wxd930ea5d5a258f4f&mch_id=10000100&body=test&nonce_str=ibuaiVcKdpRxkhJA"
  1. 拼接API密鑰 key 是商戶平台設置的密鑰key
signStr = a + "&key=192006250b4c09247ec02edce69f6a2d"
  1. 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_codereturn_msg
return_code只有SUCCESSFAIL,這是通信成功與否的標識,非業務標識。
只有return_codeSUCCESS時,才會有其他數據返回包括result_code,sign等。
result_code業務標識也同樣為SUCCESS時候才說明微信方預付單生成成功。
這時會返回我們支付業務需要的prepay_id預支付會話id。
注意: 這里需要我們進行sign簽名驗證,以保證數據安全性

4、將通過驗簽的prepay_id等信息返回給APP客戶端。此時APP端可以調起支付接口
調起了微信支付窗口,讓用戶完成支付操作。
然后微信端會根據之前設置的notify_url異步通知地址,進行調用。通知服務端支付情況。

5、異步通知接口調用

3、總結

微信支付接口開發還涉及到訂單的相關業務(查詢,關閉),以及退款等相關業務。
微信支付主要需要先了解其業務流程,然后就是調用微信支付的接口,其中就是參數的拼裝與驗簽。這部分可以抽取成一個工具類,比如mapToXml(),xmlToMap(),md5()等等。最后根據接口文檔中返回的數據判斷進行業務操作。
最后吐槽一下,微信測試號沒有提供支付測試環境,需要真實的服務號。


免責聲明!

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



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