130 lines
5.8 KiB
Java
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;
|
|
}
|
|
}
|