package com.oying.modules.hwc.service.impl; 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.vo.OrderResponse; import com.oying.modules.sh.domain.vo.OrderReturnResponse; 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.dom4j.DocumentException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; 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 (DataIntegrityViolationException e) { log.error("汇旺财退款回调数据异常失败:{} {}", map.toString(), e.getMessage()); } catch (DocumentException e) { log.error("汇旺财退款回调XML转码失败:{} {}", map.toString(), e.getMessage()); } catch (IOException e) { log.error("汇旺财退款回调写入流失败:{} {}", map.toString(), e.getMessage()); } catch (Exception e) { log.error("汇旺财退款回调失败:{} {}", map.toString(), 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")) { OrderReturnResponse order = returnService.getByReturnNum(map.get("out_refund_no")); PayTypeEnum status = PayTypeEnum.find(order.getOrderReturn().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 (DataIntegrityViolationException e) { log.error("汇旺财退款回调数据异常失败:{} {}", map.toString(), e.getMessage()); } catch (DocumentException e) { log.error("汇旺财退款回调XML转码失败:{} {}", map.toString(), e.getMessage()); } catch (IOException e) { log.error("汇旺财退款回调写入流失败:{} {}", map.toString(), e.getMessage()); } catch (Exception e) { log.error("汇旺财退款回调失败:{} {}", map.toString(), e.getMessage()); } } }