|
|
@@ -2,14 +2,18 @@ package com.cyksj.service.register.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.cyksj.common.exception.BusinessRuntimeException;
|
|
|
import com.cyksj.common.snowflake.Sequence;
|
|
|
import com.cyksj.common.util.Codec;
|
|
|
import com.cyksj.common.util.Jsons;
|
|
|
+import com.cyksj.common.util.Xmls;
|
|
|
import com.cyksj.config.WeChatConfig;
|
|
|
import com.cyksj.dto.RedisKey;
|
|
|
+import com.cyksj.dto.Result;
|
|
|
+import com.cyksj.enums.GatewayResponse;
|
|
|
import com.cyksj.mapper.RegisterOrderDonMapper;
|
|
|
import com.cyksj.mapper.UserMapper;
|
|
|
import com.cyksj.model.dto.H5JsPayParams;
|
|
|
@@ -18,6 +22,7 @@ import com.cyksj.model.entity.SysConfig;
|
|
|
import com.cyksj.model.entity.User;
|
|
|
import com.cyksj.model.manage.request.RegisterReq;
|
|
|
import com.cyksj.model.request.OrderAttach;
|
|
|
+import com.cyksj.model.request.WxOrderRefundReq;
|
|
|
import com.cyksj.redis.RedisService;
|
|
|
import com.cyksj.service.register.RegisterOrderDonService;
|
|
|
import com.cyksj.service.register.SpotifyService;
|
|
|
@@ -179,4 +184,68 @@ public class RegisterOrderDonServiceImpl extends ServiceImpl<RegisterOrderDonMap
|
|
|
|
|
|
this.updateById(order);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Result<String> wxRefund(WxOrderRefundReq wxOrderRefundReq) throws Exception {
|
|
|
+ RegisterOrderDon registerOrderDon = this.getById(wxOrderRefundReq.getOrderId());
|
|
|
+ if (registerOrderDon == null) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该订单不存在");
|
|
|
+ }
|
|
|
+ if (registerOrderDon.getStatus() == RegisterOrderDon.Status.refund) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该订单已退款");
|
|
|
+ }
|
|
|
+ if (registerOrderDon.getStatus() != RegisterOrderDon.Status.error && registerOrderDon.getStatus() != RegisterOrderDon.Status.hasPayment) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该订单状态不允许退款");
|
|
|
+ }
|
|
|
+ if (registerOrderDon.getMoney().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该订单金额为0,无需退款");
|
|
|
+ }
|
|
|
+ if (!redisService.setNx(String.format("%s", wxOrderRefundReq.getOrderId()), wxOrderRefundReq.getOrderId(), 10l)) {
|
|
|
+ throw BusinessRuntimeException.getInstance("请勿重复点击,正在退款中..");
|
|
|
+ }
|
|
|
+ long time = System.currentTimeMillis();
|
|
|
+ //退款订单号
|
|
|
+ String outRefundNo = Codec.DoDigest.custom()
|
|
|
+ .setAlgorithm(Codec.DoDigest.Algorithm.MD5)
|
|
|
+ .setStringData(time + String.valueOf(registerOrderDon.getId()))
|
|
|
+ .toHexString();
|
|
|
+ wxOrderRefundReq.setRefundMoney(registerOrderDon.getMoney());
|
|
|
+ weChatService.refundWxOrder(weChatConfig.getAppid(),
|
|
|
+ registerOrderDon.getTransactionId(),
|
|
|
+ outRefundNo,
|
|
|
+ registerOrderDon.getMoney(),
|
|
|
+ wxOrderRefundReq.getRefundMoney(),
|
|
|
+ weChatConfig.getDomain() + "manage/register/wx/refund/notify");
|
|
|
+ //修改订单状态
|
|
|
+ registerOrderDon.setStatus(RegisterOrderDon.Status.refund);
|
|
|
+ this.updateById(registerOrderDon);
|
|
|
+ return GatewayResponse.SUCCESS.newBuilder().toResult("退款成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void wxRefundNotify(Map<String, String> map) throws Exception {
|
|
|
+ // 对退款数据 解密
|
|
|
+ String md5Key = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.MD5).setStringData(weChatConfig.getShopKey()).toHexString();
|
|
|
+ String reqInfoXml = Codec.DoCipher.custom().setAlgorithm(Codec.DoCipher.Trans.AES_ECB_PKCS7Padding).setBase64Data(map.get("req_info")).setStringKey(md5Key).ofDecrypt().toText();
|
|
|
+ log.info("=== 退款数据解密: \n {}", reqInfoXml);
|
|
|
+ Map<String, String> reqInfoMap = Xmls.toMap(reqInfoXml);
|
|
|
+ // 退款失败
|
|
|
+ if (StrUtil.equals("CHANGE", reqInfoMap.get("refund_status"))) {
|
|
|
+ throw BusinessRuntimeException.getInstance("退款异常.");
|
|
|
+ } else if (StrUtil.equals("REFUNDCLOSE", reqInfoMap.get("refund_status"))) {
|
|
|
+ throw BusinessRuntimeException.getInstance("退款关闭.");
|
|
|
+ }
|
|
|
+ /* 此处处理业务逻辑 */
|
|
|
+ String outRefundNo = reqInfoMap.get("out_refund_no");
|
|
|
+ String transactionId = reqInfoMap.get("transaction_id");
|
|
|
+ RegisterOrderDon registerOrderDon = this.getOne(Wrappers.lambdaQuery(RegisterOrderDon.class).eq(RegisterOrderDon::getTransactionId, transactionId).last("limit 1"));
|
|
|
+ if (registerOrderDon == null) {
|
|
|
+ log.error("退款回调,transactionId:{}订单不存在", transactionId);
|
|
|
+ }
|
|
|
+ if (registerOrderDon.getStatus() != RegisterOrderDon.Status.refund) {
|
|
|
+ registerOrderDon.setStatus(RegisterOrderDon.Status.refund);
|
|
|
+ this.updateById(registerOrderDon);
|
|
|
+ }
|
|
|
+ log.info("微信退款: 退款单号[{}] 退款成功.", outRefundNo);
|
|
|
+ }
|
|
|
}
|