This commit is contained in:
wyn
2026-04-30 09:54:18 +08:00
parent 6bc3f33d3d
commit a4edccc7de
15 changed files with 278 additions and 117 deletions

View File

@@ -126,6 +126,7 @@ public class WeChatPayController {
*/
@RequestMapping("/refund" )
public R refund(@RequestBody Map<String,Object> map){
return R.ok(wxpayService.refund(map));
}
@@ -135,11 +136,13 @@ public class WeChatPayController {
*/
@PostMapping("/refundNotify")
public void refundNotify(HttpServletRequest request){
wxpayService.refundNotify(request);
}
@PostMapping("/lsRefundNotify")
public void lsRefundNotify(HttpServletRequest request){
wxpayService.lsRefundNotify(request);
}

View File

@@ -0,0 +1,21 @@
package com.peanut.modules.pay.weChatPay.dto;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class WeChatRefundInfo implements Serializable {
private String orderSn;
private Integer orderId;
private String orderType;
private String refundNo;
private BigDecimal totalAmount;
private BigDecimal refundAmount;
private String remark;
private String appName;
private String currency;
private String notify_url;
private int refundId;
}

View File

@@ -2,6 +2,7 @@ package com.peanut.modules.pay.weChatPay.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.peanut.modules.common.entity.PayWechatOrderEntity;
import com.peanut.modules.pay.weChatPay.dto.WeChatRefundInfo;
import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo;
import org.springframework.stereotype.Service;
@@ -19,6 +20,8 @@ public interface WxpayService extends IService<PayWechatOrderEntity> {
String refund(Map<String,Object> map);
void refund(WeChatRefundInfo refundInfo);
void refundNotify(HttpServletRequest request);
void lsRefundNotify(HttpServletRequest request);

View File

@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.peanut.common.utils.ShiroUtils;
import com.peanut.config.Constants;
import com.peanut.modules.book.service.BookBuyConfigService;
import com.peanut.modules.book.service.BuyOrderService;
import com.peanut.modules.book.service.MyUserService;
@@ -21,11 +20,13 @@ import com.peanut.modules.master.service.UserCourseBuyService;
import com.peanut.modules.pay.refund.entity.PayRefundOrder;
import com.peanut.modules.pay.refund.service.PayRefundOrderService;
import com.peanut.modules.pay.weChatPay.config.WechatPayConfig;
import com.peanut.modules.pay.weChatPay.dto.WeChatRefundInfo;
import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo;
import com.peanut.modules.pay.weChatPay.service.WxpayService;
import com.peanut.modules.pay.weChatPay.util.HttpUtils;
import com.peanut.modules.pay.weChatPay.util.WechatPayValidator;
import com.peanut.modules.pay.weChatPay.util.WxPayUtil;
import com.qiniu.util.Json;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -79,10 +80,6 @@ public class WxpayServiceImpl extends ServiceImpl<PayWechatOrderDao, PayWechatOr
@Autowired
private JfTransactionDetailsDao jfTransactionDetailsDao;
@Autowired
private BuyOrderRefundService buyOrderRefundService;
@Autowired
private BuyOrderRefundLogService buyOrderRefundLogService;
@Autowired
private UserVipService userVipService;
@Autowired
private CouponService couponService;
@@ -94,6 +91,12 @@ public class WxpayServiceImpl extends ServiceImpl<PayWechatOrderDao, PayWechatOr
private AiVipLogService aiVipLogService;
@Autowired
private UserCourseBuyLogDao userCourseBuyLogDao;
@Autowired
private BuyOrderRefundLogService buyOrderRefundLogService;
@Autowired
private MyUserService myUserService;
@Autowired
private BuyOrderRefundService buyOrderRefundService;
@Override
public void prepay(WechatPaymentInfo paymentInfo){
@@ -141,6 +144,7 @@ public class WxpayServiceImpl extends ServiceImpl<PayWechatOrderDao, PayWechatOr
}else {
responseJson = wxPayUtil.doPostWexinV3(wechatPayConfig.getPayUrl(), json.toJSONString(),"");
}
System.out.println(responseJson);
String prepayId = responseJson.getString("prepay_id");
if (paymentInfo.getBuyOrderId() == null) {
payWechatOrderService.add(paymentInfo.getOrderSn(), prepayId);
@@ -355,6 +359,71 @@ public class WxpayServiceImpl extends ServiceImpl<PayWechatOrderDao, PayWechatOr
return responseJson.toJSONString();
}
@Override
public void refund(WeChatRefundInfo refundInfo) {
Map<String, Object> paramMap = new HashMap<>();
BigDecimal refund = new BigDecimal(refundInfo.getRefundAmount().toString());
//原订单总金额
BigDecimal total = refundInfo.getTotalAmount();
// 这里 * 100微信支付单位为 ‘分’
BigDecimal hand = new BigDecimal("100");
Map<String, Object> amountMap = new HashMap<>();
amountMap.put("refund", refund.multiply(hand));
amountMap.put("total", total.multiply(hand).intValue());
amountMap.put("currency", "CNY");
paramMap.put("amount", amountMap);
paramMap.put("out_refund_no", refundInfo.getRefundNo());
//微信支付订单号
paramMap.put("out_trade_no", refundInfo.getOrderSn());
//退款原因
paramMap.put("reason", refundInfo.getRemark());
String appid = "";
if (refundInfo.getAppName()==null||"".equals(refundInfo.getAppName())){
appid = wechatPayConfig.getAppId();
}else if ("zmzm".equals(refundInfo.getAppName())){
appid = wechatPayConfig.getZmzmappId();
} else if ("wumen".equals(refundInfo.getAppName())) {
appid = wechatPayConfig.getWumenappId();
} else if ("xlkj".equals(refundInfo.getAppName())) {
appid = wechatPayConfig.getXlkjappId();
} else if ("thyy".equals(refundInfo.getAppName())) {
appid = wechatPayConfig.getThyyappId();
}
// app id
paramMap.put("appid", appid);
String notify_url = wechatPayConfig.getRefundNotifyUrl();
String mchName = "";
if ("trainingClass".equals(refundInfo.getOrderType())||"lsorder".equals(refundInfo.getOrderType())) {
mchName = "LS";
notify_url = wechatPayConfig.getLsRefundNotifyUrl();
}
paramMap.put("notify_url", notify_url);
JSONObject json = JSONObject.parseObject(JSON.toJSONString(paramMap));
log.info("=======微信退款申请请求参数:{}", json.toJSONString());
log.info(">>>>>>>>>>App请求微信退款申请接口");
JSONObject responseJson = wxPayUtil.doPostWexinV3(wechatPayConfig.getRefundUrl(), json.toJSONString(),mchName);
// JSONObject responseJson = new JSONObject();
// responseJson.put("status","SUCCESS");
// responseJson.put("refund_id",System.currentTimeMillis());
System.out.println(responseJson);
log.info(">>>>>>>>>>>微信退款返回的信息是 resJson = {}", responseJson.toJSONString());
if ("SUCCESS".equals(responseJson.get("status"))){
buyOrderRefundLogService.insertRefundLog(refundInfo.getRefundId(),1,2);
BuyOrderRefund buyOrderRefund = buyOrderRefundService.getById(refundInfo.getRefundId());
buyOrderRefund.setWxRefundNo(responseJson.getString("refund_id"));
buyOrderRefundService.updateById(buyOrderRefund);
}else{
buyOrderRefundLogService.insertRefundLog(refundInfo.getRefundId(),1,3);
}
// return responseJson.toJSONString();
}
private void userCoinJf(BuyOrder order){
MyUserEntity userEntity = userService.getById(order.getUserId());
userEntity.setJf(userEntity.getJf().subtract(order.getJfDeduction()));
@@ -378,6 +447,18 @@ public class WxpayServiceImpl extends ServiceImpl<PayWechatOrderDao, PayWechatOr
// 解密resource中的通知数据
String resource = bodyMap.get("resource").toString();
Map<String, Object> resourceMap = WechatPayValidator.decryptFromResource(resource, wechatPayConfig.getApiV3Key(), 2);
/*BuyOrder orderFalse = buyOrderService.getOne(new QueryWrapper<BuyOrder>().eq("user_id",149299).orderByDesc("order_id"));
BuyOrderRefund refundFalse = buyOrderRefundService.getOne(new QueryWrapper<BuyOrderRefund>().eq("user_id",149299).orderByDesc("id"));
Map<String, Object> resourceMap = new HashMap<>();
resourceMap.put("refund_status","SUCCESS");
resourceMap.put("out_trade_no",orderFalse.getOrderSn());
resourceMap.put("refund_id",System.currentTimeMillis());
resourceMap.put("out_refund_no",refundFalse.getRefundNo());
Map<String,BigDecimal> amount = new HashMap<>();
amount.put("refund",orderFalse.getRealMoney());
resourceMap.put("amount",amount);*/
log.info("微信退款回调结果 msg={}",resourceMap);
if ("SUCCESS".equals(resourceMap.get("refund_status").toString())){
log.info(">>>>>>>>>>>微信退款成功!<<<<<<<<<<<<<");
@@ -385,15 +466,40 @@ public class WxpayServiceImpl extends ServiceImpl<PayWechatOrderDao, PayWechatOr
w.selectAll(BuyOrder.class);
w.leftJoin(PayWechatOrderEntity.class,PayWechatOrderEntity::getOrderSn, BuyOrder::getOrderSn);
w.eq("t1.order_id",resourceMap.get("transaction_id").toString());
BuyOrder order = buyOrderService.getOne(w);
BuyOrderRefund buyOrderRefund = buyOrderRefundService.getOne(new QueryWrapper<BuyOrderRefund>().eq("order_id",order.getOrderId()));
buyOrderRefund.setStatus(1);
buyOrderRefundService.updateById(buyOrderRefund);
buyOrderRefundLogService.insertRefundLog(buyOrderRefund.getId(),4,1);
PayRefundOrder refund = new PayRefundOrder();
refund.setPayType("1");
refund.setOrderId(order.getOrderId());
refund.setTradeNo(resourceMap.get("transaction_id").toString());
refund.setOutTradeNo(resourceMap.get("out_trade_no").toString());
refund.setRefundFee(((Map)resourceMap.get("amount")).get("refund").toString());
refundOrderService.save(refund);
MyUserEntity user = myUserService.getById(order.getUserId());
BuyOrderRefund refundInfo = buyOrderRefundService.getOne(new QueryWrapper<BuyOrderRefund>().eq("order_id",order.getOrderId()));
refundInfo.setStatus(1);
refundInfo.setWxRefundNo( resourceMap.get("refund_id").toString());
buyOrderRefundService.updateById(refundInfo);
buyOrderService.refundOrder(order,user,refundInfo.getId());
buyOrderRefundLogService.insertRefundLog(refundInfo.getId(),1,1);
buyOrderService.updateOrderStatus(order.getUserId(),order.getOrderSn(),"6");
// refundOrderService.businessOpt(order);
}else{
if(resourceMap.containsKey("out_refund_no")){
String refundNo = resourceMap.get("out_refund_no").toString();
BuyOrderRefund refundInfo = buyOrderRefundService.getOne(new QueryWrapper<BuyOrderRefund>().eq("refund_no",refundNo));
refundInfo.setStatus(2);
refundInfo.setWxRefundNo( resourceMap.get("refund_id").toString());
buyOrderRefundService.updateById(refundInfo);
buyOrderRefundLogService.insertRefundLog(refundInfo.getId(),1,3,resourceMap.get("reason").toString());
}
buyOrderService.refundOrder();
}
}
@Override
@@ -413,6 +519,7 @@ public class WxpayServiceImpl extends ServiceImpl<PayWechatOrderDao, PayWechatOr
w.leftJoin(PayWechatOrderEntity.class,PayWechatOrderEntity::getOrderSn, BuyOrder::getOrderSn);
w.eq("t1.order_id",resourceMap.get("transaction_id").toString());
BuyOrder order = buyOrderService.getOne(w);
PayRefundOrder refund = new PayRefundOrder();
refund.setPayType("1");
refund.setOrderId(order.getOrderId());
@@ -420,17 +527,32 @@ public class WxpayServiceImpl extends ServiceImpl<PayWechatOrderDao, PayWechatOr
refund.setOutTradeNo(resourceMap.get("out_trade_no").toString());
refund.setRefundFee(((Map)resourceMap.get("amount")).get("refund").toString());
refundOrderService.save(refund);
if (Constants.ORDER_STATUS_REFUND.equals(order.getOrderStatus())) {
BuyOrderRefund buyOrderRefund = buyOrderRefundService.getOne(new LambdaQueryWrapper<BuyOrderRefund>()
.eq(BuyOrderRefund::getOrderId, order.getOrderId())
.orderByDesc(BuyOrderRefund::getId)
.last("limit 1"));
if (buyOrderRefund != null) {
buyOrderRefundLogService.insertRefundLog(buyOrderRefund.getId(),4,1);
}
} else {
refundOrderService.businessOpt(order);
//refundOrderService.businessOpt(order);
MyUserEntity user = myUserService.getById(order.getUserId());
BuyOrderRefund refundInfo = buyOrderRefundService.getOne(new QueryWrapper<BuyOrderRefund>().eq("order_id",order.getOrderId()));
refundInfo.setStatus(1);
refundInfo.setWxRefundNo( resourceMap.get("refund_id").toString());
buyOrderRefundService.updateById(refundInfo);
buyOrderService.refundOrder(order,user,refundInfo.getId());
buyOrderRefundLogService.insertRefundLog(refundInfo.getId(),1,1);
buyOrderService.updateOrderStatus(order.getUserId(),order.getOrderSn(),"6");
}else{
if(resourceMap.containsKey("out_refund_no")){
String refundNo = resourceMap.get("out_refund_no").toString();
BuyOrderRefund refundInfo = buyOrderRefundService.getOne(new QueryWrapper<BuyOrderRefund>().eq("refund_no",refundNo));
refundInfo.setStatus(2);
refundInfo.setWxRefundNo( resourceMap.get("refund_id").toString());
buyOrderRefundService.updateById(refundInfo);
buyOrderRefundLogService.insertRefundLog(refundInfo.getId(),1,3,resourceMap.get("reason").toString());
}
}
}