From 1825949df8995ed189e733a4882f13343041912f Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Fri, 05 Aug 2022 14:26:41 +0800
Subject: [PATCH] 20220805
---
src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java | 6 +
src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java | 6 +
src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java | 3
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 103 ++++++++++++++++++++
src/main/java/cc/mrbird/febs/mall/mapper/MallRefundMapper.java | 7 +
src/main/resources/application-dev.yml | 3
src/main/resources/application-prod.yml | 5
src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java | 97 +++++++++---------
src/main/java/cc/mrbird/febs/mall/entity/MallRefundEntity.java | 26 +++++
src/main/resources/application-test.yml | 3
10 files changed, 209 insertions(+), 50 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java b/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
index a737ad7..1077d2d 100644
--- a/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
+++ b/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
@@ -18,5 +18,11 @@
private String wecharPaynotifyUrl;
//测试支付的开关,true:支付0.01元
private Boolean debug;
+ //支付证书地址
+ private String certLocalPath;
+ //微信商户号
+ private String wecharpayMchid;
+ //支付秘钥
+ private String wecharpaySecret;
}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java
index 0260de6..92f5254 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java
@@ -89,6 +89,12 @@
return new FebsResponse().success().message("删除成功");
}
+ @ApiOperation(value = "用户退款", notes = "用户退款")
+ @PostMapping(value = "/refundOrder/{id}")
+ public FebsResponse refundOrder(@PathVariable("id") Long id) {
+ return mallOrderInfoService.refundOrder(id);
+ }
+
@ApiOperation(value = "提交退款申请", notes = "提交退款申请")
@PostMapping(value = "/applyRefund")
public FebsResponse applyRefund(@RequestBody AddRefundDto addRefundDto) {
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallRefundEntity.java b/src/main/java/cc/mrbird/febs/mall/entity/MallRefundEntity.java
new file mode 100644
index 0000000..884b517
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallRefundEntity.java
@@ -0,0 +1,26 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("mall_refund")
+public class MallRefundEntity extends BaseEntity {
+
+ //退款编号
+ private String refundNo;
+ //退款人ID
+ private Long memberId;
+ //退款订单ID
+ private Long orderId;
+ //退款方式 1:微信 2:支付宝 3:其他
+ private Integer type;
+ //退款状态 1:成功 2:失败 3:退款中
+ private Integer state;
+ //退款金额
+ private BigDecimal amount;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallRefundMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallRefundMapper.java
new file mode 100644
index 0000000..4ccf42f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallRefundMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.MallRefundEntity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface MallRefundMapper extends BaseMapper<MallRefundEntity> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java
index 8b63908..8064576 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java
@@ -1,5 +1,6 @@
package cc.mrbird.febs.mall.service;
+import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.mall.vo.OrderDetailVo;
@@ -32,4 +33,6 @@
void autoCancelOrder(Long id);
void goodsComment(ApiAddCommentDtos addCommentDtos);
+
+ FebsResponse refundOrder(Long id);
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
index 9ac608f..dd09c75 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -1,7 +1,9 @@
package cc.mrbird.febs.mall.service.impl;
+import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.enumerates.*;
import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.*;
import cc.mrbird.febs.mall.conversion.MallGoodsCommentConversion;
import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion;
@@ -16,18 +18,22 @@
import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.service.IPayService;
import cc.mrbird.febs.pay.service.IXcxPayService;
+import cc.mrbird.febs.pay.util.WeixinServiceUtil;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -62,6 +68,7 @@
private final IPayService payService;
private final IXcxPayService iXcxPayService;
private final IMallAchieveService mallAchieveService;
+ private final MallRefundMapper mallRefundMapper;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -560,4 +567,100 @@
}
}
+ @Autowired
+ private WeixinServiceUtil weixinServiceUtil;
+ private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
+
+ @Override
+ @Transactional
+ public FebsResponse refundOrder(Long id) {
+ MallMember member = LoginUserUtil.getLoginUser();
+ MallOrderInfo mallOrderInfo = this.baseMapper.selectById(id);
+ if(ObjectUtil.isEmpty(mallOrderInfo)){
+ return new FebsResponse().fail().message("订单不存在");
+ }
+ Integer status = mallOrderInfo.getStatus();
+ if(OrderStatusEnum.WAIT_SHIPPING.getValue() != status){
+ return new FebsResponse().fail().message("订单不是待发货状态");
+ }
+ Integer deliveryState = mallOrderInfo.getDeliveryState();
+ if(1 != deliveryState){
+ return new FebsResponse().fail().message("订单不是待配送状态");
+ }
+ QueryWrapper<MallRefundEntity> objectQueryWrapper = new QueryWrapper<>();
+ objectQueryWrapper.eq("member_id",member.getId());
+ objectQueryWrapper.eq("order_id",mallOrderInfo.getId());
+ MallRefundEntity mallRefund = mallRefundMapper.selectOne(objectQueryWrapper);
+ MallRefundEntity mallRefundEntity = new MallRefundEntity();
+ if(ObjectUtil.isEmpty(mallRefund)){
+ mallRefundEntity.setRefundNo(mallOrderInfo.getOrderNo()+"_r");
+ mallRefundEntity.setMemberId(member.getId());
+ mallRefundEntity.setOrderId(mallOrderInfo.getId());
+ mallRefundEntity.setType(1);
+ mallRefundEntity.setState(3);
+ mallRefundEntity.setAmount(mallOrderInfo.getAmount());
+ mallRefundMapper.insert(mallRefundEntity);
+ }
+ if(mallRefund.getState() == 1){
+ return new FebsResponse().fail().message("订单已退款");
+ }
+ if(mallRefund.getState() == 3){
+ return new FebsResponse().fail().message("订单退款中");
+ }
+ if(mallRefund.getState() == 2){
+ mallRefundEntity.setId(mallRefund.getId());
+ mallRefundEntity.setRefundNo(mallRefund.getRefundNo());
+ mallRefundEntity.setMemberId(mallRefund.getMemberId());
+ mallRefundEntity.setOrderId(mallRefund.getOrderId());
+ mallRefundEntity.setType(mallRefund.getType());
+ mallRefundEntity.setState(3);
+ mallRefundEntity.setAmount(mallRefund.getAmount());
+ mallRefundMapper.updateById(mallRefundEntity);
+ }
+
+ //退款订单编号
+ String orderNo = mallOrderInfo.getOrderNo();
+ //退款退款编号
+ String refundNo = mallRefundEntity.getRefundNo();
+ //退款订单金额
+ BigDecimal orderAmount = mallOrderInfo.getAmount();
+ BigDecimal aa = new BigDecimal(100);
+ int orderMoney = orderAmount.multiply(aa).intValue();
+
+ //退款退款金额
+ BigDecimal refundAmount = mallRefundEntity.getAmount();
+ BigDecimal bb = new BigDecimal(100);
+ int refundMoney = refundAmount.multiply(bb).intValue();
+
+ Boolean flag = false;
+ Boolean debug = xcxProperties.getDebug();
+ if (debug) {
+ boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, null);
+ flag = b;
+ } else {
+ log.info("开始调用退款接口。。。退款编号为{}", refundNo);
+ boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orderMoney, refundMoney, null);
+ flag = b;
+ }
+
+ /**
+ * 更新退款表
+ * 更新订单表
+ */
+ Long refundId = mallRefundEntity.getId();
+ MallRefundEntity mallRefundOld = mallRefundMapper.selectById(refundId);
+ MallOrderInfo mallOrderInfoOld = this.baseMapper.selectByOrderNo(orderNo);
+ if(flag){
+ mallRefundOld.setState(1);
+ mallRefundMapper.updateById(mallRefundOld);
+ mallOrderInfoOld.setStatus(OrderStatusEnum.REFUNDED.getValue());
+ this.baseMapper.updateById(mallOrderInfoOld);
+ }else{
+ mallRefundOld.setState(2);
+ mallRefundMapper.updateById(mallRefundOld);
+ return new FebsResponse().fail().message("退款失败,请联系客服人员");
+ }
+ return new FebsResponse().success().message("退款成功");
+ }
+
}
diff --git a/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java b/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
index 1125bb7..3c6d58d 100644
--- a/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
+++ b/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
@@ -3,10 +3,9 @@
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.SpringContextHolder;
-import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
-import cc.mrbird.febs.pay.model.JsApiPayBusiness;
-import cc.mrbird.febs.pay.model.JsApiPayReqData;
-import cc.mrbird.febs.pay.model.JsApiPayResData;
+import cc.mrbird.febs.pay.model.*;
+import cc.mrbird.febs.pay.service.impl.RefundService;
+import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -46,9 +45,9 @@
JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
String idAddr = getIpAddr(WebUtil.getRequest());
- String mchID = WechatConfigure.WECHARPAY_MCHID;
- String paySecret = WechatConfigure.WECHARPAY_SECRET;
- String appId = WechatConfigure.MINIPROGRAM_APPID;
+ String mchID = xcxProperties.getWecharpayMchid();
+ String paySecret = xcxProperties.getWecharpaySecret();
+ String appId = xcxProperties.getXcxAppid();
JsApiPayReqData jsApiPayReqData = new JsApiPayReqData(
appId, mchID, paySecret, notifyUrl, desc,
@@ -81,48 +80,48 @@
* @param opUserID 操作员id,默认为商户号
* @return
*/
-// public boolean comRefund(String outTradeNo, String outRefundNo,int totalFee,
-// int refundFee, String opUserID){
-// LogUtil.info("#---outTradeNo:{}#---outRefundNo:{}#---totalFee:{}#---refundFee:{}",
-// outTradeNo,outRefundNo,totalFee,refundFee);
-// BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_MCHID, HostInterceptor.getCompanyId());
-// if(opUserID==null){
-// opUserID=mchID.getParamValue();
-// }
-// RefundResData result=null;
-// boolean flag=false;
-// try {
-// JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
-// Long companyId=HostInterceptor.getCompanyId();
-// BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId);
-// BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId);
-// BusParameterSettings certLocalPath = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_CERTLOCAL_PATH, companyId);
-//
-// RefundReqData refundReqData=new RefundReqData(mchID.getParamValue(),appId.getParamValue(),paySecret.getParamValue(), outTradeNo, outRefundNo, totalFee, refundFee,opUserID);
-// RefundService refundService=new RefundService();
-// HttpsRequest2 request2= (HttpsRequest2) refundService.getServiceRequest();
-// request2.setCertLocalPath(certLocalPath.getParamValue());
-// request2.setMchId(mchID.getParamValue());
-//
-// result = jsApiPayBusiness.refundComOrder(refundService, refundReqData);
-// LogUtil.info("#退款,企业付款到个人---result:{}",result);
-// //如果返回余额不足时
-// if (StringUtils.equals(AppConstance.REFUND_FAIL_NOTENOUGH, result.getErr_code())) {
-// LogUtil.info("#退款失败,{}!", "商户余额不足");
-// throw new GlobleException("退款失败,请联系管理员!");
-// }
-// } catch (Exception e) {
-// LogUtil.error("#企业付款到个人异常#退款#outTradeNo:{}#opUserID:{}", e, outTradeNo,opUserID);
-// }
-//
-// if (result.getResult_code().equals(WechatConfigure.SUCCESS)) {
-// flag=true;
-// }else{
-// flag=false;
-// throw new GlobleException(result.getErr_code_des());
-// }
-// return flag;
-// }
+ public boolean comRefund(String outTradeNo, String outRefundNo,int totalFee,
+ int refundFee, String opUserID){
+ log.info("#---outTradeNo:{}#---outRefundNo:{}#---totalFee:{}#---refundFee:{}",
+ outTradeNo,outRefundNo,totalFee,refundFee);
+
+ String mchID = xcxProperties.getWecharpayMchid();
+ if(opUserID==null){
+ opUserID=mchID;
+ }
+ RefundResData result=null;
+ boolean flag=false;
+ try {
+ JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
+ String paySecret = xcxProperties.getWecharpaySecret();
+ String appId = xcxProperties.getXcxAppid();
+ String certLocalPath = xcxProperties.getCertLocalPath();
+
+ RefundReqData refundReqData=new RefundReqData(mchID,appId,paySecret, outTradeNo, outRefundNo, totalFee, refundFee,opUserID);
+ RefundService refundService=new RefundService();
+ HttpsRequest2 request2= (HttpsRequest2) refundService.getServiceRequest();
+ request2.setCertLocalPath(certLocalPath);
+ request2.setMchId(mchID);
+
+ result = jsApiPayBusiness.refundComOrder(refundService, refundReqData);
+ log.info("#退款,企业付款到个人---result:{}",result);
+ //如果返回余额不足时,商户余额不足时微信返回状态码(退款失败时)
+ if (StrUtil.equals("NOTENOUGH", result.getErr_code())) {
+ log.info("#退款失败,{}!", "商户余额不足");
+ flag=false;
+ }
+ } catch (Exception e) {
+ log.error("#企业付款到个人异常#退款#outTradeNo:{}#opUserID:{}", e, outTradeNo,opUserID);
+ flag=false;
+ }
+
+ if (result.getResult_code().equals("SUCCESS")) {
+ flag=true;
+ }else{
+ flag=false;
+ }
+ return flag;
+ }
/**@Description 支付获取远程设备的ip
@date 2017年6月27日
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 09edaa3..8cba712 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -69,3 +69,6 @@
xcx_secret: 71403646f666f9b9dca308d4f357765c
debug: true
wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback
+ certLocalPath: /home/xuncongCert/apiclient_cert.p12
+ wecharpayMchid: 1605533690
+ wecharpaySecret: CSxc168888CSxc168888CSxc168888xc
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 561c2b7..ca0815b 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -63,5 +63,8 @@
wechar_login_url: https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
xcx_appid: wx5cc58f796224af61
xcx_secret: 71403646f666f9b9dca308d4f357765c
- debug: false
+ debug: true
wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback
+ certLocalPath: /home/xuncongCert/apiclient_cert.p12
+ wecharpayMchid: 1605533690
+ wecharpaySecret: CSxc168888CSxc168888CSxc168888xc
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index dfdbd49..17463e2 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -65,3 +65,6 @@
xcx_secret: 71403646f666f9b9dca308d4f357765c
debug: true
wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback
+ certLocalPath: /home/xuncongCert/apiclient_cert.p12
+ wecharpayMchid: 1605533690
+ wecharpaySecret: CSxc168888CSxc168888CSxc168888xc
--
Gitblit v1.9.1