订单二次支付
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.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;
|
||||
@ -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 {
|
||||
|
@ -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 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<ProductOrderDO> {
|
||||
*/
|
||||
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.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<ProductOrderMapper, Pro
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public JsonData confirmOrder(ConfirmOrderRequest orderRequest) {
|
||||
LoginUser loginUser = LoginInterceptor.threadLocal.get();
|
||||
// 32位uuid订单号
|
||||
@ -501,4 +501,72 @@ public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, Pro
|
||||
|
||||
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