package com.dsh.app.util.pay.wechat;
|
|
import com.dsh.app.util.DateTimeHelper;
|
import com.dsh.app.util.pay.config.Config;
|
import org.jdom.Document;
|
import org.jdom.Element;
|
import org.jdom.JDOMException;
|
import org.jdom.input.SAXBuilder;
|
|
import java.io.ByteArrayInputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.*;
|
|
public class WXPayCommonUtil {
|
|
public static String CreateNoncestr(int length) {
|
String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
String res = "";
|
for (int i = 0; i < length; i++) {
|
Random rd = new Random();
|
res += chars.indexOf(rd.nextInt(chars.length() - 1));
|
}
|
return res;
|
}
|
|
public static String CreateNoncestr() {
|
String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
String res = "";
|
for (int i = 0; i < 16; i++) {
|
Random rd = new Random();
|
res += chars.charAt(rd.nextInt(chars.length() - 1));
|
}
|
return res;
|
}
|
|
|
/**
|
* 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
|
*
|
* @return boolean
|
*/
|
public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams) {
|
StringBuffer sb = new StringBuffer();
|
Set es = packageParams.entrySet();
|
Iterator it = es.iterator();
|
while (it.hasNext()) {
|
Map.Entry entry = (Map.Entry) it.next();
|
String k = (String) entry.getKey();
|
String v = (String) entry.getValue();
|
if (!"sign".equals(k) && null != v && !"".equals(v)) {
|
sb.append(k + "=" + v + "&");
|
}
|
}
|
|
sb.append("key=" + Config.WX_PAY_API_KEY);
|
|
//算出摘要
|
String mysign = WXMD5Util.MD5Encode(sb.toString(), characterEncoding).toLowerCase();
|
|
String tenpaySign = ((String) packageParams.get("sign")).toLowerCase();
|
|
return tenpaySign.equals(mysign);
|
}
|
|
|
/**
|
* @param characterEncoding 编码格式
|
* @param parameters 请求参数
|
* @return
|
* @Description:sign签名
|
*/
|
public static String createSign(String characterEncoding, SortedMap<Object, Object> parameters) {
|
StringBuffer sb = new StringBuffer();
|
Set es = parameters.entrySet();
|
Iterator it = es.iterator();
|
while (it.hasNext()) {
|
Map.Entry entry = (Map.Entry) it.next();
|
String k = (String) entry.getKey();
|
Object v = entry.getValue();
|
if (null != v && !"".equals(v)
|
&& !"sign".equals(k) && !"key".equals(k)) {
|
sb.append(k + "=" + v + "&");
|
}
|
}
|
sb.append("key=" + Config.WX_PAY_API_KEY);
|
String sign = WXMD5Util.MD5Encode(sb.toString(), "UTF-8").toUpperCase();
|
return sign;
|
}
|
|
/**
|
* @param parameters 请求参数
|
* @return
|
* @Description:将请求参数转换为xml格式的string
|
*/
|
public static String getRequestXml(SortedMap<Object, Object> parameters) {
|
StringBuffer sb = new StringBuffer();
|
sb.append("<xml>");
|
Set es = parameters.entrySet();
|
Iterator it = es.iterator();
|
while (it.hasNext()) {
|
Map.Entry entry = (Map.Entry) it.next();
|
String k = (String) entry.getKey();
|
String v = (String) entry.getValue();
|
if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)) {
|
sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
|
} else {
|
sb.append("<" + k + ">" + v + "</" + k + ">");
|
}
|
}
|
sb.append("</xml>");
|
return sb.toString();
|
}
|
|
/**
|
* @param return_code 返回编码
|
* @param return_msg 返回信息
|
* @return
|
* @Description:返回给微信的参数
|
*/
|
public static String setXML(String return_code, String return_msg) {
|
|
|
return "<xml><return_code><![CDATA[" + return_code
|
+ "]]></return_code><return_msg><![CDATA[" + return_msg
|
+ "]]></return_msg></xml>";
|
|
}
|
|
|
public static Map<String, String> decodeXml(String content) {
|
|
Map<String, String> xml = new HashMap<String, String>();
|
try {
|
//创建一个SAXBuilder对象
|
SAXBuilder saxBuilder = new SAXBuilder();
|
byte[] bytes = content.getBytes("UTF-8");
|
InputStream xmlInput = new ByteArrayInputStream(bytes);
|
//读取prop.xml资源
|
Document doc = saxBuilder.build(xmlInput);
|
//获取根元素(prop)
|
Element root = doc.getRootElement();
|
//获取根元素下面的所有子元素(mess)
|
List<Element> messList = root.getChildren();
|
for (Element element : messList) {
|
xml.put(element.getName(), element.getValue());
|
|
}
|
} catch (JDOMException e) {
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return xml;
|
}
|
|
|
public static SortedMap<Object, Object> appParam(String content) {
|
|
String sign = "";
|
Boolean status = false;
|
SortedMap<Object, Object> params = new TreeMap<>();
|
Map<String, String> maps = decodeXml(content);
|
for (Map.Entry<String, String> item : maps.entrySet()) {
|
if (item.getKey().equals("result_code") && item.getValue().equals("SUCCESS")) {
|
status = true;
|
}
|
maps.put(item.getKey(), item.getValue());
|
System.out.println(item.getKey() + "-------" + item.getValue());
|
}
|
if (status) {
|
maps.remove("return_code");
|
maps.remove("return_msg");
|
maps.remove("result_code");
|
maps.remove("sign");
|
maps.remove("trade_type");
|
maps.put("partnerid", maps.get("mch_id"));
|
maps.remove("mch_id");
|
maps.put("timestamp", DateTimeHelper.formatDateTimetoString(DateTimeHelper.getWXTime(), DateTimeHelper.FMT_yyyyMMddHH_noseparator));
|
maps.put("package", "Sign=WXPay");//默认sign=WXPay
|
maps.put("noncestr", maps.get("nonce_str"));
|
maps.remove("nonce_str");
|
maps.put("prepayid", maps.get("prepay_id"));
|
maps.remove("prepay_id");
|
params = new TreeMap<>(maps);
|
String signAgain = WXPayCommonUtil.createSign("UTF-8", params);//再次生成签名
|
System.out.println("+二次签名+" + signAgain);
|
params.put("sign", signAgain);
|
}
|
return params;
|
}
|
|
|
}
|