|
@@ -1,5 +1,7 @@
|
|
|
package com.xingxi.web.wxpay.service;
|
|
package com.xingxi.web.wxpay.service;
|
|
|
|
|
|
|
|
|
|
+import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
|
|
|
|
|
+import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result;
|
|
|
import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryV3Request;
|
|
import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryV3Request;
|
|
|
import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryV3Request;
|
|
import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryV3Request;
|
|
|
import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
|
|
import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
|
|
@@ -8,11 +10,26 @@ import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryV3Result;
|
|
|
import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
|
|
import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
|
|
|
import com.github.binarywang.wxpay.exception.WxPayException;
|
|
import com.github.binarywang.wxpay.exception.WxPayException;
|
|
|
import com.github.binarywang.wxpay.service.WxPayService;
|
|
import com.github.binarywang.wxpay.service.WxPayService;
|
|
|
|
|
+import com.xingxi.business.Order.mapper.OrderMapper;
|
|
|
|
|
+import com.xingxi.business.RefundInfo.mapper.RefundInfoMapper;
|
|
|
|
|
+import com.xingxi.common.enums.EOrderStatus;
|
|
|
|
|
+import com.xingxi.common.utils.DateUtils;
|
|
|
|
|
+import com.xingxi.web.controller.business.order.domain.OrderVo;
|
|
|
|
|
+import com.xingxi.web.controller.business.order.mapper.OrderVoMapper;
|
|
|
|
|
+import com.xingxi.web.controller.business.refundInfo.domain.RefundInfoVo;
|
|
|
|
|
+import com.xingxi.web.controller.business.refundInfo.mapper.RefundInfoVoMapper;
|
|
|
|
|
+import com.xingxi.web.wxpay.config.WechatPayConfig;
|
|
|
|
|
+import com.xingxi.web.wxpay.config.WechatPayProperties;
|
|
|
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.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.util.StreamUtils;
|
|
|
|
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
|
|
+import java.nio.charset.Charset;
|
|
|
|
|
|
|
|
@Slf4j
|
|
@Slf4j
|
|
|
@Service
|
|
@Service
|
|
@@ -20,6 +37,16 @@ public class WechatPayService {
|
|
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private WxPayService wxPayService;
|
|
private WxPayService wxPayService;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private RefundInfoMapper refundInfoMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private RefundInfoVoMapper refundInfoVoMapper;
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private WechatPayProperties payProperties;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private OrderVoMapper orderVoMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private OrderMapper orderMapper;
|
|
|
|
|
|
|
|
public WxPayOrderQueryV3Result orderQuery(WxPayOrderQueryV3Request request) {
|
|
public WxPayOrderQueryV3Result orderQuery(WxPayOrderQueryV3Request request) {
|
|
|
// 查询是否支付成功
|
|
// 查询是否支付成功
|
|
@@ -53,6 +80,7 @@ public class WechatPayService {
|
|
|
refundAmountObj.setCurrency("CNY");
|
|
refundAmountObj.setCurrency("CNY");
|
|
|
|
|
|
|
|
wxRefundRequest.setAmount(refundAmountObj);
|
|
wxRefundRequest.setAmount(refundAmountObj);
|
|
|
|
|
+ wxRefundRequest.setNotifyUrl(payProperties.getRefundcallbackUrl());
|
|
|
try {
|
|
try {
|
|
|
rtn = wxPayService.refundV3(wxRefundRequest);
|
|
rtn = wxPayService.refundV3(wxRefundRequest);
|
|
|
} catch (WxPayException e) {
|
|
} catch (WxPayException e) {
|
|
@@ -80,4 +108,54 @@ public class WechatPayService {
|
|
|
return rtn;
|
|
return rtn;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private SignatureHeader httpRequestToSignatureHeader(HttpServletRequest request){
|
|
|
|
|
+
|
|
|
|
|
+ String serial = request.getHeader("Wechatpay-Serial");
|
|
|
|
|
+ String signature = request.getHeader("Wechatpay-Signature");
|
|
|
|
|
+ String timestamp = request.getHeader("Wechatpay-Timestamp");
|
|
|
|
|
+ String nonceStr = request.getHeader("Wechatpay-Nonce");
|
|
|
|
|
+ SignatureHeader signatureHeader = new SignatureHeader();
|
|
|
|
|
+ signatureHeader.setSerial(serial);
|
|
|
|
|
+ signatureHeader.setSignature(signature);
|
|
|
|
|
+ signatureHeader.setNonce(nonceStr);
|
|
|
|
|
+ signatureHeader.setTimeStamp(timestamp);
|
|
|
|
|
+ return signatureHeader;
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public String refundCallback(HttpServletRequest request, HttpServletResponse response) {
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ SignatureHeader signatureHeader = httpRequestToSignatureHeader(request);
|
|
|
|
|
+ String s = StreamUtils.copyToString(request.getInputStream(), Charset.defaultCharset());
|
|
|
|
|
+
|
|
|
|
|
+ WxPayRefundNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseRefundNotifyV3Result(s, signatureHeader);
|
|
|
|
|
+
|
|
|
|
|
+ WxPayRefundNotifyV3Result.DecryptNotifyResult decryptNotifyResult = wxPayOrderNotifyV3Result.getResult();
|
|
|
|
|
+
|
|
|
|
|
+ String outRefundNo = decryptNotifyResult.getOutRefundNo();
|
|
|
|
|
+
|
|
|
|
|
+ RefundInfoVo refundInfoVo = refundInfoVoMapper.selectRefundInfoByOutRefundNo(outRefundNo);
|
|
|
|
|
+
|
|
|
|
|
+ refundInfoVo.setStatus(decryptNotifyResult.getRefundStatus());
|
|
|
|
|
+ refundInfoVo.setSuccessTime(decryptNotifyResult.getSuccessTime());
|
|
|
|
|
+ refundInfoVo.setUserReceivedAccount(decryptNotifyResult.getUserReceivedAccount());
|
|
|
|
|
+ refundInfoVo.setUpdateTime(DateUtils.getNowDate());
|
|
|
|
|
+ refundInfoVo.setUpdateUser("refundCallback");
|
|
|
|
|
+ refundInfoMapper.updateRefundInfo(refundInfoVo);
|
|
|
|
|
+
|
|
|
|
|
+ OrderVo orderVo = orderVoMapper.selectOrderVoByOrderNo(decryptNotifyResult.getOutTradeNo());
|
|
|
|
|
+ orderVo.setOrderStatus(EOrderStatus.FINISHED.getVal());
|
|
|
|
|
+// orderVo.setRefundAmount(BigDecimal.valueOf(decryptNotifyResult.getAmount().getRefund()));
|
|
|
|
|
+ orderVo.setUpdateTime(DateUtils.getNowDate());
|
|
|
|
|
+ orderVo.setUpdateUser("refundCallback");
|
|
|
|
|
+ orderMapper.updateOrder(orderVo);
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("处理微信支付退款回调通知失败!!!!:{}", e.getMessage());
|
|
|
|
|
+ return "FAIL";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return "SUCCESS";
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|