工作中的代码收藏
//解析方法
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;
}