package com.xzx.gc.util.pay.util;
import com.xzx.gc.model.admin.UserAccountModel;
import com.xzx.gc.util.pay.util.entity.ResultEntity;
import com.xzx.gc.util.pay.util.entity.TransfersDtoAdmin;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
@Slf4j
public class WechatpayUtil
{
public static String queryErrorMessage(String xmlStr){
Document document = StringTOXml(xmlStr);
String nodePath = "/xml/err_code_des";
String msg = getNodeValue(document,nodePath);
return msg;
}
/**
*
* @param
* @return Document 对象
*/
public static Document StringTOXml(String str) {
StringBuilder sXML = new StringBuilder();
sXML.append(str);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc = null;
try {
InputStream is = new ByteArrayInputStream(sXML.toString().getBytes("utf-8"));
doc = dbf.newDocumentBuilder().parse(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}
/**
*
* @param document
* @return 某个节点的值 前提是需要知道xml格式,知道需要取的节点相对根节点所在位置
*/
public static String getNodeValue(Document document, String nodePaht) {
XPathFactory xpfactory = XPathFactory.newInstance();
XPath path = xpfactory.newXPath();
String servInitrBrch = "";
try {
servInitrBrch = path.evaluate(nodePaht, document);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return servInitrBrch;
}
public static void main(String[] args) {
String xmlStr = "\n" +
"\n" +
"\n" +
"\n" +
"\n" +
"\n" +
"\n" +
"\n" +
"";
String message = queryErrorMessage(xmlStr);
System.out.println(message);
}
/**
* @param model
* 微信接口请求参数DTO对象
* @return ResultEntity 返回结构体
*/
public static ResultEntity doTransfers(String url, String path, TransfersDtoAdmin model, UserAccountModel userAccount, String stringBuild)
{
try
{
// 3.加载证书请求接口
String result = HttpRequestHandler.httpsRequest(url, stringBuild,
model, path);
log.debug(("response xml = " + result));
if(result.contains("CDATA[FAIL]")){
String message = queryErrorMessage(result);
return new ResultEntity(false, message);
}
}
catch (Exception e)
{
e.printStackTrace();
return new ResultEntity(false, e.getMessage());
}
return new ResultEntity(true);
}
public static String getStringBuild(TransfersDtoAdmin model){
// 1.计算参数签名
String paramStr = createLinkString(model);
String mysign = paramStr + "&key=" + model.getAppkey();
String sign = DigestUtils.md5Hex(mysign).toUpperCase();
// 2.封装请求参数
StringBuilder reqXmlStr = new StringBuilder();
reqXmlStr.append("");
reqXmlStr.append("" + model.getMchid() + "");
reqXmlStr.append("" + model.getMch_appid() + "");
reqXmlStr.append("" + model.getNonce_str() + "");
reqXmlStr.append("" + model.getCheck_name() + "");
reqXmlStr.append("" + model.getOpenid() + "");
reqXmlStr.append("" + model.getAmount() + "");
reqXmlStr.append("" + model.getDesc() + "");
reqXmlStr.append("" + sign + "");
reqXmlStr.append("" + model.getPartner_trade_no() + "");
reqXmlStr.append("" + model.getSpbill_create_ip() + "");
reqXmlStr.append("");
log.debug("request xml = " + reqXmlStr);
return reqXmlStr.toString();
}
private static String createLinkString(TransfersDtoAdmin model)
{
// 微信签名规则 https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3
Map paramMap = new HashMap();
// 订单号默认用商户号+时间戳+4位随机数+可以根据自己的规则进行调整
model.setAppkey(model.getAppkey());
model.setNonce_str(WechatpayUtil.getNonce_str());
model.setPartner_trade_no(model.getMchid()
+ new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
+ (int)((Math.random() * 9 + 1) * 1000));
paramMap.put("mch_appid", model.getMch_appid());
paramMap.put("mchid", model.getMchid());
paramMap.put("openid", model.getOpenid());
paramMap.put("amount", model.getAmount());
paramMap.put("check_name", model.getCheck_name());
paramMap.put("desc", model.getDesc());
paramMap.put("partner_trade_no", model.getPartner_trade_no());
paramMap.put("nonce_str", model.getNonce_str());
paramMap.put("spbill_create_ip", model.getSpbill_create_ip());
List keys = new ArrayList(paramMap.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++ )
{
String key = keys.get(i);
Object value = (Object)paramMap.get(key);
if (i == keys.size() - 1)
{// 拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
}
else
{
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
private static String getNonce_str()
{
String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 15; i++ )
{
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
}