一、介绍
本文介绍了微信订单查询,退款查询,关闭订单,账单下载的代码实例,如有不足的请提出,我会做出改正。
二、官方文档
订单查询:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_2
关闭订单:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_3
下载对账单:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_6
三、微信SDK安装方法
微信PC扫码支付(一)-maven本地仓库安装:微信支付sdk
四、订单查询
- 下文PayException为自定义异常类
- 下文WeixinConfig为微信需要固定参数类
public Object query(Map<String, Object> map) throws PayException{
Map<String,String> resultMap=new HashMap<>();
//参数验证
if(map==null || map.isEmpty()){
throw new PayException("查询订单参数不能为空");
}
//商户订单号
String outTradeNo=(String)map.get("outTradeNo");
logger.info("微信查询订单-orderId:"+outTradeNo);
//微信订单号
String thirdPayOrderNumber=(String)map.get("thirdPayOrderNumber");
if(StringUtils.isBlank(outTradeNo) && StringUtils.isBlank(thirdPayOrderNumber)){
throw new PayException("缺少参数");
}
//查询订单
Map<String,String> wxResult=new HashMap<>();
try {
WeixinConfig weixinConfig=new WeixinConfig();
String nonce_str=Long.toString(System.currentTimeMillis() / 1000);
logger.info("微信查询订单-nonce_str:"+nonce_str);
Map<String,String> paramMap=new HashMap<>();
paramMap.put("appid",weixinConfig.getAppID());
paramMap.put("mch_id",weixinConfig.getMchID());
if(StringUtils.isNotBlank(outTradeNo)){
paramMap.put("out_trade_no",outTradeNo);
}
if(StringUtils.isNotBlank(thirdPayOrderNumber)){
paramMap.put("transaction_id",thirdPayOrderNumber);
}
paramMap.put("nonce_str",nonce_str);
String sign = WXPayUtil.generateSignature(paramMap, weixinConfig.getKey());//签名
logger.info("微信查询订单-sign:"+sign);
paramMap.put("sign", sign);
WXPay wxpay=new WXPay(weixinConfig,WXPayConstants.SignType.MD5,false);//查询订单
wxResult=wxpay.orderQuery(paramMap);//查询订单结果
} catch (Exception e) {
logger.error("微信查询订单发生错误:",e);
throw new PayException("微信查询订单发生错误");
}
//通讯没有成功
if (!"SUCCESS".equals(wxResult.get("return_code"))) {
throw new PayException(wxResult.get("return_msg"));
}
//订单存在
if("SUCCESS".equals(wxResult.get("result_code"))){
resultMap.put("returnResult", "SUCCESS");
}else{
//订单不存在
resultMap.put("returnResult", "FAIL");
}
//订单支付成功
if("SUCCESS".equals(wxResult.get("result_code")) && "SUCCESS".equals(wxResult.get("trade_state"))){
resultMap.put("tradeState", "SUCCESS");
}else{
//订单支付失败
resultMap.put("tradeState", "FAIL");
}
return resultMap;
}
四、关闭订单
- 下文PayException为自定义异常类
- 下文WeixinConfig为微信需要固定参数类
public Object close(Map<String, Object> map){
Map<String,String> resultMap=new HashMap<>();
try {
if(map.isEmpty()){
resultMap.put("return_code","FAIL");
resultMap.put("return_msg","缺少参数");
return resultMap;
}
//商户订单号
String orderId=(String)map.get("orderId");
logger.info("微信关闭订单-orderId:"+orderId);
//微信订单号
String transactionId=(String)map.get("transaction_id");
logger.info("微信关闭订单-transactionId:"+orderId);
if(StringUtils.isBlank(orderId) && StringUtils.isBlank(transactionId)){
resultMap.put("return_code","FAIL");
resultMap.put("return_msg","缺少参数");
return resultMap;
}
WeixinConfig weixinConfig=new WeixinConfig();
String nonce_str=Long.toString(System.currentTimeMillis() / 1000);
logger.info("微信关闭订单-nonce_str:"+nonce_str);
Map<String,String> paramMap=new HashMap<>();
paramMap.put("appid",weixinConfig.getAppID());
paramMap.put("mch_id",weixinConfig.getMchID());
paramMap.put("out_trade_no",orderId);
paramMap.put("transaction_id",transactionId);
paramMap.put("nonce_str",nonce_str);
//签名
String sign = WXPayUtil.generateSignature(paramMap, weixinConfig.getKey());
logger.info("微信关闭订单-sign:"+sign);
paramMap.put("sign", sign);
//关闭订单
WXPay wxpay=new WXPay(weixinConfig,WXPayConstants.SignType.MD5,false);
resultMap=wxpay.closeOrder(paramMap);
return resultMap;
} catch (Exception e) {
resultMap.put("return_code","FAIL");
resultMap.put("return_msg","服务器发生错误");
logger.error("微信关闭订单发生错误:",e);
return resultMap;
}
}
五、下载对账单
下面介绍的是下载微信账单并进行解析成list返回
- 下文PayException为自定义异常类
- 下文WeixinConfig为微信需要固定参数类
public Object downloadBill(Map<String, Object> map) throws PayException{
if(map.isEmpty()){
throw new PayException("缺少参数");
}
//对账账单日期
String billDate=(String)map.get("bill_date");
logger.info("微信下载账单-billDate:"+billDate);
//账单类型
String billType=(String)map.get("bill_type");
logger.info("微信下载账单-billType:"+billType);
Map<String,String> paramMap=new HashMap<>();
WeixinConfig weixinConfig=new WeixinConfig();
paramMap.put("appid", weixinConfig.getAppID());
paramMap.put("mch_id",weixinConfig.getMchID());
paramMap.put("nonce_str",Long.toString(System.currentTimeMillis() / 1000));
paramMap.put("bill_date",billDate);
paramMap.put("bill_type",billType);
try {
//签名
String sign = WXPayUtil.generateSignature(paramMap, weixinConfig.getKey());
logger.info("微信下载账单-sign:"+sign);
paramMap.put("sign", sign);
//下载对账单
WXPay wxpay=new WXPay(weixinConfig,WXPayConstants.SignType.MD5,false);
Map<String,String> resultMap=wxpay.downloadBill(paramMap);
String returnCode = resultMap.get("return_code");
logger.info("微信下载账单-returnCode:"+returnCode);
String returnMsg = resultMap.get("return_msg");
logger.info("微信下载账单-returnMsg:"+returnMsg);
//code 标记成功失败,默认0:成功,1:失败、用于alert,2:失败、用于confirm
if (StringUtils.isBlank(returnCode) || !"SUCCESS".equals(returnCode)) {
throw new PayException(returnMsg);
}
String data = resultMap.get("data");
String tradeMsg = data.substring(data.indexOf("`"));//把第一行表头去掉
String tradeInfo = tradeMsg.substring(0, tradeMsg.indexOf("总")).replace("`", "");// 去掉汇总数据,并且去掉'`'
String[] tradeArray = tradeInfo.split("%"); // 根据%来区分
List<TradeWxBill> tradeWxBillList = new ArrayList<>();
for (String tradeDetailInfo : tradeArray) {
String[] tradeDetailArray = tradeDetailInfo.split(",");
TradeWxBill tradeWxBill = new TradeWxBill();//微信下载账单返回类
tradeWxBill.setTransDate(DateUtils.parseDate(tradeDetailArray[0], "yyyy-MM-ddHH: MI: SS"));
tradeWxBill.setCommonId(tradeDetailArray[1]);// 公众账号ID
tradeWxBill.setBusinessNo(tradeDetailArray[2]);// 商户号
tradeWxBill.setChildBusinessNo(tradeDetailArray[3]);// 子商户号
tradeWxBill.setEquipmentNo(tradeDetailArray[4]);// 设备号
tradeWxBill.setWxOrderNo(tradeDetailArray[5]);// 微信订单号
tradeWxBill.setBusinessOrderNo(tradeDetailArray[6]);// 商户订单号
tradeWxBill.setUserIdentity(tradeDetailArray[7]);// 用户标识
tradeWxBill.setTransType(tradeDetailArray[8]);// 交易类型
tradeWxBill.setTransStatus(tradeDetailArray[9]);// 交易状态
tradeWxBill.setPaymentBank(tradeDetailArray[10]);// 付款银行
tradeWxBill.setCurrency(tradeDetailArray[11]);// 货币种类
tradeWxBill.setTotalAmount(tradeDetailArray[12]);// 总金额
tradeWxBill.setRedEnvelopesAmount(tradeDetailArray[13]);// 企业红包金额
tradeWxBill.setWxRefundNo(tradeDetailArray[14]);// 微信退款单号
tradeWxBill.setBusinessRefundNo(tradeDetailArray[15]);// 商户退款单号
tradeWxBill.setRefundAmount(tradeDetailArray[16]);// 退款金额
tradeWxBill.setRedEnvelopesRefundAmount(tradeDetailArray[17]);// 企业红包退款金额
tradeWxBill.setRefundType(tradeDetailArray[18]);// 退款类型
tradeWxBill.setRefundStatus(tradeDetailArray[19]);// 退款状态
tradeWxBill.setBusinessName(tradeDetailArray[20]);// 商品名称
tradeWxBill.setBusinessData(tradeDetailArray[21]);// 商户数据包
tradeWxBill.setFee(tradeDetailArray[22]);// 手续费
tradeWxBill.setRate(tradeDetailArray[23] + "%");// 费率
tradeWxBillList.add(tradeWxBill);
}
return tradeWxBillList;
} catch (Exception e) {
logger.error("微信下载对账单发生错误:",e);
throw new PayException("服务器发生错误");
}
}