记得上下班打卡 | git大法好,push需谨慎

Commit e56d8f2f authored by anjiabin's avatar anjiabin

提交支付查询

parent 91ecf13e
...@@ -5,10 +5,10 @@ import com.liquidnet.service.base.ResponseDto; ...@@ -5,10 +5,10 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.strategy.IPayChannelStrategy; import com.liquidnet.service.dragon.channel.strategy.IPayChannelStrategy;
import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler; import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler;
import com.liquidnet.service.dragon.channel.wepay.strategy.WepayStrategyContext; import com.liquidnet.service.dragon.channel.wepay.strategy.WepayStrategyContext;
import com.liquidnet.service.dragon.channel.wepay.util.WepayUtil;
import com.liquidnet.service.dragon.constant.DragonConstant; import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto; import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto; import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.utils.PayWepayUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -46,7 +46,7 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy { ...@@ -46,7 +46,7 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
InputStream inputStream = request.getInputStream();// 从request中取得输入流 InputStream inputStream = request.getInputStream();// 从request中取得输入流
Map<String, String> notifyMap = new HashMap<String, String>(); Map<String, String> notifyMap = new HashMap<String, String>();
try { try {
notifyMap = WepayUtil.parseXml(inputStream); notifyMap = PayWepayUtils.parseXml(inputStream);
log.info("dragonNotify-->wepay json : {}", JSON.toJSONString(notifyMap)); log.info("dragonNotify-->wepay json : {}", JSON.toJSONString(notifyMap));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
......
...@@ -4,7 +4,6 @@ import com.liquidnet.commons.lang.util.DateUtil; ...@@ -4,7 +4,6 @@ import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.wepay.resp.WepayPayRespDto; import com.liquidnet.service.dragon.channel.wepay.resp.WepayPayRespDto;
import com.liquidnet.service.dragon.channel.wepay.strategy.IWepayStrategy; import com.liquidnet.service.dragon.channel.wepay.strategy.IWepayStrategy;
import com.liquidnet.service.dragon.channel.wepay.util.WepayUtil;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto; import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto; import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.utils.PayWepayUtils; import com.liquidnet.service.dragon.utils.PayWepayUtils;
...@@ -44,10 +43,11 @@ public abstract class AbstractWepayStrategy implements IWepayStrategy { ...@@ -44,10 +43,11 @@ public abstract class AbstractWepayStrategy implements IWepayStrategy {
//追加请求参数 //追加请求参数
SortedMap<String, Object> parameters = appendRequestParam(commonParams); SortedMap<String, Object> parameters = appendRequestParam(commonParams);
//生成签名 //生成签名
String sign = WepayUtil.getSign(parameters,parentKey); String sign = PayWepayUtils.getInstance().createSign(parameters);
parameters.put("sign", sign); parameters.put("sign", sign);
//构造支付请求xml //构造支付请求xml
String data = WepayUtil.mapToXml(parameters); String data = PayWepayUtils.getInstance().getRequestXml(parameters);
HttpPost httpost = new HttpPost(this.getRequestUrl()); HttpPost httpost = new HttpPost(this.getRequestUrl());
httpost.setEntity(new StringEntity(data, "UTF-8")); httpost.setEntity(new StringEntity(data, "UTF-8"));
......
package com.liquidnet.service.dragon.channel.wepay.util; //package com.liquidnet.service.dragon.channel.wepay.util;
//
import com.liquidnet.commons.lang.util.StringUtil; //import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.dragon.channel.wepay.config.WeixinConfigUtil; //import com.liquidnet.service.dragon.channel.wepay.req.WepayPrePayReq;
import com.liquidnet.service.dragon.channel.wepay.req.WepayPrePayReq; //import lombok.extern.slf4j.Slf4j;
import lombok.extern.slf4j.Slf4j; //import org.dom4j.Document;
import org.dom4j.Document; //import org.dom4j.Element;
import org.dom4j.Element; //import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXReader; //import org.slf4j.Logger;
import org.slf4j.Logger; //import org.slf4j.LoggerFactory;
import org.slf4j.LoggerFactory; //
//import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.HttpsURLConnection; //import java.io.IOException;
import java.io.IOException; //import java.io.InputStream;
import java.io.InputStream; //import java.io.InputStreamReader;
import java.io.InputStreamReader; //import java.io.OutputStream;
import java.io.OutputStream; //import java.net.MalformedURLException;
import java.math.BigDecimal; //import java.net.URL;
import java.net.MalformedURLException; //import java.util.*;
import java.net.URL; //
import java.util.*; ///**
// * @author AnJiabin <anjiabin@zhengzai.tv>
/** // * @version V1.0
* @author AnJiabin <anjiabin@zhengzai.tv> // * @Description: TODO
* @version V1.0 // * @class: WepayUtil
* @Description: TODO // * @Package com.liquidnet.service.dragon.channel.wepay.util
* @class: WepayUtil // * @Copyright: LightNet @ Copyright (c) 2021
* @Package com.liquidnet.service.dragon.channel.wepay.util // * @date 2021/7/9 15:20
* @Copyright: LightNet @ Copyright (c) 2021 // */
* @date 2021/7/9 15:20 //@Slf4j
*/ //public class WepayUtil {
@Slf4j // private static final Logger logger = LoggerFactory.getLogger(WepayUtil.class);
public class WepayUtil { //
private static final Logger logger = LoggerFactory.getLogger(WepayUtil.class); // private WepayUtil() {
//
private WepayUtil() { // }
//
} // /**
// * 生成随机字符串
/** // *
* 微信被扫(扫码设备) // * @return
* // */
* @param outTradeNo // public static String getnonceStr() {
* @param body // Random random = new Random();
* @param totalAmount // StringBuilder nonceStrBuilder = new StringBuilder();
* @param spbillCreateIp // for (int i = 0; i < 31; i++) {
* @param authCode // nonceStrBuilder.append(random.nextInt(10));
* @return // }
*/ // return nonceStrBuilder.toString();
public static Map<String, Object> micropay(String outTradeNo, String body, BigDecimal totalAmount, String spbillCreateIp, String authCode) { // }
String nonce_str = getnonceStr(); //
Integer total_fee = totalAmount.multiply(BigDecimal.valueOf(100L)).intValue(); // /**
// * 转xml格式
SortedMap<String, Object> paramMap = new TreeMap<>(); // *
paramMap.put("appid", WeixinConfigUtil.appId); // * @param paramMap
paramMap.put("mch_id", WeixinConfigUtil.mch_id); // * @return
paramMap.put("nonce_str", nonce_str); // */
paramMap.put("sign_type", "MD5"); // public static String mapToXml(SortedMap<String, Object> paramMap) {
paramMap.put("body", body); // StringBuilder dataBuilder = new StringBuilder("<xml>");
paramMap.put("out_trade_no", outTradeNo); // for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
paramMap.put("total_fee", total_fee); // if (!StringUtil.isEmpty(entry.getValue())) {
paramMap.put("fee_type", "CNY"); // dataBuilder.append("<").append(entry.getKey()).append(">").append(entry.getValue()).append("</").append(entry.getKey()).append(">");
paramMap.put("spbill_create_ip", spbillCreateIp); // }
paramMap.put("auth_code", authCode); // }
paramMap.put("sign", getSign(paramMap, WeixinConfigUtil.partnerKey)); // dataBuilder.append("</xml>");
String data = mapToXml(paramMap); // logger.info("Map转Xml结果:{}", dataBuilder.toString());
logger.info("微信条码请求报文:{}", data); // return dataBuilder.toString();
Map<String, Object> resultMap = httpXmlRequest("https://api.mch.weixin.qq.com/pay/micropay", "POST", data); // }
logger.info("微信条码返回报文:{}", resultMap); //
if (resultMap == null || resultMap.isEmpty()) { // /**
return null; // * 发送xml数据,获取返回结果
} // *
SortedMap<String, Object> responseMap = new TreeMap<>(); // * @param requestUrl
responseMap.putAll(resultMap); // * @param requestMethod
String resultSign = getSign(responseMap, WeixinConfigUtil.partnerKey); // * @param xmlStr
if (resultSign.equals(resultMap.get("sign"))) { // * @return
resultMap.put("verify", "YES"); // */
} else { // public static Map<String, Object> httpXmlRequest(String requestUrl, String requestMethod, String xmlStr) {
logger.info("返回报文验签失败,返回报文签名:{},返回签名:{}", resultSign, resultMap.get("sign")); // // 将解析结果存储在HashMap中
resultMap.put("verify", "NO"); // Map<String, Object> map = new HashMap<String, Object>();
} // try {
return resultMap; // HttpsURLConnection urlCon = (HttpsURLConnection) (new URL(requestUrl)).openConnection();
} // urlCon.setDoInput(true);
// urlCon.setDoOutput(true);
/** // // 设置请求方式(GET/POST)
* 小程序支付 // urlCon.setRequestMethod(requestMethod);
* //
* @return // if ("GET".equalsIgnoreCase(requestMethod)) {
*/ // urlCon.connect();
public static Map<String, Object> appletPay(String outTradeNo, String body, BigDecimal totalAmount, String spbillCreateIp, String notifyUrl, String openid) { // }
String nonce_str = getnonceStr(); //
Integer totalFee = totalAmount.multiply(BigDecimal.valueOf(100L)).intValue(); // urlCon.setRequestProperty("Content-Length", String.valueOf(xmlStr.getBytes().length));
String tradeType = "JSAPI"; // urlCon.setUseCaches(false);
// // 设置为gbk可以解决服务器接收时读取的数据中文乱码问题
SortedMap<String, Object> paramMap = new TreeMap<>(); // if (null != xmlStr) {
paramMap.put("appid", WeixinConfigUtil.xAppId); // OutputStream outputStream = urlCon.getOutputStream();
paramMap.put("mch_id", WeixinConfigUtil.xMchId); // outputStream.write(xmlStr.getBytes("UTF-8"));
paramMap.put("nonce_str", nonce_str); // outputStream.flush();
paramMap.put("sign_type", "MD5"); // outputStream.close();
paramMap.put("body", body); // }
paramMap.put("out_trade_no", outTradeNo); // InputStream inputStream = urlCon.getInputStream();
paramMap.put("total_fee", totalFee); // InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
paramMap.put("spbill_create_ip", spbillCreateIp); // // 读取输入流
paramMap.put("notify_url", notifyUrl); // SAXReader reader = new SAXReader();
paramMap.put("trade_type", tradeType); // Document document = reader.read(inputStreamReader);
paramMap.put("openid", openid); // // 得到xml根元素
// if (goodsDetails != null && !goodsDetails.isEmpty()) { // Element root = document.getRootElement();
// List<SortedMap<String, Object>> goodList = new ArrayList<>(); // // 得到根元素的所有子节点
// for (RoncooPayGoodsDetails goodsDetail : goodsDetails) { // @SuppressWarnings("unchecked")
// SortedMap<String, Object> goodsDetailMap = new TreeMap<>(); // List<Element> elementList = root.elements();
// goodsDetailMap.put("goods_id", goodsDetail.getGoodsId()); // // 遍历所有子节点
// goodsDetailMap.put("quantity", goodsDetail.getNums()); // for (Element e : elementList) {
// goodsDetailMap.put("goods_name", goodsDetail.getGoodsName()); // map.put(e.getName(), e.getText());
// goodsDetailMap.put("price", goodsDetail.getSinglePrice()); // }
// goodList.add(goodsDetailMap); // log.info("微信查询返回结果:"+map.toString());
// } // inputStreamReader.close();
// JSONObject goodsDetailJson = new JSONObject(); // inputStream.close();
// goodsDetailJson.put("goods_detail", goodList); // inputStream = null;
// paramMap.put("detail", goodsDetailJson.toJSONString()); // urlCon.disconnect();
// } // } catch (MalformedURLException e) {
paramMap.put("sign", getSign(paramMap, WeixinConfigUtil.xPayKey)); // log.error(e.getMessage());
String data = mapToXml(paramMap); // } catch (IOException e) {
logger.info("微信小程序统一下单,请求报文:{}", data); // log.error(e.getMessage());
Map<String, Object> resultMap = httpXmlRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", data); // } catch (Exception e) {
logger.info("微信小程序统一下单,返回报文:{}", resultMap); // log.error(e.getMessage());
if (resultMap == null || resultMap.isEmpty()) { // }
return null; // return map;
} // }
SortedMap<String, Object> responseMap = new TreeMap<>(); //
responseMap.putAll(resultMap); // /**
String resultSign = getSign(responseMap, WeixinConfigUtil.xPayKey); // * 生成预支付XML
if (resultSign.equals(resultMap.get("sign"))) { // *
resultMap.put("verify", "YES"); // * @param WepayPrePayReq
} else { // * @param partnerKey
logger.info("返回报文验签失败,返回报文签名:{},返回签名:{}", resultSign, resultMap.get("sign")); // * @return
resultMap.put("verify", "NO"); // */
} // public static String getPrePayXml(WepayPrePayReq WepayPrePayReq, String partnerKey) {
return resultMap; //
} // getPrePaySign(WepayPrePayReq, partnerKey);// 生成预支付请求签名
//
/** // StringBuilder sb = new StringBuilder();
* 生成随机字符串 // sb.append("<xml><appid>").append(WepayPrePayReq.getAppid()).append("</appid>");
* // sb.append("<body>").append(WepayPrePayReq.getBody()).append("</body>");
* @return // sb.append("<device_info>").append(WepayPrePayReq.getDeviceInfo()).append("</device_info>");
*/ // sb.append("<mch_id>").append(WepayPrePayReq.getMchId()).append("</mch_id>");
public static String getnonceStr() { // sb.append("<nonce_str>").append(WepayPrePayReq.getNonceStr()).append("</nonce_str>");
Random random = new Random(); // sb.append("<notify_url>").append(WepayPrePayReq.getNotifyUrl()).append("</notify_url>");
StringBuilder nonceStrBuilder = new StringBuilder(); //// if (WeiXinTradeTypeEnum.NATIVE.name().equals(WepayPrePayReq.getTradeType())) {
for (int i = 0; i < 31; i++) { //// sb.append("<product_id>").append(WepayPrePayReq.getProductId()).append("</product_id>");
nonceStrBuilder.append(random.nextInt(10)); //// } else if (WeiXinTradeTypeEnum.JSAPI.name().equals(WepayPrePayReq.getTradeType())) {
} //// sb.append("<openid>").append(WepayPrePayReq.getOpenid()).append("</openid>");
return nonceStrBuilder.toString(); //// }
} // sb.append("<out_trade_no>").append(WepayPrePayReq.getOutTradeNo()).append("</out_trade_no>");
// sb.append("<spbill_create_ip>").append(WepayPrePayReq.getSpbillCreateIp()).append("</spbill_create_ip>");
/** // sb.append("<time_start>").append(WepayPrePayReq.getTimeStart()).append("</time_start>");
* 签名 // sb.append("<time_expire>").append(WepayPrePayReq.getTimeExpire()).append("</time_expire>");
* // sb.append("<total_fee>").append(WepayPrePayReq.getTotalFee()).append("</total_fee>");
* @param paramMap //// sb.append("<trade_type>").append(WepayPrePayReq.getTradeType().name()).append("</trade_type>");
* @param key // sb.append("<sign>").append(WepayPrePayReq.getSign()).append("</sign>");
* @return // sb.append("</xml>");
*/ //
public static String getSign(SortedMap<String, Object> paramMap, String key) { // return sb.toString();
StringBuilder signBuilder = new StringBuilder(); // }
for (Map.Entry<String, Object> entry : paramMap.entrySet()) { //
if (!"sign".equals(entry.getKey()) && !StringUtil.isEmpty(entry.getValue())) { // /**
signBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); // * 微信拼接签名参数
} // *
} // * @param appid 公众账号ID
signBuilder.append("key=").append(key); // * @param mch_id 商户号
logger.info("微信待签名参数字符串:{}", signBuilder.toString()); // * @param device_info 设备号
return MD5Util.encode(signBuilder.toString()).toUpperCase(); // * @param trade_type 交易类型
} // * @param prePay 预支付返回Map
// * @param partnerKey 签名EY
/** // * @return
* 转xml格式 // */
* // public static String geWeiXintPrePaySign(String appid, String mch_id, String device_info, String trade_type,
* @param paramMap // Map<String, Object> prePay, String partnerKey) {
* @return // Map<String, Object> preParams = new HashMap<String, Object>();
*/ // if (!StringUtil.isEmpty(prePay.get("return_code"))) {
public static String mapToXml(SortedMap<String, Object> paramMap) { // preParams.put("return_code", prePay.get("return_code"));
StringBuilder dataBuilder = new StringBuilder("<xml>"); // }
for (Map.Entry<String, Object> entry : paramMap.entrySet()) { // if (!StringUtil.isEmpty(prePay.get("return_msg"))) {
if (!StringUtil.isEmpty(entry.getValue())) { // preParams.put("return_msg", prePay.get("return_msg"));
dataBuilder.append("<").append(entry.getKey()).append(">").append(entry.getValue()).append("</").append(entry.getKey()).append(">"); // }
} // if (!StringUtil.isEmpty(prePay.get("appid"))) {
} // preParams.put("appid", appid);
dataBuilder.append("</xml>"); // }
logger.info("Map转Xml结果:{}", dataBuilder.toString()); // if (!StringUtil.isEmpty(prePay.get("mch_id"))) {
return dataBuilder.toString(); // preParams.put("mch_id", mch_id);
} // }
// if (!StringUtil.isEmpty(prePay.get("device_info"))) {
/** // preParams.put("device_info", device_info);
* 发送xml数据,获取返回结果 // }
* // if (!StringUtil.isEmpty(prePay.get("nonce_str"))) {
* @param requestUrl // preParams.put("nonce_str", prePay.get("nonce_str"));
* @param requestMethod // }
* @param xmlStr // if (!StringUtil.isEmpty(prePay.get("result_code"))) {
* @return // preParams.put("result_code", prePay.get("result_code"));
*/ // }
public static Map<String, Object> httpXmlRequest(String requestUrl, String requestMethod, String xmlStr) { // if ("FAIL".equals(prePay.get("result_code"))) {
// 将解析结果存储在HashMap中 // if (!StringUtil.isEmpty(prePay.get("err_code"))) {
Map<String, Object> map = new HashMap<String, Object>(); // preParams.put("err_code", prePay.get("err_code"));
try { // }
HttpsURLConnection urlCon = (HttpsURLConnection) (new URL(requestUrl)).openConnection(); // if (!StringUtil.isEmpty(prePay.get("err_code_des"))) {
urlCon.setDoInput(true); // preParams.put("err_code_des", prePay.get("err_code_des"));
urlCon.setDoOutput(true); // }
// 设置请求方式(GET/POST) // }
urlCon.setRequestMethod(requestMethod); // if (!StringUtil.isEmpty(prePay.get("trade_type"))) {
// preParams.put("trade_type", trade_type);
if ("GET".equalsIgnoreCase(requestMethod)) { // }
urlCon.connect(); // if (!StringUtil.isEmpty(prePay.get("prepay_id"))) {
} // preParams.put("prepay_id", prePay.get("prepay_id"));
// }
urlCon.setRequestProperty("Content-Length", String.valueOf(xmlStr.getBytes().length)); // if (!StringUtil.isEmpty(prePay.get("code_url"))) {
urlCon.setUseCaches(false); // preParams.put("code_url", prePay.get("code_url"));
// 设置为gbk可以解决服务器接收时读取的数据中文乱码问题 // }
if (null != xmlStr) { // String argPreSign = getStringByMap(preParams) + "&key=" + partnerKey;
OutputStream outputStream = urlCon.getOutputStream(); // String preSign = MD5Util.encode(argPreSign).toUpperCase();
outputStream.write(xmlStr.getBytes("UTF-8")); // return preSign;
outputStream.flush(); // }
outputStream.close(); //
} // public static boolean notifySign(Map<String, String> result, String sign, String partnerKey) {
InputStream inputStream = urlCon.getInputStream(); // String argNotifySign = getStringByStringMap(result) + "&key=" + partnerKey;
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); // String notifySign = MD5Util.encode(argNotifySign).toUpperCase();
// 读取输入流 // if (notifySign.equals(sign)) {
SAXReader reader = new SAXReader(); // return true;
Document document = reader.read(inputStreamReader); // } else {
// 得到xml根元素 // return false;
Element root = document.getRootElement(); // }
// 得到根元素的所有子节点 // }
@SuppressWarnings("unchecked") //
List<Element> elementList = root.elements(); // /**
// 遍历所有子节点 // * 获取预支付请求签名
for (Element e : elementList) { // *
map.put(e.getName(), e.getText()); // * @param WepayPrePayReq
} // * @param partnerKey
log.info("微信查询返回结果:"+map.toString()); // * @return
inputStreamReader.close(); // */
inputStream.close(); // private static void getPrePaySign(WepayPrePayReq WepayPrePayReq, String partnerKey) {
inputStream = null; //
urlCon.disconnect(); // Map<String, Object> prePayMap = new HashMap<String, Object>();
} catch (MalformedURLException e) { // prePayMap.put("appid", WepayPrePayReq.getAppid());// 公众账号ID
log.error(e.getMessage()); // prePayMap.put("mch_id", WepayPrePayReq.getMchId()); // 商户号
} catch (IOException e) { // prePayMap.put("device_info", WepayPrePayReq.getDeviceInfo());
log.error(e.getMessage()); // prePayMap.put("nonce_str", WepayPrePayReq.getNonceStr()); // 随机字符串
} catch (Exception e) { // prePayMap.put("body", WepayPrePayReq.getBody()); // 商品描述
log.error(e.getMessage()); // prePayMap.put("out_trade_no", WepayPrePayReq.getOutTradeNo()); // 商户订单号
} // prePayMap.put("total_fee", WepayPrePayReq.getTotalFee()); // 总金额
return map; // prePayMap.put("spbill_create_ip", WepayPrePayReq.getSpbillCreateIp()); // 终端IP
} // prePayMap.put("time_start", WepayPrePayReq.getTimeStart()); // 开始时间
// prePayMap.put("time_expire", WepayPrePayReq.getTimeExpire()); // 截止时间
/** // prePayMap.put("notify_url", WepayPrePayReq.getNotifyUrl()); // 接收财付通通知的URL
* 生成预支付XML //// prePayMap.put("trade_type", WepayPrePayReq.getTradeType().name()); // 交易类型
* //// if (WeiXinTradeTypeEnum.NATIVE.name().equals(WepayPrePayReq.getTradeType())) {
* @param WepayPrePayReq //// prePayMap.put("product_id", WepayPrePayReq.getProductId()); // 商品ID
* @param partnerKey //// } else if (WeiXinTradeTypeEnum.JSAPI.name().equals(WepayPrePayReq.getTradeType())) {
* @return //// prePayMap.put("openid", WepayPrePayReq.getOpenid()); // openid
*/ //// }
public static String getPrePayXml(WepayPrePayReq WepayPrePayReq, String partnerKey) { //
// String argPreSign = getStringByMap(prePayMap) + "&key=" + partnerKey;
getPrePaySign(WepayPrePayReq, partnerKey);// 生成预支付请求签名 // String preSign = MD5Util.encode(argPreSign).toUpperCase();
// WepayPrePayReq.setSign(preSign);
StringBuilder sb = new StringBuilder(); // }
sb.append("<xml><appid>").append(WepayPrePayReq.getAppid()).append("</appid>"); //
sb.append("<body>").append(WepayPrePayReq.getBody()).append("</body>"); // /**
sb.append("<device_info>").append(WepayPrePayReq.getDeviceInfo()).append("</device_info>"); // * 根据Map获取排序拼接后的字符串
sb.append("<mch_id>").append(WepayPrePayReq.getMchId()).append("</mch_id>"); // *
sb.append("<nonce_str>").append(WepayPrePayReq.getNonceStr()).append("</nonce_str>"); // * @param map
sb.append("<notify_url>").append(WepayPrePayReq.getNotifyUrl()).append("</notify_url>"); // * @return
// if (WeiXinTradeTypeEnum.NATIVE.name().equals(WepayPrePayReq.getTradeType())) { // */
// sb.append("<product_id>").append(WepayPrePayReq.getProductId()).append("</product_id>"); // public static String getStringByMap(Map<String, Object> map) {
// } else if (WeiXinTradeTypeEnum.JSAPI.name().equals(WepayPrePayReq.getTradeType())) { // SortedMap<String, Object> smap = new TreeMap<String, Object>(map);
// sb.append("<openid>").append(WepayPrePayReq.getOpenid()).append("</openid>"); // StringBuffer sb = new StringBuffer();
// } // for (Map.Entry<String, Object> m : smap.entrySet()) {
sb.append("<out_trade_no>").append(WepayPrePayReq.getOutTradeNo()).append("</out_trade_no>"); // sb.append(m.getKey()).append("=").append(m.getValue()).append("&");
sb.append("<spbill_create_ip>").append(WepayPrePayReq.getSpbillCreateIp()).append("</spbill_create_ip>"); // }
sb.append("<time_start>").append(WepayPrePayReq.getTimeStart()).append("</time_start>"); // sb.delete(sb.length() - 1, sb.length());
sb.append("<time_expire>").append(WepayPrePayReq.getTimeExpire()).append("</time_expire>"); // return sb.toString();
sb.append("<total_fee>").append(WepayPrePayReq.getTotalFee()).append("</total_fee>"); // }
// sb.append("<trade_type>").append(WepayPrePayReq.getTradeType().name()).append("</trade_type>"); //
sb.append("<sign>").append(WepayPrePayReq.getSign()).append("</sign>"); // public static String getStringByStringMap(Map<String, String> map) {
sb.append("</xml>"); // SortedMap<String, Object> smap = new TreeMap<String, Object>(map);
// StringBuffer sb = new StringBuffer();
return sb.toString(); // for (Map.Entry<String, Object> m : smap.entrySet()) {
} // sb.append(m.getKey()).append("=").append(m.getValue()).append("&");
// }
/** // sb.delete(sb.length() - 1, sb.length());
* 微信拼接签名参数 // return sb.toString();
* // }
* @param appid 公众账号ID //
* @param mch_id 商户号 // /**
* @param device_info 设备号 // * 解析微信发来的请求(XML)
* @param trade_type 交易类型 // *
* @param prePay 预支付返回Map // * @param inputStream
* @param partnerKey 签名EY // * @return
* @return // * @throws Exception
*/ // */
public static String geWeiXintPrePaySign(String appid, String mch_id, String device_info, String trade_type, // @SuppressWarnings("unchecked")
Map<String, Object> prePay, String partnerKey) { // public static Map<String, String> parseXml(InputStream inputStream) throws Exception {
Map<String, Object> preParams = new HashMap<String, Object>(); //
if (!StringUtil.isEmpty(prePay.get("return_code"))) { // if (inputStream == null) {
preParams.put("return_code", prePay.get("return_code")); // return null;
} // }
if (!StringUtil.isEmpty(prePay.get("return_msg"))) { //
preParams.put("return_msg", prePay.get("return_msg")); // Map<String, String> map = new HashMap<String, String>();// 将解析结果存储在HashMap中
} // SAXReader reader = new SAXReader();// 读取输入流
if (!StringUtil.isEmpty(prePay.get("appid"))) { // Document document = reader.read(inputStream);
preParams.put("appid", appid); // Element root = document.getRootElement();// 得到xml根元素
} // List<Element> elementList = root.elements();// 得到根元素的所有子节点
if (!StringUtil.isEmpty(prePay.get("mch_id"))) { // for (Element e : elementList) { // 遍历所有子节点
preParams.put("mch_id", mch_id); // map.put(e.getName(), e.getText());
} // }
if (!StringUtil.isEmpty(prePay.get("device_info"))) { //
preParams.put("device_info", device_info); // inputStream.close(); // 释放资源
} // inputStream = null;
if (!StringUtil.isEmpty(prePay.get("nonce_str"))) { //
preParams.put("nonce_str", prePay.get("nonce_str")); // return map;
} // }
if (!StringUtil.isEmpty(prePay.get("result_code"))) { //
preParams.put("result_code", prePay.get("result_code")); // /**
} // * 订单查询
if ("FAIL".equals(prePay.get("result_code"))) { // *
if (!StringUtil.isEmpty(prePay.get("err_code"))) { // * @param outTradeNo
preParams.put("err_code", prePay.get("err_code")); // * @return
} // */
if (!StringUtil.isEmpty(prePay.get("err_code_des"))) { // public static Map<String, Object> orderQuery(String outTradeNo, String appId, String MchId, String partnerKey) {
preParams.put("err_code_des", prePay.get("err_code_des")); // Random random = new Random();
} // Map<String, Object> paramMap = new HashMap<>();
} // paramMap.put("appid", appId);
if (!StringUtil.isEmpty(prePay.get("trade_type"))) { // paramMap.put("mch_id", MchId);
preParams.put("trade_type", trade_type); // String nonce_str = "";
} // for (int i = 0; i < 31; i++) {
if (!StringUtil.isEmpty(prePay.get("prepay_id"))) { // nonce_str += random.nextInt(10);
preParams.put("prepay_id", prePay.get("prepay_id")); // }
} // paramMap.put("nonce_str", nonce_str);
if (!StringUtil.isEmpty(prePay.get("code_url"))) { // paramMap.put("out_trade_no", outTradeNo);
preParams.put("code_url", prePay.get("code_url")); // String signStr = getStringByMap(paramMap) + "&key=" + partnerKey;
} // paramMap.put("sign", MD5Util.encode(signStr).toUpperCase());
String argPreSign = getStringByMap(preParams) + "&key=" + partnerKey; // Set<String> ks = paramMap.keySet();
String preSign = MD5Util.encode(argPreSign).toUpperCase(); // StringBuilder sb = new StringBuilder("<xml>");
return preSign; // for (String key : ks) {
} // sb.append("<" + key + ">" + paramMap.get(key) + "</" + key + ">");
// }
public static boolean notifySign(Map<String, String> result, String sign, String partnerKey) { // sb.append("</xml>");
String argNotifySign = getStringByStringMap(result) + "&key=" + partnerKey; // Map<String, Object> resultMap = httpXmlRequest("https://api.mch.weixin.qq.com/pay/orderquery", "POST",
String notifySign = MD5Util.encode(argNotifySign).toUpperCase(); // sb.toString());
if (notifySign.equals(sign)) { // return resultMap;
return true; // }
} else { //}
return false;
}
}
/**
* 获取预支付请求签名
*
* @param WepayPrePayReq
* @param partnerKey
* @return
*/
private static void getPrePaySign(WepayPrePayReq WepayPrePayReq, String partnerKey) {
Map<String, Object> prePayMap = new HashMap<String, Object>();
prePayMap.put("appid", WepayPrePayReq.getAppid());// 公众账号ID
prePayMap.put("mch_id", WepayPrePayReq.getMchId()); // 商户号
prePayMap.put("device_info", WepayPrePayReq.getDeviceInfo());
prePayMap.put("nonce_str", WepayPrePayReq.getNonceStr()); // 随机字符串
prePayMap.put("body", WepayPrePayReq.getBody()); // 商品描述
prePayMap.put("out_trade_no", WepayPrePayReq.getOutTradeNo()); // 商户订单号
prePayMap.put("total_fee", WepayPrePayReq.getTotalFee()); // 总金额
prePayMap.put("spbill_create_ip", WepayPrePayReq.getSpbillCreateIp()); // 终端IP
prePayMap.put("time_start", WepayPrePayReq.getTimeStart()); // 开始时间
prePayMap.put("time_expire", WepayPrePayReq.getTimeExpire()); // 截止时间
prePayMap.put("notify_url", WepayPrePayReq.getNotifyUrl()); // 接收财付通通知的URL
// prePayMap.put("trade_type", WepayPrePayReq.getTradeType().name()); // 交易类型
// if (WeiXinTradeTypeEnum.NATIVE.name().equals(WepayPrePayReq.getTradeType())) {
// prePayMap.put("product_id", WepayPrePayReq.getProductId()); // 商品ID
// } else if (WeiXinTradeTypeEnum.JSAPI.name().equals(WepayPrePayReq.getTradeType())) {
// prePayMap.put("openid", WepayPrePayReq.getOpenid()); // openid
// }
String argPreSign = getStringByMap(prePayMap) + "&key=" + partnerKey;
String preSign = MD5Util.encode(argPreSign).toUpperCase();
WepayPrePayReq.setSign(preSign);
}
/**
* 根据Map获取排序拼接后的字符串
*
* @param map
* @return
*/
public static String getStringByMap(Map<String, Object> map) {
SortedMap<String, Object> smap = new TreeMap<String, Object>(map);
StringBuffer sb = new StringBuffer();
for (Map.Entry<String, Object> m : smap.entrySet()) {
sb.append(m.getKey()).append("=").append(m.getValue()).append("&");
}
sb.delete(sb.length() - 1, sb.length());
return sb.toString();
}
public static String getStringByStringMap(Map<String, String> map) {
SortedMap<String, Object> smap = new TreeMap<String, Object>(map);
StringBuffer sb = new StringBuffer();
for (Map.Entry<String, Object> m : smap.entrySet()) {
sb.append(m.getKey()).append("=").append(m.getValue()).append("&");
}
sb.delete(sb.length() - 1, sb.length());
return sb.toString();
}
/**
* 解析微信发来的请求(XML)
*
* @param inputStream
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static Map<String, String> parseXml(InputStream inputStream) throws Exception {
if (inputStream == null) {
return null;
}
Map<String, String> map = new HashMap<String, String>();// 将解析结果存储在HashMap中
SAXReader reader = new SAXReader();// 读取输入流
Document document = reader.read(inputStream);
Element root = document.getRootElement();// 得到xml根元素
List<Element> elementList = root.elements();// 得到根元素的所有子节点
for (Element e : elementList) { // 遍历所有子节点
map.put(e.getName(), e.getText());
}
inputStream.close(); // 释放资源
inputStream = null;
return map;
}
/**
* 订单查询
*
* @param outTradeNo
* @return
*/
public static Map<String, Object> orderQuery(String outTradeNo, String appId, String MchId, String partnerKey) {
Random random = new Random();
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("appid", appId);
paramMap.put("mch_id", MchId);
String nonce_str = "";
for (int i = 0; i < 31; i++) {
nonce_str += random.nextInt(10);
}
paramMap.put("nonce_str", nonce_str);
paramMap.put("out_trade_no", outTradeNo);
String signStr = getStringByMap(paramMap) + "&key=" + partnerKey;
paramMap.put("sign", MD5Util.encode(signStr).toUpperCase());
Set<String> ks = paramMap.keySet();
StringBuilder sb = new StringBuilder("<xml>");
for (String key : ks) {
sb.append("<" + key + ">" + paramMap.get(key) + "</" + key + ">");
}
sb.append("</xml>");
Map<String, Object> resultMap = httpXmlRequest("https://api.mch.weixin.qq.com/pay/orderquery", "POST",
sb.toString());
return resultMap;
}
}
...@@ -129,7 +129,7 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService ...@@ -129,7 +129,7 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
DragonRefundChannelDto channelDto = new DragonRefundChannelDto(); DragonRefundChannelDto channelDto = new DragonRefundChannelDto();
RefundContentDto contentDto = new RefundContentDto(); RefundContentDto contentDto = new RefundContentDto();
String nonceStr = PayWepayUtils.getInstance().getNonceStr(); String nonceStr = PayWepayUtils.getInstance().getNonceStr();
SortedMap<Object, Object> parameters = new TreeMap<>(); SortedMap<String, Object> parameters = new TreeMap<>();
parameters.put("mch_id", PayWepayUtils.getInstance().getMerchantId()); parameters.put("mch_id", PayWepayUtils.getInstance().getMerchantId());
if (paymentType.equalsIgnoreCase(DragonConstant.PayTypeEnum.PAYMENT_TYPE_JS_WEPAY.getCode())) { if (paymentType.equalsIgnoreCase(DragonConstant.PayTypeEnum.PAYMENT_TYPE_JS_WEPAY.getCode())) {
parameters.put("appid", PayWepayUtils.getInstance().getJS_APP_ID()); parameters.put("appid", PayWepayUtils.getInstance().getJS_APP_ID());
......
...@@ -2,13 +2,14 @@ package com.liquidnet.service.dragon.utils; ...@@ -2,13 +2,14 @@ package com.liquidnet.service.dragon.utils;
import com.alipay.api.internal.util.file.IOUtils; import com.alipay.api.internal.util.file.IOUtils;
import com.liquidnet.commons.lang.util.MD5Utils; import com.liquidnet.commons.lang.util.MD5Utils;
import com.liquidnet.service.dragon.channel.wepay.resp.WePayRefundReturnDto;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts; import org.apache.http.ssl.SSLContexts;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.dom4j.DocumentException; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.crypto.Cipher; import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
...@@ -107,7 +108,7 @@ public class PayWepayUtils { ...@@ -107,7 +108,7 @@ public class PayWepayUtils {
return sb.toString(); return sb.toString();
} }
public String createSign(SortedMap<Object, Object> parameters) { public String createSign(SortedMap<String, Object> parameters) {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序) Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator(); Iterator it = es.iterator();
...@@ -124,7 +125,7 @@ public class PayWepayUtils { ...@@ -124,7 +125,7 @@ public class PayWepayUtils {
return MD5Utils.md5(sb.toString()).toUpperCase(); return MD5Utils.md5(sb.toString()).toUpperCase();
} }
public String getRequestXml(SortedMap<Object, Object> parameters) { public String getRequestXml(SortedMap<String, Object> parameters) {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
sb.append("<xml>"); sb.append("<xml>");
Set es = parameters.entrySet(); Set es = parameters.entrySet();
...@@ -162,4 +163,26 @@ public class PayWepayUtils { ...@@ -162,4 +163,26 @@ public class PayWepayUtils {
return ""; return "";
} }
} }
@SuppressWarnings("unchecked")
public static Map<String, String> parseXml(InputStream inputStream) throws Exception {
if (inputStream == null) {
return null;
}
Map<String, String> map = new HashMap<String, String>();// 将解析结果存储在HashMap中
SAXReader reader = new SAXReader();// 读取输入流
Document document = reader.read(inputStream);
Element root = document.getRootElement();// 得到xml根元素
List<Element> elementList = root.elements();// 得到根元素的所有子节点
for (Element e : elementList) { // 遍历所有子节点
map.put(e.getName(), e.getText());
}
inputStream.close(); // 释放资源
inputStream = null;
return map;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment