解析微信支付回撥資料
阿新 • • 發佈:2019-01-29
工作中的程式碼收藏
//解析方法
private NotifyVO parseWechatPayReq(HttpServletRequest request){
StringBuffer sb = new StringBuffer();
String s;
Map<String, String> m = Maps.newHashMap();
Map<String, String> packageParams;
Iterator it;
//以下的邏輯過於繁瑣,待之後優化
try {
InputStream inputStream = request.getInputStream();
try (BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, PayConstants.DEFAULT_ALIPAY_CHARSET))) {
while ((s = in.readLine()) != null) {
sb.append(s);
}
in.close();
}
inputStream.close();
}catch (Exception e){
logger.error( "" , e);
return null;
}
// sb.append("<xml ><appid><![CDATA[wx781f4bed3533eae2]]></appid><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[1]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[N]]></is_subscribe><mch_id><![CDATA[1486513082]]> </mch_id><nonce_str><![CDATA[a5f1bb06fcec45f8af9273a21b81f94d]]></nonce_str><openid><![CDATA[ol9JYxEnSoPxTo0QefMzgaP_XQhs]]></openid><out_trade_no><![CDATA[PY20170811200344]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[8C2065C450699051424A5823342E6D5B]]></sign><time_end><![CDATA[20170811200404]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[APP]]></trade_type><transaction_id><![CDATA[4000822001201708115713282477]]></transaction_id></xml>");
logger.info("====================jsapi支付回掉引數:" + sb.toString());
//解析xml成map
m = XMLUtil.doXMLParse(sb.toString());
//過濾空 設定 TreeMap
packageParams = new TreeMap<String, String>();
it = m.keySet().iterator();
while (it.hasNext()) {
String parameter = (String) it.next();
String parameterValue = m.get(parameter);
String v = "";
if (null != parameterValue) {
v = parameterValue.trim();
}
packageParams.put(parameter, v);
}
String sign = packageParams.get("sign");
packageParams.remove("sign");
if (!makeH5Sign(packageParams).equals(sign)) {
//驗籤失敗
return null;
}
NotifyVO notifyVO = new NotifyVO();
if (packageParams.get("return_code").equals("SUCCESS") && packageParams.get("result_code").equals("SUCCESS")) {
//交易成功
notifyVO.setTrade_status("1");
String out_trade_no = packageParams.get("out_trade_no");
notifyVO.setTrade_no(packageParams.get("transaction_id"));//微信支付訂單號
notifyVO.setOut_trade_no(out_trade_no);//商戶訂單號 - 票友訂單號
String total_fee = packageParams.get("total_fee");
String fee = (Integer.parseInt(total_fee) / 100.0)+"";
notifyVO.setTotal_fee(fee);
}else{
notifyVO.setTrade_status("0");
}
notifyVO.setDetail_json(JSON.toJSONString(packageParams));
return notifyVO;
}
//簽名
public String makeH5Sign(Map<String, String> paramsMap) {
List<String> sorParams = new ArrayList<>();
for (Map.Entry<String, String> me : paramsMap.entrySet()) {
sorParams.add(me.getKey());
}
Collections.sort(sorParams);
// Arrays.sort(params);//按字典順序排列
//按照引數名ASCII字典序排序
StringBuilder combineParams = new StringBuilder();
for (String param : sorParams) {
combineParams.append(param).append("=").append(paramsMap.get(param)).append("&");
}
combineParams.delete(combineParams.length() - 1, combineParams.length());
//拼接API金鑰:
StringBuilder combineKey = new StringBuilder();
combineKey.append(combineParams.toString()).append("&key=").append(PayConstants.JSAPI_PAY_MCH_SECRET);
//Make Sign
String sign = MD5Util.MD5(combineKey.toString());
return sign;
}
xmlUtil
import com.google.common.collect.Maps;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @Description: XMLUtil
* @Author: lin.shi
* @CreateTime: 2017-08-10 16:47
*/
public class XMLUtil {
/**
* 解析xml,返回第一級元素鍵值對。如果第一級元素有子節點,則此節點的值是子節點的xml資料。
*
* @param strxml
* @return
* @throws IOException
*/
public static Map doXMLParse(String strxml) {
Document document = null;
try {
document = DocumentHelper.parseText(strxml);
} catch (DocumentException e) {
e.printStackTrace();
}
Element rootElement = document.getRootElement();
@SuppressWarnings("unchecked")
List<org.dom4j.Element> elements = rootElement.elements();
Map<String, String> map = Maps.newHashMap();
for (org.dom4j.Element element : elements) {
map.put(element.getName(), element.getText());
}
return map;
}
}