package cn.unizk.pay.handler; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.unizk.entity.dto.PlaceOrderCommonDTO; import cn.unizk.entity.po.MobileOrder; import cn.unizk.entity.po.MobileOrderItem; import cn.unizk.enums.OrderStatus; import cn.unizk.enums.OrderTypeEnum; import cn.unizk.exception.BusinessException; import cn.unizk.mapper.MobileOrderItemMapper; import cn.unizk.mapper.MobileOrderMapper; import cn.unizk.pay.dto.BasePayResponse; import cn.unizk.pay.dto.CoursePayParam; import cn.unizk.pay.dto.PayBaseRequest; import cn.unizk.pay.enums.PayChannelEnum; import cn.unizk.pay.enums.PaySceneEnum; import cn.unizk.properties.HuiFuVendorProperties; import cn.unizk.utils.HFSignUtil; import cn.unizk.utils.HttpUtil; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.Date; import java.util.Objects; /** * @Author hao * @Date 2026/7/7 17:01 * @Version 1.0 **/ @Component @Slf4j public class CoursePayHandler extends PaySceneHandler { @Resource private HuiFuVendorProperties vendorProperties; @Resource private MobileOrderMapper mobileOrderMapper; @Resource private MobileOrderItemMapper mobileOrderItemMapper; @Override public R scenePay(CoursePayParam param) { if (param.getPayChannel().equals(PayChannelEnum.WECHAT.name()) && param.getStep() == 1){ BasePayResponse basePayResponse = new BasePayResponse(); MobileOrder mobileOrder = new MobileOrder(); String snowflakeNextIdStr = IdUtil.getSnowflakeNextIdStr(); mobileOrder.setOrderId(snowflakeNextIdStr); mobileOrder.setMobileUserId(param.getMobileAppUserId()); mobileOrder.setCourseId(param.getCourseId()); mobileOrder.setDescription(PaySceneEnum.COURSE_PAY.getDescription()); BigDecimal price = new BigDecimal(param.getActualPayPrice()); price = price.setScale(2, RoundingMode.DOWN); mobileOrder.setTotalPrice(price); mobileOrder.setStatus(OrderStatus.unpaid.name()); mobileOrder.setCreateTime(LocalDateTime.now()); mobileOrderMapper.insert(mobileOrder); basePayResponse.setOrderId(snowflakeNextIdStr); return (R) basePayResponse; } log.info("param={}",param); String now = DateUtil.format(new Date(), "yyyyMMdd"); BigDecimal price = new BigDecimal(param.getActualPayPrice()); price = price.setScale(2, RoundingMode.DOWN); PlaceOrderCommonDTO dto = new PlaceOrderCommonDTO(); dto.setPrice(price.toString()); dto.setReqDate(now); String reqSeqId = HFSignUtil.getReqSeqId(); dto.setReqSeqId(reqSeqId); dto.setDescribe(PaySceneEnum.COURSE_PAY.getDescription()); JSONObject commonParams = super.createCommonParams(param,dto); String res = HttpUtil.doPostJson(vendorProperties.getPayApi(), null, commonParams); log.info("汇付下单返回:{}", res); JSONObject response = JSONObject.parseObject(res); if (response == null) { throw new BusinessException("下单失败"); } JSONObject responseData = response.getJSONObject("data"); String resp_code = responseData.getString("resp_code"); String pay_info = responseData.getString("pay_info"); log.info("下单返回支付信息pay_info={}",pay_info); if ("00000000".equals(resp_code) || "00000100".equals(resp_code)){ if (param.getPayChannel().equals(PayChannelEnum.ALIPAY.name())){ MobileOrder mobileOrder = new MobileOrder(); String snowflakeNextIdStr = IdUtil.getSnowflakeNextIdStr(); mobileOrder.setOrderId(snowflakeNextIdStr); mobileOrder.setOutTradeNo(reqSeqId); mobileOrder.setStatus(OrderStatus.unpaid.name()); mobileOrder.setOrderType(OrderTypeEnum.COURSE_PAY.getCode()); mobileOrder.setDescription(param.getGoodDesc()); mobileOrder.setCourseId(param.getCourseId()); mobileOrder.setTotalPrice(price); mobileOrder.setDeliveryWay("自提"); mobileOrder.setCreateTime(LocalDateTime.now()); mobileOrder.setMobileUserId(param.getMobileAppUserId()); mobileOrderMapper.insert(mobileOrder); /*MobileOrderItem mobileOrderItem = new MobileOrderItem(); mobileOrderItem.setMobileOrderId(mobileOrder.getOrderId()); mobileOrderItem.setQuantity(1); mobileOrderItem.setPrice(price); mobileOrderItem.setCourseId(param.getCourseId()); mobileOrderItemMapper.insert(mobileOrderItem);*/ responseData.put("orderId",snowflakeNextIdStr); }else if (param.getPayChannel().equals(PayChannelEnum.WECHAT.name()) && param.getStep() == 2){ MobileOrder mobileOrder = mobileOrderMapper.selectById(param.getOrderId()); if (Objects.isNull(mobileOrder)){ throw new BusinessException(String.format("orderId:%s不存在",param.getOrderId())); } mobileOrder.setOutTradeNo(reqSeqId); mobileOrder.setOrderType(OrderTypeEnum.COURSE_PAY.getCode()); mobileOrder.setMobileUserId(param.getMobileAppUserId()); mobileOrderMapper.updateById(mobileOrder); } return super.createResponse(param.getPayChannel(),responseData); } throw new BusinessException("下单失败"); } @Override public PaySceneEnum getSceneEnum() { return null; } }