package com.oying.modules.hwc.service.impl; import com.oying.exception.BadRequestException; import com.oying.modules.hwc.service.CallbackService; import com.oying.modules.hwc.utils.SignUtil; import com.oying.modules.hwc.utils.XmlUtils; import com.oying.modules.security.config.SwiftPassProperties; import com.oying.modules.sh.domain.OrderReturn; import com.oying.modules.sh.domain.vo.OrderResponse; import com.oying.modules.sh.service.OrderReturnService; import com.oying.modules.sh.service.OrderService; import com.oying.utils.enums.OrderStatusEnum; import com.oying.utils.enums.PayStateEnum; import com.oying.utils.enums.PayTypeEnum; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; /** * @author xin * @description * @date 2025/7/8 18:47 */ @SuppressWarnings({"unchecked", "all"}) @Slf4j @Service @RequiredArgsConstructor public class CallbackServiceImpl implements CallbackService { private final OrderService orderService; private final OrderReturnService returnService; private final SwiftPassProperties properties; @Override @Transactional(rollbackFor = Exception.class) public void alipayCallback(HttpServletRequest request, HttpServletResponse response) { Map map = new HashMap<>(); try { String resString = XmlUtils.parseRequest(request); String respString = "error"; if (!resString.isEmpty()) { map = XmlUtils.toMap(resString.getBytes(), "utf-8"); String sign_type = map.get("sign_type"); String reSign = map.get("sign"); if (map.containsKey("sign")) { OrderResponse order = orderService.getByOrderNum(map.get("out_trade_no")); PayTypeEnum status = PayTypeEnum.find(order.getOrder().getPayType()); if (SignUtil.verifySign(reSign, sign_type, map, properties, status)) { log.error("汇旺财支付验证签名错误!:{}", map.toString()); } else { if ("0".equals(map.get("status"))) { if ("0".equals(map.get("result_code"))) { //业务处理 if (PayStateEnum.SUCCESS.getKey().equals(order.getOrder().getPayState())) { // 已处理 respString = "success"; } else { PayStateEnum stateEnum = PayStateEnum.NOTPAY; if ("0".equals(map.get("pay_result"))) { stateEnum = PayStateEnum.SUCCESS; orderService.operationLog(order, OrderStatusEnum.TWO, null); } orderService.updatePayStatus(map.get("out_trade_no"), stateEnum, map.get("pay_info"), map.get("time_end")); // 处理成功 respString = "success"; } } } } } } response.getWriter().write(respString); } catch (Exception e) { log.error("汇旺财支付回调失败:{}", map.toString()); throw new BadRequestException("操作失败,原因:" + e.getMessage()); } } @Override @Transactional(rollbackFor = Exception.class) public void returnNotify(HttpServletRequest request, HttpServletResponse response) { Map map = new HashMap<>(); try { String resString = XmlUtils.parseRequest(request); String respString = "error"; if (!resString.isEmpty()) { map = XmlUtils.toMap(resString.getBytes(), "utf-8"); String sign_type = map.get("sign_type"); String reSign = map.get("sign"); if (map.containsKey("sign")) { OrderReturn order = returnService.getByReturnNum(map.get("out_refund_no")); PayTypeEnum status = PayTypeEnum.find(order.getPayType()); if (SignUtil.verifySign(reSign, sign_type, map, properties, status)) { log.error("汇旺财退款验证签名错误!:{}", map.toString()); } else { if ("0".equals(map.get("status"))) { if ("0".equals(map.get("result_code"))) { // 业务处理 returnService.updatePayStatus(map.get("out_refund_no"), map.get("refund_status"), map.get("refund_time")); // 业务处理 respString = "success"; } } } } } response.getWriter().write(respString); } catch (Exception e) { log.error("汇旺财退款回调失败:{}", map.toString()); System.out.println("操作失败,原因:" + e.getMessage()); } } }