订单二次支付
This commit is contained in:
parent
6fbc11de95
commit
44fcc17624
@ -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;
|
||||||
@ -57,11 +58,11 @@ public class ProductOrderController {
|
|||||||
@ApiOperation(value = "分页查询我的订单列表")
|
@ApiOperation(value = "分页查询我的订单列表")
|
||||||
@GetMapping("page")
|
@GetMapping("page")
|
||||||
public JsonData findOrderList(@ApiParam("当前页")
|
public JsonData findOrderList(@ApiParam("当前页")
|
||||||
@RequestParam(value = "page", defaultValue = "1") int page,
|
@RequestParam(value = "page", defaultValue = "1") int page,
|
||||||
@ApiParam("显示多少条")
|
@ApiParam("显示多少条")
|
||||||
@RequestParam(value = "size", defaultValue = "20") int size,
|
@RequestParam(value = "size", defaultValue = "20") int size,
|
||||||
@ApiParam("订单状态") @RequestParam(value = "state",required = false) String state) {
|
@ApiParam("订单状态") @RequestParam(value = "state", required = false) String state) {
|
||||||
Map<String, Object> pageResult = orderService.page(page, size,state);
|
Map<String, Object> pageResult = orderService.page(page, size, state);
|
||||||
return JsonData.buildSuccess(pageResult);
|
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) {
|
private void writeData(HttpServletResponse response, JsonData jsonData) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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订单号
|
||||||
@ -495,10 +495,78 @@ public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, Pro
|
|||||||
HashMap<String, Object> pageMap = new HashMap<>();
|
HashMap<String, Object> pageMap = new HashMap<>();
|
||||||
|
|
||||||
pageMap.put("total_record", orderDOPage.getTotal());
|
pageMap.put("total_record", orderDOPage.getTotal());
|
||||||
pageMap.put("total_page" , orderDOPage.getPages());
|
pageMap.put("total_page", orderDOPage.getPages());
|
||||||
pageMap.put("current_data", productOrderVOList);
|
pageMap.put("current_data", productOrderVOList);
|
||||||
|
|
||||||
|
|
||||||
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 还可以增加订单支付日志信息 比如新增一个数据库记录所有支付记录
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user