Files
yuaihealth/mobileApp/src/main/java/cn/unizk/pay/handler/CoursePayHandler.java
T

130 lines
5.8 KiB
Java

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<CoursePayParam> {
@Resource
private HuiFuVendorProperties vendorProperties;
@Resource
private MobileOrderMapper mobileOrderMapper;
@Resource
private MobileOrderItemMapper mobileOrderItemMapper;
@Override
public <R extends BasePayResponse> 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;
}
}