方式一:调用微信支付的SDK里的refund
第一步:依赖
<!--微信支付-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
第二步:实现SDK里的WXPayConfig
@Component
public class WxConfig implements WXPayConfig {
private byte[] certData;
private static final String APP_ID = "";
private static final String MCH_ID = "";
private static final String KEY = "";
/** JSAPI 公众号支付 NATIVE 扫码支付 APP APP支付 */
public static final String TRADE_TYPE_JSPAI = "JSAPI";
public static final String TRADE_TYPE_MATIVE = "NATIVE";
public static final String TRADE_TYPE_APP = "APP";
/** 回调地址 */
public static String WX_NOTIFY_URL = "http://{ip}:{port}/pay/wxNotifyUrl";
public WxConfig() {
//String certPath = "classpath:cer/apiclient_cert.p12";
String certPath = "C:/cert/apiclient_cert.p12";
try {
File file = ResourceUtils.getFile(certPath);
InputStream certStream = new FileInputStream(file);
this.certData = new byte[(int) file.length()];
certStream.read(this.certData);
certStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public String getAppID() {
return APP_ID;
}
public String getMchID() {
return MCH_ID;
}
public String getKey() {
return KEY;
}
public InputStream getCertStream() {
ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
public int getHttpConnectTimeoutMs() {
return 8000;
}
public int getHttpReadTimeoutMs() {
return 10000;
}
}
第三步:在WxConfig配置类里,添加退款方法,( wxPay.refund(reqData) )
/** 微信SDK源码-解释 new WXPay(wxConfig) */
public class WXPay {
private WXPayConfig config;
private SignType signType;
private boolean useSandbox;
public WXPay(final WXPayConfig config) {
this(config, SignType.MD5, false);
}
//...
}
具体参数,参考微信申请退款官方文档
@Component
public class WxConfig implements WXPayConfig {
/**
* 微信公众号 退款
* author yuhao
* date 2018-10-17 17:00
*/
public Map<String, String> refund(WXPayConfig wxPayConfig, Order order) {
WXPay wxPay = new WXPay(wxPayConfig);//创建实例对象时,将WxConfig里的支付相关参数,配置到WXPay对象里
Map<String, String> reqData = new HashMap<>();//构建调用refund方法所需要的参数
/** appid 公众号ID*/
/** mch_id 商户号ID*/
/** nonce_str 随机字符串*/
/** sign 签名*/
/** sign_type 签名类型*/
//以上自动填充
/**transaction_id 微信订单号 或 out_trade_no商户订单号*/
reqData.put("out_trade_no", order.getId());
/** 商户退款单号*/
reqData.put("out_refund_no", order.getRefundId());
/** 订单金额*/
reqData.put("total_fee", WxUtils.getMoney(order.getSMoney()));
/** 退款金额 */
reqData.put("refund_fee", WxUtils.getMoney(order.getRMoney()));
if (order.getReason() != null) {
/** 退款原因*/
reqData.put("refund_desc", order.getReason());
}
Map<String, String> refund = new HashMap<>();
try {
refund = wxPay.refund(reqData);//调用WXPay的refund方法,返回退款是否成功
for (String key : refund.keySet()) {
System.out.println("key===" + key + " " + refund.get(key));
}
} catch (Exception e) {
e.printStackTrace();
}
return refund;
}
}
方式二:通过接口链接,调用requestWithCert
接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund
package com.github.wxpay.sdk;
import com.github.wxpay.sdk.WXPayConstants.SignType;
public class WXPay {
/**
* 需要证书的请求
* @param strUrl String
* @param reqData 向wxpay post的请求数据 Map
* @param connectTimeoutMs 超时时间,单位是毫秒
* @param readTimeoutMs 超时时间,单位是毫秒
* @return API返回数据
* @throws Exception
*/
public String requestWithCert(String strUrl, Map<String, String> reqData,
int connectTimeoutMs, int readTimeoutMs) throws Exception {
}
}