这里需要配置几个参数我选择写在配置文件中
oauth.wx.wechat.appId= #小程序的appid
oauth.wx.wechat.appSecret= #商家码
oauth.wx.wechat.mchId=#商户id
oauth.wx.wechat.key=#商户的key
oauth.wx.wechat.keyPath=#这里是一个证书 需要申请
oauth.wx.wechat.tradeType=JSAPI
不多说直接上代码
@Component
@ConfigurationProperties(prefix = "oauth.wx.wechat")
@PropertySource(value = "application-dev.properties")
@Data
public class WeChatPayConfig {
private String appId;
private String appSecret;
private String mchId;
private String key;
private String keyPath;
private String tradeType;
private String notifyUrl;
@Bean
@ConditionalOnMissingBean
public WxPayConfig payConfig() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(this.getAppId());
payConfig.setMchId(this.getMchId());
payConfig.setMchKey(this.getKey());
payConfig.setKeyPath(this.getKeyPath());
payConfig.setTradeType(this.getTradeType());
payConfig.setNotifyUrl(this.getNotifyUrl());
return payConfig;
}
@Bean
public WxPayService wxPayService(WxPayConfig payConfig) {
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}
@Slf4j
public class WeiXinUtils {
private static final String REFUND_SUCCESS = "SUCCESS";
/**
*微信退款
* @author houyanan
* @date 2019/9/25
*/
public static String wechatRefund(WxPayService wxPayService, RefundOrderDomain refundOrderDomain){
//申请退款
WxPayRefundRequest refundInfo = WxPayRefundRequest.newBuilder()
//订单号
.outTradeNo(refundOrderDomain.getRefundId())
//退款订单号
.outRefundNo(refundOrderDomain.getOutRefundNo())
//金额
.totalFee(1)
//退款金额
.refundFee(1)
//todo 回调地址
.notifyUrl("*********")
.build();
WxPayRefundResult wxPayRefundResult;
try {
wxPayRefundResult = wxPayService.refund(refundInfo);
//判断退款信息是否正确
if (REFUND_SUCCESS.equals(wxPayRefundResult.getReturnCode())
&& REFUND_SUCCESS.equals(wxPayRefundResult.getResultCode())) {
/**
* 系统内部业务逻辑
*/
return "正在退款中。。";
}
} catch (WxPayException e) {
log.error("微信退款接口错误信息= {}", e);
} catch (Exception e) {
e.printStackTrace();
}
return "退款失败";
}
}
回调代码
@RequestMapping(value = "refundNotify", method = {RequestMethod.GET, RequestMethod.POST}) public String refundNotify(@RequestBody String xmlData) {
log.info("微信返回信息" + xmlData);
WxPayRefundNotifyResult wxPayRefundNotifyResult;
try {
wxPayRefundNotifyResult = wxPayService.parseRefundNotifyResult(xmlData);
System.out.println(wxPayRefundNotifyResult);
} catch (WxPayException e) {
log.error("退款失败,失败信息:{}", e);
return WxPayNotifyResponse.fail("退款失败");
}
//判断你返回状态信息是否正确
if (REFUND_SUCCESS.equals(wxPayRefundNotifyResult.getReturnCode())) {
WxPayRefundNotifyResult.ReqInfo reqInfo = wxPayRefundNotifyResult.getReqInfo();
//判断退款状态
if (REFUND_SUCCESS.equals(reqInfo.getRefundStatus())) {
//内部订单号
String outTradeNo = reqInfo.getOutTradeNo();
String outRefundNo = reqInfo.getOutRefundNo();
RefundOrderQuery refundOrderQuery = new RefundOrderQuery();
refundOrderQuery.setOutRefundNo(outRefundNo);
RefundOrderDomain refundOrderDomain = refundOrderService.getFirst(refundOrderQuery);
// 生成微信退款记录
userTradeRecordService.createUserrefundOrder(coralSecurityContext.getUser().getId(),
refundOrderDomain, outTradeNo);
/**
* 一、可能会重复回调,需要做防重判断
* 二、处理我们系统内部业务,做修改订单状态,释放资源等!
*/
return WxPayNotifyResponse.success("退款成功!");
}
}
return WxPayNotifyResponse.fail("回调有误!"); }