订单二次支付

This commit is contained in:
jieyuu 2024-11-08 21:36:09 +08:00
parent 6fbc11de95
commit 44fcc17624
4 changed files with 141 additions and 10 deletions

View File

@ -14,6 +14,7 @@ import net.jieyuu.enums.BizCodeEnum;
import net.jieyuu.enums.ClientType; import net.jieyuu.enums.ClientType;
import net.jieyuu.enums.ProductOrderPayTypeEnum; import net.jieyuu.enums.ProductOrderPayTypeEnum;
import net.jieyuu.request.ConfirmOrderRequest; import net.jieyuu.request.ConfirmOrderRequest;
import net.jieyuu.request.RepayOrderRequest;
import net.jieyuu.service.ProductOrderService; import net.jieyuu.service.ProductOrderService;
import net.jieyuu.utils.JsonData; import net.jieyuu.utils.JsonData;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -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) { private void writeData(HttpServletResponse response, JsonData jsonData) {
try { try {

View File

@ -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;
}

View File

@ -5,6 +5,7 @@ import net.jieyuu.model.OrderMessage;
import net.jieyuu.model.ProductOrderDO; import net.jieyuu.model.ProductOrderDO;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import net.jieyuu.request.ConfirmOrderRequest; import net.jieyuu.request.ConfirmOrderRequest;
import net.jieyuu.request.RepayOrderRequest;
import net.jieyuu.utils.JsonData; import net.jieyuu.utils.JsonData;
import java.util.Map; import java.util.Map;
@ -60,4 +61,11 @@ public interface ProductOrderService extends IService<ProductOrderDO> {
*/ */
Map<String, Object> page(int page, int size,String state); Map<String, Object> page(int page, int size,String state);
/**
* 二次支付接口
* @param repayOrderRequest
* @return
*/
JsonData repay(RepayOrderRequest repayOrderRequest);
} }

View File

@ -3,6 +3,7 @@ package net.jieyuu.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -18,10 +19,7 @@ import net.jieyuu.interceptor.LoginInterceptor;
import net.jieyuu.mapper.ProductOrderItemMapper; import net.jieyuu.mapper.ProductOrderItemMapper;
import net.jieyuu.model.*; import net.jieyuu.model.*;
import net.jieyuu.mapper.ProductOrderMapper; import net.jieyuu.mapper.ProductOrderMapper;
import net.jieyuu.request.ConfirmOrderRequest; import net.jieyuu.request.*;
import net.jieyuu.request.LockCouponRecordRequest;
import net.jieyuu.request.LockProductRequest;
import net.jieyuu.request.OrderItemRequest;
import net.jieyuu.service.ProductOrderService; import net.jieyuu.service.ProductOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import net.jieyuu.utils.CommonUtil; 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.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
@ -91,6 +90,7 @@ public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, Pro
* @return * @return
*/ */
@Override @Override
@Transactional
public JsonData confirmOrder(ConfirmOrderRequest orderRequest) { public JsonData confirmOrder(ConfirmOrderRequest orderRequest) {
LoginUser loginUser = LoginInterceptor.threadLocal.get(); LoginUser loginUser = LoginInterceptor.threadLocal.get();
// 32位uuid订单号 // 32位uuid订单号
@ -501,4 +501,72 @@ public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, Pro
return pageMap; return pageMap;
} }
@Override
@Transactional
public JsonData repay(RepayOrderRequest repayOrderRequest) {
LoginUser loginUser = LoginInterceptor.threadLocal.get();
ProductOrderDO productOrderDO = productOrderMapper.selectOne(new QueryWrapper<ProductOrderDO>()
.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<ProductOrderDO> updateWrapper = new UpdateWrapper<ProductOrderDO>()
.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);
}
}
}
// 还可以增加订单支付日志信息 比如新增一个数据库记录所有支付记录
}
} }