第一次写这个微信退款,总结一下
准备工作
-
配置文件中配置以下参数
ps:这些参数在application配置文件配置 -
获取证书
获取证书并把证书保存到resources资源文件下 -
添加以下jar包
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-weixin</artifactId>
<version>1.9</version>
</dependency>
微信退款
退款方法参数根据各位业务逻辑去判断不需要照搬
/**
* 微信支付退款
* @param refundMoney 退款金额
* @param saleSn 售后单号
* @param orderSn 订单号
* @param orderMoney 订单金额
* @return
*/
public Result refundWx(BigDecimal refundMoney, String saleSn, String orderSn, BigDecimal orderMoney) {
WpOrderReturnApplyExample applyExample = new WpOrderReturnApplyExample();
applyExample.createCriteria().andSaleSnEqualTo(saleSn);
StringBuffer sb = new StringBuffer() ;
sb.append("REFUND");
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String date = df.format(new Date());
sb.append(date);
String refundNo = sb.toString(); //退款单号
BigDecimal returnAmount = refundMoney.multiply(new BigDecimal(100));
Integer refundFee = returnAmount.intValue();
BigDecimal orderAmount = orderMoney.multiply(new BigDecimal(100));
Integer orderFee = orderAmount.intValue();
Map<String, String> params = new HashMap<>();
params.put("appid", appIdWX);
params.put("mch_id", merchantIdWX);
// params.put("transaction_id", transaction_id); // out_trade_no out_trade_no二选一
params.put("out_trade_no", orderSn);
params.put("out_refund_no", refundNo);
params.put("total_fee",orderFee.toString());
params.put("refund_fee", refundFee.toString());
params.put("nonce_str", System.currentTimeMillis() + "");
String sign = PaymentKit.createSign(params, paternerKey);
params.put("sign", sign);
logger.info("申请退款参数:{}", PaymentKit.toXml(params));
//建立连接并发送数据
String response = refundUtil(params);
Map<String, String> responseMap = PaymentKit.xmlToMap(response);
//退款返回标志码
logger.info("微信支付退款返回结果 ==================> "+responseMap);
if( responseMap.get("return_code").equals("SUCCESS") &&
responseMap.get("result_code").equals("SUCCESS")){
logger.info("微信支付退款成功!");
return new Result(HttpStatusEnums.SUCCESS);
} else {
logger.info("未知错误,微信支付退款失败!");
return new Result(OrderReturnApplyEnums.REFUND_ERROR);
}
}
退款逻辑
private String refundUtil(Map<String, String> params) {
HttpsURLConnection conn = null;
OutputStream out = null;
InputStream inputStream = null;
BufferedReader reader = null;
try {
KeyStore clientStore = KeyStore.getInstance("PKCS12");
InputStream instream = PropertiesUtil.class.getResourceAsStream(certPathWX);
clientStore.load(instream, merchantIdWX.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(clientStore, merchantIdWX.toCharArray());
KeyManager[] kms = kmf.getKeyManagers();
SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(kms, null, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
URL _url = new URL(PaymentApi.refundUrl);
conn = (HttpsURLConnection) _url.openConnection();
conn.setConnectTimeout(25000);
conn.setReadTimeout(25000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
conn.connect();
out = conn.getOutputStream();
out.write(PaymentKit.toXml(params).getBytes(Charsets.UTF_8));
out.flush();
inputStream = conn.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, Charsets.UTF_8));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
return sb.toString();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(reader);
IOUtils.closeQuietly(inputStream);
if (conn != null) {
conn.disconnect();
}
}
}
以上就是微信退款的全部代码了