| @@ -130,35 +130,6 @@ public class WxCouponOrderController extends BaseController { | |||
| } | |||
| } | |||
| @ApiOperation(value = "退券接口", notes = "{\"couponOrderId\":\"string\"}") | |||
| @PostMapping("refund") | |||
| public ResultData refund(@RequestBody Map<String, String> paramMap) { | |||
| logger.info(paramMap.toString()); | |||
| String couponOrderIdStr = paramMap.get("couponOrderId"); | |||
| if (StringUtils.isBlank(couponOrderIdStr)) { | |||
| logger.error("couponOrderId不能为空: " + paramMap.toString()); | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||
| } | |||
| Long couponOrderId = 0L; | |||
| try { | |||
| couponOrderId = Long.valueOf(couponOrderIdStr); | |||
| } catch (NumberFormatException e) { | |||
| logger.error("couponOrderId参数不正确: " + paramMap.toString()); | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||
| } | |||
| try { | |||
| ResultData rd = wxCouponOrderService.refund(couponOrderId, getUser().getId()); | |||
| return rd; | |||
| } catch (MallinkException e) { | |||
| logger.error("退券异常: " + e.getMessage()); | |||
| return new ResultData(e.getErrorCode(), e.getMessage()); | |||
| } catch (Exception e) { | |||
| logger.error("退券异常: " + e.getMessage()); | |||
| return new ResultData(ErrorCode.REFUND_ORDER_ERROR, e.getMessage()); | |||
| } | |||
| } | |||
| @ApiOperation(value = "根据couponOrderId查询接口", notes = "{\"couponOrderId\":\"string\"}") | |||
| @PostMapping("/findById") | |||
| public ResultData findById(@RequestBody Map<String, String> paramMap) { | |||
| @@ -8,6 +8,7 @@ import com.simple.config.PayProperty; | |||
| import com.simple.domain.po.*; | |||
| import com.simple.enums.EnumPayStatus; | |||
| import com.simple.enums.EnumPayWay; | |||
| import com.simple.enums.EnumRefundWay; | |||
| import com.simple.exception.MallinkException; | |||
| import com.simple.service.*; | |||
| import io.swagger.annotations.Api; | |||
| @@ -42,68 +43,29 @@ public class WxRefundOrderController extends BaseController { | |||
| @Autowired | |||
| private WxRefundOrderService wxRefundOrderService; | |||
| @ApiOperation(value = "发起退款", notes = "{\"orderId\":\"string\"}") | |||
| @ApiOperation(value = "退券退款", notes = "{\"couponOrderId\":\"string\"}") | |||
| @PostMapping("/create") | |||
| public ResultData create(@RequestBody Map<String, String> paramMap) { | |||
| // couponOrder发起退款 | |||
| logger.info("/api/refund/create" + paramMap.toString()); | |||
| //Assert.notNull(wxRefundOrder.getName(), "角色名不能为空"); | |||
| //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); | |||
| String orderIdStr = paramMap.get("orderId"); | |||
| if (StringUtils.isBlank(orderIdStr)) { | |||
| logger.error("orderId不能为空: " + paramMap.toString()); | |||
| logger.info(paramMap.toString()); | |||
| String couponOrderIdStr = paramMap.get("couponOrderId"); | |||
| if (StringUtils.isBlank(couponOrderIdStr)) { | |||
| logger.error("couponOrderId不能为空: " + paramMap.toString()); | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||
| } | |||
| Long orderId = 0L; | |||
| Long couponOrderId = 0L; | |||
| try { | |||
| orderId = Long.valueOf(orderIdStr); | |||
| couponOrderId = Long.valueOf(couponOrderIdStr); | |||
| } catch (NumberFormatException e) { | |||
| logger.error("orderId参数不正确: " + paramMap.toString()); | |||
| logger.error("couponOrderId参数不正确: " + paramMap.toString()); | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||
| } | |||
| WxOrder order = null; | |||
| try { | |||
| order = wxOrderService.getById(orderId); | |||
| } catch (Exception e) { | |||
| logger.error("订单不存在: " + orderIdStr); | |||
| return new ResultData(ErrorCode.ORDER_IS_NOT_FIND.getCode(), "订单不存在: " + orderIdStr); | |||
| } | |||
| if (order == null) { | |||
| logger.error("订单不存在: " + orderIdStr); | |||
| return new ResultData(ErrorCode.ORDER_IS_NOT_FIND.getCode(), "订单不存在: " + orderIdStr); | |||
| } | |||
| if (order.getPayment() <= 0) { | |||
| logger.error("订单支付金额小于等于0: " + order.toString()); | |||
| throw new MallinkException(ErrorCode.REFUND_PAY_ORDER_IS_ZERO); | |||
| } | |||
| WxPayOrder payOrderQ = new WxPayOrder(); | |||
| payOrderQ.setCUserId(order.getCUserId()); | |||
| payOrderQ.setOrderId(orderId); | |||
| payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); | |||
| WxPayOrder payOrder = null; | |||
| try { | |||
| payOrder = wxPayOrderService.getByObj(payOrderQ); | |||
| } catch (Exception e) { | |||
| logger.error("支付订单不存在(payOrder不存在)"); | |||
| return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND); | |||
| } | |||
| if (payOrder == null) { | |||
| logger.error("支付订单不存在(payOrder不存在)"); | |||
| return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND); | |||
| } | |||
| WxRefundOrder refundOrderQ = new WxRefundOrder(); | |||
| refundOrderQ.setPayOrderNo(String.valueOf(payOrder.getId())); | |||
| refundOrderQ.setOrderId(orderId); | |||
| WxMerchantBUser bUser = getUser(); | |||
| WxAppinfo appinfo = getAppInfo(bUser.getAppId()); | |||
| try { | |||
| wxRefundOrderService.createRefundOrder(payProperty.isReal(), appinfo, refundOrderQ, payOrder, EnumPayWay.PAY_WAY_WEAPP); | |||
| wxRefundOrderService.createRefundOrder(payProperty.isReal(), appinfo, couponOrderId, EnumRefundWay.B, bUser.getId()); | |||
| return new ResultData(); | |||
| } catch (MallinkException e) { | |||
| logger.error(e.getMessage()); | |||
| @@ -31,34 +31,6 @@ public class WxCouponOrderController extends BaseController { | |||
| @Autowired | |||
| private WxCouponOrderService wxCouponOrderService; | |||
| @ApiOperation(value = "退券接口", notes = "{\"couponOrderId\":\"string\"}") | |||
| @PostMapping("refund") | |||
| public ResultData refund(@RequestBody Map<String, String> paramMap) { | |||
| logger.info(paramMap.toString()); | |||
| String couponOrderIdStr = paramMap.get("couponOrderId"); | |||
| if (StringUtils.isBlank(couponOrderIdStr)) { | |||
| logger.error("couponOrderId不能为空: " + paramMap.toString()); | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponOrderId不能为空"); | |||
| } | |||
| Long couponOrderId = 0L; | |||
| try { | |||
| couponOrderId = Long.valueOf(couponOrderIdStr); | |||
| } catch (NumberFormatException e) { | |||
| logger.error("couponOrderId参数不正确: " + paramMap.toString()); | |||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponOrderId参数不正确"); | |||
| } | |||
| try { | |||
| ResultData rd = wxCouponOrderService.refund(couponOrderId, getUser().getId()); | |||
| return rd; | |||
| } catch (MallinkException e) { | |||
| logger.error("退券异常: " + e.getMessage()); | |||
| return new ResultData(e.getErrorCode(), e.getMessage()); | |||
| } catch (Exception e) { | |||
| logger.error("退券异常: " + e.getMessage()); | |||
| return new ResultData(ErrorCode.REFUND_ORDER_ERROR, e.getMessage()); | |||
| } | |||
| } | |||
| @ApiOperation("券包分页列表接口") | |||
| @GetMapping("list") | |||
| @ApiImplicitParams({ | |||
| @@ -113,6 +113,7 @@ public enum ErrorCode{ | |||
| COUPON_ORDER_IS_USED(4001, "卡券已核销"), | |||
| COUPON_ORDER_IS_OVER_TIME(4002, "卡券已过期"), | |||
| COUPON_ORDER_IS_INVALID(4003, "卡券已经作废"), | |||
| COUPON_ORDER_BUSER_IS_NULL(4004, "卡券B端用户不存在"), | |||
| /** | |||
| @@ -0,0 +1,37 @@ | |||
| package com.simple.enums; | |||
| /** | |||
| * Created by Stormeye on 2018/08/09. | |||
| */ | |||
| public enum EnumRefundWay { | |||
| B(0, "B端小程序"), | |||
| ADMIN(1, "WEB端小程序"), | |||
| C(2, "C端小程序"), | |||
| AUTO(3, "自动退款"); | |||
| public static EnumRefundWay getEnum(Integer code) { | |||
| for (EnumRefundWay value : values()) { | |||
| if (value.getCode().equals(code)) { | |||
| return value; | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| private Integer code; | |||
| private String message; | |||
| EnumRefundWay(Integer code, String message) { | |||
| this.code = code; | |||
| this.message = message; | |||
| } | |||
| public Integer getCode() { | |||
| return code; | |||
| } | |||
| public String getMessage() { | |||
| return message; | |||
| } | |||
| } | |||
| @@ -62,15 +62,6 @@ public interface WxCouponOrderService { | |||
| */ | |||
| ResultData verify(Long couponOrderId, Long bUserId); | |||
| /** | |||
| * 根据主键couponOrderId(券码)退券(款) | |||
| * | |||
| * @param couponOrderId | |||
| * @param bUserId 退券(款)人(登录用户) | |||
| */ | |||
| ResultData refund(Long couponOrderId, Long bUserId); | |||
| /** | |||
| * 根据日期 b用户查券list | |||
| * | |||
| @@ -7,6 +7,7 @@ import com.simple.domain.po.WxAppinfo; | |||
| import com.simple.domain.po.WxPayOrder; | |||
| import com.simple.domain.po.WxRefundOrder; | |||
| import com.simple.enums.EnumPayWay; | |||
| import com.simple.enums.EnumRefundWay; | |||
| public interface WxRefundOrderService { | |||
| @@ -14,12 +15,12 @@ public interface WxRefundOrderService { | |||
| * 创建退款订单 | |||
| * @param isReal | |||
| * @param appInfo | |||
| * @param record 退款订单请求 | |||
| * @param payOrder 支付订单 | |||
| * @param payWay | |||
| * @param couponOrderId 券包Id | |||
| * @param refundWay 退款来源 | |||
| * @param bUserId b端退款Id,auto,admin,self可为null | |||
| * @return | |||
| */ | |||
| ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, WxRefundOrder record, WxPayOrder payOrder, EnumPayWay payWay); | |||
| ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, Long couponOrderId, EnumRefundWay refundWay, Long bUserId); | |||
| /** | |||
| * 退款订单查询 | |||
| @@ -12,6 +12,7 @@ import com.simple.domain.vo.CUserDateAmountVo; | |||
| import com.simple.domain.vo.WxCouponOrderBVo; | |||
| import com.simple.domain.vo.WxCouponOrderCVo; | |||
| import com.simple.enums.EnumCouponOrderStatus; | |||
| import com.simple.enums.EnumRefundStatus; | |||
| import com.simple.exception.MallinkException; | |||
| import com.simple.mapper.*; | |||
| import com.simple.service.WxCouponOrderService; | |||
| @@ -57,8 +58,6 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findList(record)); | |||
| } | |||
| @Override | |||
| public WxCouponOrder getById(Long id) { | |||
| return wxCouponOrderMapper.selectByPrimaryKey(id); | |||
| @@ -320,66 +319,8 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); | |||
| } | |||
| return new ResultData(wxCouponOrder); | |||
| } | |||
| @Override | |||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
| public ResultData refund(Long couponOrderId, Long bUserId) { | |||
| WxCouponOrder wxCouponOrder = wxCouponOrderMapper.selectByPrimaryKey(couponOrderId); | |||
| if(wxCouponOrder == null){ | |||
| logger.error("券ID不存在:"+ couponOrderId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); | |||
| } | |||
| WxOrder wxOrder = wxOrderMapper.selectByPrimaryKey(wxCouponOrder.getOrderId()); | |||
| if(bUserId != wxCouponOrder.getCUserId()) { | |||
| // TODO web管理端退款 | |||
| // B端用户退款 | |||
| WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectByPrimaryKey(bUserId.longValue()); | |||
| if (wxMerchantBUser == null) { | |||
| logger.error("操作员ID不存在:" + bUserId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); | |||
| } | |||
| if (!wxOrder.getMerchantId().equals(wxMerchantBUser.getMerchantId())) { | |||
| logger.error("券: couponMerchantId-" + wxOrder.getMerchantId() + "核销: couponMerchantId-" + wxMerchantBUser.getMerchantId()); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); | |||
| } | |||
| } else { | |||
| logger.info("自己发起退款, userId: " + bUserId); | |||
| } | |||
| if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode())) { | |||
| logger.error("已过期: couponOrder-" + couponOrderId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); | |||
| } | |||
| if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode())) { | |||
| logger.error("已退款: couponOrder-" + couponOrderId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); | |||
| } | |||
| if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode())) { | |||
| logger.error("已经核销过的券: couponOrder-" + couponOrderId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED); | |||
| } | |||
| try { | |||
| wxCouponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode()); //3退款,券作废 | |||
| wxCouponOrder.setBUserId(bUserId); | |||
| wxCouponOrder.setUpdateDate(new Date()); | |||
| wxCouponOrderMapper.updateByPrimaryKeySelective(wxCouponOrder); | |||
| } catch (Exception e) { | |||
| logger.error("db failed: couponOrder-" + couponOrderId + ", e:" + e.getMessage()); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); | |||
| } | |||
| // 库存回复+1 | |||
| wxOrderService.stockBack(wxOrder); | |||
| return new ResultData(wxCouponOrder); | |||
| } | |||
| @Override | |||
| public List<CUserDateAmountVo> queryPriceTotalGroup(String tenantId, Date startTime, Date endTime) { | |||
| @@ -10,9 +10,7 @@ import com.simple.common.ErrorCode; | |||
| import com.simple.common.Result; | |||
| import com.simple.common.ResultData; | |||
| import com.simple.domain.po.*; | |||
| import com.simple.enums.EnumOrderStatus; | |||
| import com.simple.enums.EnumPayWay; | |||
| import com.simple.enums.EnumRefundStatus; | |||
| import com.simple.enums.*; | |||
| import com.simple.exception.MallinkException; | |||
| import com.simple.mapper.*; | |||
| import com.simple.pay.WxPay; | |||
| @@ -53,6 +51,12 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { | |||
| @Autowired | |||
| WxOrderService wxOrderService; | |||
| @Autowired | |||
| WxCouponOrderMapper wxCouponOrderMapper; | |||
| @Autowired | |||
| WxMerchantBUserMapper wxMerchantBUserMapper; | |||
| JSONObject errorRefundReqMap = JSON.parseObject("{\n" + | |||
| " \"SYSTEMERROR\": {\n" + | |||
| " \"detail\": \"接口返回错误\",\n" + | |||
| @@ -210,28 +214,105 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { | |||
| "}"); | |||
| @Override | |||
| public ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, WxRefundOrder record, WxPayOrder payOrder, EnumPayWay payWay) { | |||
| WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); | |||
| if (StringUtils.isBlank(payAccount.getApiKey())) { | |||
| logger.error("支付密钥为空"); | |||
| throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND.getCode(), "支付密钥为空,请联系商城管理员"); | |||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
| public ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, Long couponOrderId, EnumRefundWay refundWay, Long bUserId) { | |||
| WxCouponOrder wxCouponOrder = wxCouponOrderMapper.selectByPrimaryKey(couponOrderId); | |||
| if(wxCouponOrder == null){ | |||
| logger.error("券ID不存在:"+ couponOrderId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); | |||
| } | |||
| if (StringUtils.isBlank(payAccount.getCertPath())) { | |||
| logger.error("证书路径为空"); | |||
| throw new MallinkException(ErrorCode.CERT_PATH_NOT_FOUND.getCode(), "证书路径为空,请联系商城管理员"); | |||
| WxOrder wxOrder = wxOrderMapper.selectByPrimaryKey(wxCouponOrder.getOrderId()); | |||
| if (refundWay == EnumRefundWay.B) { | |||
| logger.info("B端发起退款: bUserId-" + bUserId); | |||
| if (bUserId == null || bUserId ==0 ) { | |||
| logger.error("B端用户不存在:"+ bUserId); | |||
| throw new MallinkException(ErrorCode.USER_IS_EMPTY); | |||
| } | |||
| // B端用户退款检查一下商户 | |||
| WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectByPrimaryKey(bUserId); | |||
| if (wxMerchantBUser == null) { | |||
| logger.error("操作员ID不存在:" + bUserId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_BUSER_IS_NULL); | |||
| } | |||
| if (!wxOrder.getMerchantId().equals(wxMerchantBUser.getMerchantId())) { | |||
| logger.error("券: couponMerchantId-" + wxOrder.getMerchantId() + "核销: couponMerchantId-" + wxMerchantBUser.getMerchantId()); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_BUSER_IS_NULL); | |||
| } | |||
| } else if (refundWay == EnumRefundWay.ADMIN) { | |||
| logger.info("ADMIN端发起退款: bUserId-" + bUserId); | |||
| } else if (refundWay == EnumRefundWay.AUTO) { | |||
| logger.info("auto端发起退款"); | |||
| } else { | |||
| logger.info("自己发起退款: cUserId-" + bUserId); | |||
| } | |||
| // check 是否有退款订单 | |||
| List<WxRefundOrder> list = wxRefundOrderMapper.findList(record); | |||
| if (wxOrder.getPayment() <= 0) { | |||
| logger.error("订单支付金额小于等于0: " + wxOrder.toString()); | |||
| throw new MallinkException(ErrorCode.REFUND_PAY_ORDER_IS_ZERO); | |||
| } | |||
| if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode())) { | |||
| logger.error("已过期: couponOrder-" + couponOrderId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); | |||
| } | |||
| if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode())) { | |||
| logger.error("已退款: couponOrder-" + couponOrderId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); | |||
| } | |||
| if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode())) { | |||
| logger.error("已经核销过的券: couponOrder-" + couponOrderId); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED); | |||
| } | |||
| // 更改 couponOrder 状态 | |||
| Date currentDate = new Date(); | |||
| wxCouponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode()); //3退款,券作废 | |||
| if (refundWay == EnumRefundWay.B) { | |||
| wxCouponOrder.setBUserId(bUserId); | |||
| } else if (refundWay == EnumRefundWay.AUTO) { | |||
| wxCouponOrder.setBUserId(0L); // 自动退款, 设置bUserId为0 | |||
| } else if (refundWay == EnumRefundWay.ADMIN) { | |||
| wxCouponOrder.setBUserId(1L); // ADMIN发起退款, 设置bUserId为1 | |||
| } else { | |||
| wxCouponOrder.setBUserId(2L); // 自己发起退款, 设置bUserId为2 | |||
| } | |||
| wxCouponOrder.setUpdateDate(currentDate); | |||
| try { | |||
| wxCouponOrderMapper.updateByPrimaryKeySelective(wxCouponOrder); | |||
| } catch (Exception e) { | |||
| logger.error("db failed: couponOrder-" + couponOrderId + ", e:" + e.getMessage()); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); | |||
| } | |||
| // 库存回复+1 | |||
| wxOrderService.stockBack(wxOrder); | |||
| // 创建refundOrder | |||
| WxPayOrder payOrderQ = new WxPayOrder(); | |||
| payOrderQ.setTenantId(appInfo.getTenantId()); | |||
| payOrderQ.setCUserId(wxOrder.getCUserId()); | |||
| payOrderQ.setOrderId(wxOrder.getId()); | |||
| payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); | |||
| WxPayOrder payOrder = null; | |||
| List<WxPayOrder> list = wxPayOrderMapper.findList(payOrderQ); | |||
| if (list.size() > 0) { | |||
| logger.error("退款订单已存在, 无法再提交退款申请"); | |||
| throw new MallinkException(ErrorCode.REFUND_ORDER_EXIST.getCode(), "退款订单已存在, 无法再提交退款申请"); | |||
| if (list.size() > 1) { | |||
| logger.error("TODO: payOrder成功记录应该只有一条????!!!"); | |||
| } | |||
| logger.warn(""); | |||
| payOrder = list.get(0); | |||
| } | |||
| if (payOrder == null) { | |||
| logger.error("支付订单不存在(payOrder不存在)"); | |||
| return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND); | |||
| } | |||
| WxRefundOrder record = new WxRefundOrder(); | |||
| record.setPayOrderNo(String.valueOf(payOrder.getId())); | |||
| record.setOrderId(wxOrder.getId()); | |||
| // 创建退款订单 | |||
| final IdWorker idWorker = IdWorker.get(); | |||
| Long id = idWorker.nextId(); | |||
| String out_refund_id = String.valueOf(id); | |||
| Date currentDate = new Date(); | |||
| record.setId(id); | |||
| record.setTenantId(appInfo.getTenantId()); | |||
| @@ -255,8 +336,23 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { | |||
| logger.error("退款订单数据库插入出错: " + record.toString()); | |||
| throw new MallinkException(ErrorCode.DB_FAIL); | |||
| } | |||
| WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); | |||
| if (StringUtils.isBlank(payAccount.getApiKey())) { | |||
| logger.error("支付密钥为空"); | |||
| throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND.getCode(), "支付密钥为空,请联系商城管理员"); | |||
| } | |||
| if (StringUtils.isBlank(payAccount.getCertPath())) { | |||
| logger.error("证书路径为空"); | |||
| throw new MallinkException(ErrorCode.CERT_PATH_NOT_FOUND.getCode(), "证书路径为空,请联系商城管理员"); | |||
| } | |||
| // check 是否有退款订单 | |||
| List<WxRefundOrder> refundList = wxRefundOrderMapper.findList(record); | |||
| if (refundList.size() > 0) { | |||
| logger.error("退款订单已存在, 无法再提交退款申请"); | |||
| throw new MallinkException(ErrorCode.REFUND_ORDER_EXIST.getCode(), "退款订单已存在, 无法再提交退款申请"); | |||
| } | |||
| // 退款申请 | |||
| // 向微信提交退款申请 | |||
| String noncestr = Utility.generate32UUID(); | |||
| WxRefundOrderP wxRefundOrderP = new WxRefundOrderP(); | |||
| wxRefundOrderP.setAppid(appInfo.getAppId()); | |||
| @@ -268,11 +364,17 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { | |||
| wxRefundOrderP.setOut_refund_no(out_refund_id); | |||
| wxRefundOrderP.setTotal_fee(record.getTotalFee()); | |||
| wxRefundOrderP.setRefund_fee(record.getRefundFee()); | |||
| wxRefundOrderP.setRefund_desc("B端商户退款"); | |||
| if (refundWay == EnumRefundWay.B) { | |||
| wxRefundOrderP.setRefund_desc("B端商户退款"); | |||
| } else if (refundWay == EnumRefundWay.ADMIN) { | |||
| wxRefundOrderP.setRefund_desc("管理端商户退款"); | |||
| } else { | |||
| wxRefundOrderP.setRefund_desc("用户自己退款"); | |||
| } | |||
| wxRefundOrderP.setNotify_url(payAccount.getNotifyUrl() + "/refund"); | |||
| if (isReal) { | |||
| Map signMap = new HashMap(); | |||
| Map signMap = null; | |||
| try { | |||
| signMap = BeanUtils.toStringMap(wxRefundOrderP); | |||
| } catch (Exception e) { | |||