diff --git a/xdclass-order-service/src/main/java/net/jieyuu/controller/ProductOrderController.java b/xdclass-order-service/src/main/java/net/jieyuu/controller/ProductOrderController.java index dd8cedd..2567719 100644 --- a/xdclass-order-service/src/main/java/net/jieyuu/controller/ProductOrderController.java +++ b/xdclass-order-service/src/main/java/net/jieyuu/controller/ProductOrderController.java @@ -14,6 +14,7 @@ import net.jieyuu.enums.BizCodeEnum; import net.jieyuu.enums.ClientType; import net.jieyuu.enums.ProductOrderPayTypeEnum; import net.jieyuu.request.ConfirmOrderRequest; +import net.jieyuu.request.RepayOrderRequest; import net.jieyuu.service.ProductOrderService; import net.jieyuu.utils.JsonData; import org.apache.commons.lang3.StringUtils; @@ -57,11 +58,11 @@ public class ProductOrderController { @ApiOperation(value = "分页查询我的订单列表") @GetMapping("page") public JsonData findOrderList(@ApiParam("当前页") - @RequestParam(value = "page", defaultValue = "1") int page, - @ApiParam("显示多少条") - @RequestParam(value = "size", defaultValue = "20") int size, - @ApiParam("订单状态") @RequestParam(value = "state",required = false) String state) { - Map pageResult = orderService.page(page, size,state); + @RequestParam(value = "page", defaultValue = "1") int page, + @ApiParam("显示多少条") + @RequestParam(value = "size", defaultValue = "20") int size, + @ApiParam("订单状态") @RequestParam(value = "state", required = false) String state) { + Map pageResult = orderService.page(page, size, state); return JsonData.buildSuccess(pageResult); } @@ -92,6 +93,33 @@ public class ProductOrderController { } } + @ApiOperation("重新支付订单") + @PostMapping("repay") + public void repay(@ApiParam("订单对象") @RequestBody RepayOrderRequest repayOrderRequest, HttpServletResponse response) { + + JsonData jsonData = orderService.repay(repayOrderRequest); + if (jsonData.getCode() == 0) { + //根据端类型选择返回类型 + String client = repayOrderRequest.getClientType(); + String payType = repayOrderRequest.getPayType(); + if (payType.equalsIgnoreCase(ProductOrderPayTypeEnum.ALIPAY.name())) {//如果是支付宝跳转网页,app除外 + log.info("重复支付订单成功:{}", repayOrderRequest.toString()); + + if (client.equalsIgnoreCase(ClientType.H5.name())) { + writeData(response, jsonData); + } else if (client.equalsIgnoreCase(ClientType.APP.name())) { + //app sdk支付 todo + + } + } else if (payType.equalsIgnoreCase(ProductOrderPayTypeEnum.WECHAT.name())) {//微信支付 + //todo 微信支付 + } + + } else { + log.error("重复支付订单失败{}:", jsonData.toString()); + } + } + private void writeData(HttpServletResponse response, JsonData jsonData) { try { diff --git a/xdclass-order-service/src/main/java/net/jieyuu/request/RepayOrderRequest.java b/xdclass-order-service/src/main/java/net/jieyuu/request/RepayOrderRequest.java new file mode 100644 index 0000000..a798ca8 --- /dev/null +++ b/xdclass-order-service/src/main/java/net/jieyuu/request/RepayOrderRequest.java @@ -0,0 +1,27 @@ +package net.jieyuu.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class RepayOrderRequest { + + /** + * 订单号 + */ + @JsonProperty("out_trade_no") + private String outTradeNo; + + + /** + * 支付类型 + */ + @JsonProperty("pay_type") + private String payType; + /** + * 客户端类型 + */ + @JsonProperty("client_type") + private String clientType; + +} diff --git a/xdclass-order-service/src/main/java/net/jieyuu/service/ProductOrderService.java b/xdclass-order-service/src/main/java/net/jieyuu/service/ProductOrderService.java index f5276d1..a18c6c5 100644 --- a/xdclass-order-service/src/main/java/net/jieyuu/service/ProductOrderService.java +++ b/xdclass-order-service/src/main/java/net/jieyuu/service/ProductOrderService.java @@ -5,6 +5,7 @@ import net.jieyuu.model.OrderMessage; import net.jieyuu.model.ProductOrderDO; import com.baomidou.mybatisplus.extension.service.IService; import net.jieyuu.request.ConfirmOrderRequest; +import net.jieyuu.request.RepayOrderRequest; import net.jieyuu.utils.JsonData; import java.util.Map; @@ -60,4 +61,11 @@ public interface ProductOrderService extends IService { */ Map page(int page, int size,String state); + + /** + * 二次支付接口 + * @param repayOrderRequest + * @return + */ + JsonData repay(RepayOrderRequest repayOrderRequest); } diff --git a/xdclass-order-service/src/main/java/net/jieyuu/service/impl/ProductOrderServiceImpl.java b/xdclass-order-service/src/main/java/net/jieyuu/service/impl/ProductOrderServiceImpl.java index 11e430c..1b4694e 100644 --- a/xdclass-order-service/src/main/java/net/jieyuu/service/impl/ProductOrderServiceImpl.java +++ b/xdclass-order-service/src/main/java/net/jieyuu/service/impl/ProductOrderServiceImpl.java @@ -3,6 +3,7 @@ package net.jieyuu.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; @@ -18,10 +19,7 @@ import net.jieyuu.interceptor.LoginInterceptor; import net.jieyuu.mapper.ProductOrderItemMapper; import net.jieyuu.model.*; import net.jieyuu.mapper.ProductOrderMapper; -import net.jieyuu.request.ConfirmOrderRequest; -import net.jieyuu.request.LockCouponRecordRequest; -import net.jieyuu.request.LockProductRequest; -import net.jieyuu.request.OrderItemRequest; +import net.jieyuu.request.*; import net.jieyuu.service.ProductOrderService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import net.jieyuu.utils.CommonUtil; @@ -32,6 +30,7 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; @@ -91,6 +90,7 @@ public class ProductOrderServiceImpl extends ServiceImpl pageMap = new HashMap<>(); pageMap.put("total_record", orderDOPage.getTotal()); - pageMap.put("total_page" , orderDOPage.getPages()); + pageMap.put("total_page", orderDOPage.getPages()); pageMap.put("current_data", productOrderVOList); return pageMap; } + + @Override + @Transactional + public JsonData repay(RepayOrderRequest repayOrderRequest) { + LoginUser loginUser = LoginInterceptor.threadLocal.get(); + + ProductOrderDO productOrderDO = productOrderMapper.selectOne(new QueryWrapper() + .eq("out_trade_no", repayOrderRequest.getOutTradeNo()) + .eq("user_id", loginUser.getId())); + + log.info("订单状态:{}", productOrderDO); + + if (productOrderDO == null) { + return JsonData.buildResult(BizCodeEnum.PAY_ORDER_NOT_EXIST); + } + //订单状态不对,不是NEW + if (!ProductOrderStateEnum.NEW.name().equalsIgnoreCase(productOrderDO.getState())) { + return JsonData.buildResult(BizCodeEnum.PAY_ORDER_STATE_ERROR); + } else { + // 订单创建到现在的存活时间 + long orderLiveTime = CommonUtil.getCurrentTimestamp() - productOrderDO.getCreateTime().getTime(); + + // 创建订单时时临界点,所以增加一分多钟 + orderLiveTime = orderLiveTime + 70 * 1000; + + // 大于订单超时时间,则失效 + if (orderLiveTime > TimeConstant.ORDER_PAY_TIMEOUT_MILLS) { + return JsonData.buildResult(BizCodeEnum.PAY_ORDER_PAY_TIMEOUT); + } else { + + // 假如用户重新支付,使用不同的支付方式,比如使用微信支付,这里可以考虑进行更新 + // todo 可以更新订单支付参数 payType + if (!productOrderDO.getPayType().equals(repayOrderRequest.getPayType())) { + // 更新 + UpdateWrapper updateWrapper = new UpdateWrapper() + .eq("out_trade_no", repayOrderRequest.getOutTradeNo()) + .set("pay_type", repayOrderRequest.getPayType()); + productOrderMapper.update(null, updateWrapper); + } + + + long timeout = TimeConstant.ORDER_PAY_TIMEOUT_MILLS - orderLiveTime; + //创建支付 + PayInfoVO payInfoVO = new PayInfoVO(productOrderDO.getOutTradeNo(), + productOrderDO.getPayAmount(), + repayOrderRequest.getPayType(), + repayOrderRequest.getClientType(), + productOrderDO.getOutTradeNo(), + "", + timeout); + + log.info("payInfoVO={}", payInfoVO); + + String payResult = payFactory.pay(payInfoVO); + + if (StringUtils.isNotBlank(payResult)) { + log.info("创建二次支付订单成功:payInfoVO={},payResult={}", payInfoVO, payResult); + return JsonData.buildSuccess(payResult); + } else { + log.error("创建二次支付订单失败:payInfoVO={},payResult={}", payInfoVO, payResult); + return JsonData.buildSuccess(BizCodeEnum.PAY_ORDER_FAIL); + } + } + } + + + // 还可以增加订单支付日志信息 比如新增一个数据库记录所有支付记录 + } }