diff --git a/xdclass-common/src/main/java/net/jieyuu/constant/CacheKey.java b/xdclass-common/src/main/java/net/jieyuu/constant/CacheKey.java index 52c14cc..a7ccc16 100644 --- a/xdclass-common/src/main/java/net/jieyuu/constant/CacheKey.java +++ b/xdclass-common/src/main/java/net/jieyuu/constant/CacheKey.java @@ -10,4 +10,9 @@ public class CacheKey { * 购物车 hash 结果 , key是用户唯一标识 */ public final static String CART_KEY = "cart:%s"; + + /** + * 提交表单的token key + */ + public final static String SUBMIT_ORDER_TOKEN_KEY = "order:submit:%s"; } 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 1f48347..760825f 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 @@ -10,9 +10,12 @@ import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import net.jieyuu.config.AlipayConfig; import net.jieyuu.config.PayUrlConfig; +import net.jieyuu.constant.CacheKey; import net.jieyuu.enums.BizCodeEnum; import net.jieyuu.enums.ClientType; import net.jieyuu.enums.ProductOrderPayTypeEnum; +import net.jieyuu.interceptor.LoginInterceptor; +import net.jieyuu.model.LoginUser; import net.jieyuu.request.ConfirmOrderRequest; import net.jieyuu.request.RepayOrderRequest; import net.jieyuu.service.ProductOrderService; @@ -20,14 +23,15 @@ import net.jieyuu.utils.CommonUtil; import net.jieyuu.utils.JsonData; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import java.util.UUID; +import java.util.concurrent.TimeUnit; /** *

@@ -49,6 +53,26 @@ public class ProductOrderController { @Autowired private PayUrlConfig payUrlConfig; + @Autowired + private StringRedisTemplate redisTemplate; + + /** + * 避免重复下单操作 + * 下单前请求接口获取令牌 + * + * @return + */ + @ApiOperation("获取提交订单令牌") + @GetMapping("get_token") + public JsonData getOrderToken() { + LoginUser loginUser = LoginInterceptor.threadLocal.get(); + String key = String.format(CacheKey.SUBMIT_ORDER_TOKEN_KEY, loginUser.getId()); + String token = CommonUtil.getStringNumRandom(32); + + redisTemplate.opsForValue().set(key, token, 30, TimeUnit.MINUTES); + return JsonData.buildSuccess(token); + } + /** * 分页查询商品列表 * 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 c844a4c..88c3c37 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 @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import net.jieyuu.component.PayFactory; import net.jieyuu.config.RabbitMQConfig; +import net.jieyuu.constant.CacheKey; import net.jieyuu.constant.TimeConstant; import net.jieyuu.enums.*; import net.jieyuu.exception.BizException; @@ -29,6 +30,8 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -72,6 +75,9 @@ public class ProductOrderServiceImpl extends ServiceImpl(script, Long.class), + Arrays.asList(String.format(CacheKey.SUBMIT_ORDER_TOKEN_KEY, loginUser.getId())), orderToken); + + if(result == 0L){ + throw new BizException(BizCodeEnum.ORDER_CONFIRM_TOKEN_EQUAL_FAIL); + } + // 32位uuid订单号 String orderOutTradeNo = CommonUtil.getStringNumRandom(32); // 获取收货地址