package com.nova.sankuai.service.impl;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.nova.sankuai.domain.api.yinsheng.SerialGenerator;
|
import com.nova.sankuai.domain.api.yinsheng.YinShengFastProtocolUtils;
|
import com.nova.sankuai.domain.api.yinsheng.YinShengOrderEnum;
|
import com.nova.sankuai.domain.api.yinsheng.dto.FastProtocolPayDTO;
|
import com.nova.sankuai.domain.api.yinsheng.dto.FastProtocolSignConfirmDTO;
|
import com.nova.sankuai.domain.api.yinsheng.dto.FastProtocolSignDTO;
|
import com.nova.sankuai.domain.api.yinsheng.dto.SmsConfirmDTO;
|
import com.nova.sankuai.domain.api.yinsheng.enums.SignStatusEnum;
|
import com.nova.sankuai.domain.api.yinsheng.response.FastProtocolPayResponse;
|
import com.nova.sankuai.domain.api.yinsheng.response.FastProtocolQueryResponse;
|
import com.nova.sankuai.domain.api.yinsheng.response.FastProtocolResponse;
|
import com.nova.sankuai.domain.api.yinsheng.response.SmsResendResponse;
|
import com.nova.sankuai.domain.dto.YSProtocolPaySmsConfirmDto;
|
import com.nova.sankuai.domain.dto.YSProtocolPaySmsDto;
|
import com.nova.sankuai.domain.dto.YSProtocolSignConfirmDto;
|
import com.nova.sankuai.domain.dto.YSProtocolSignDto;
|
import com.nova.sankuai.domain.entity.*;
|
import com.nova.sankuai.domain.enums.vipservice.VipCardOrderEnum;
|
import com.nova.sankuai.domain.vo.VipEffectiveTimeVo;
|
import com.nova.sankuai.domain.vo.YSFastProtocolParamVo;
|
import com.nova.sankuai.domain.vo.YSFastProtocolSignCheckVo;
|
import com.nova.sankuai.domain.vo.YSFastProtocolSignVo;
|
import com.nova.sankuai.domain.vo.vipcard.VipCardVo;
|
import com.nova.sankuai.infra.config.CommonException;
|
import com.nova.sankuai.infra.mapper.CustomerMapper;
|
import com.nova.sankuai.infra.mapper.VipCardMapper;
|
import com.nova.sankuai.infra.mapper.VipCardOrderMapper;
|
import com.nova.sankuai.infra.mapper.YinShengSignRecordMapper;
|
import com.nova.sankuai.infra.utils.UserUtil;
|
import com.nova.sankuai.infra.utils.baofu.FormatUtil;
|
import com.nova.sankuai.security.UserDetail;
|
import com.nova.sankuai.service.ICustomerUserService;
|
import com.nova.sankuai.service.IYinShengService;
|
import lombok.RequiredArgsConstructor;
|
import org.apache.commons.lang.StringUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Service;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
|
/**
|
* 银盛接口对接服务
|
*
|
* @author ephemeral
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class YinShengServiceImpl implements IYinShengService {
|
|
private static final Logger log = LoggerFactory.getLogger("payLogger");
|
|
private final YinShengFastProtocolUtils yinShengUtils;
|
|
private final YinShengSignRecordMapper signRecordMapper;
|
|
private final ICustomerUserService customerUserService;
|
|
private final VipCardOrderMapper vipCardOrderMapper;
|
|
private final VipCardMapper vipCardMapper;
|
|
private final CustomerMapper customerMapper;
|
|
@Override
|
public YinShengSignRecord getSignRecordByUserId(Long userId) {
|
YinShengSignRecord signRecord = null;
|
List<YinShengSignRecord> signRecords = signRecordMapper.selectList(Wrappers.
|
lambdaQuery(YinShengSignRecord.class).eq(YinShengSignRecord::getCustomerUserId, userId).
|
orderByDesc(YinShengSignRecord::getCreationDate));
|
if (!signRecords.isEmpty()) {
|
signRecord = signRecords.get(0);
|
}
|
// YinShengSignRecord signRecord = signRecordMapper.selectOne(Wrappers.<YinShengSignRecord>lambdaQuery()
|
// .eq(YinShengSignRecord::getCustomerUserId, userId));
|
return signRecord;
|
}
|
|
@Override
|
public boolean checkBeforePayment(Long userId) {
|
YinShengSignRecord signRecord = getSignRecordByUserId(userId);
|
if (signRecord != null && StringUtils.isNotEmpty(signRecord.getSignProtocolNo())) {
|
FastProtocolQueryResponse response = yinShengUtils.fastProtocolQuery(signRecord.getSignProtocolNo());
|
if (response != null) {
|
if (response.isSuccess()) {
|
if (SignStatusEnum.SUCCESS.getCode().equals(response.getTradeStatus())) {
|
return true;
|
}
|
}
|
} else {
|
throw new CommonException("查询签约状态异常");
|
}
|
}
|
return false;
|
}
|
|
@Override
|
public YSFastProtocolSignVo protocolPaySignByYs(YSProtocolSignDto signDto, HttpServletRequest request) {
|
String token = request.getHeader("Authorization");
|
UserDetail user = UserUtil.getUser(token);
|
if (user == null || user.getId() == null) {
|
throw new CommonException("Token无效");
|
}
|
CustomerUser customerUser = customerUserService.getById(user.getId());
|
if (customerUser == null) {
|
throw new CommonException("用户不存在");
|
}
|
FastProtocolSignDTO fastProtocolSignDTO = new FastProtocolSignDTO();
|
// 新增于2022-12-07
|
String signIdNo = FormatUtil.toStringTrim(signDto.getSignIdNo());
|
String signCardNumber = FormatUtil.toStringTrim(signDto.getSignCardNumber());
|
// 完
|
|
String orderNo = SerialGenerator.getOrder();
|
fastProtocolSignDTO.setOutTradeNo(orderNo);
|
fastProtocolSignDTO.setBuyerName(signDto.getSignName());
|
fastProtocolSignDTO.setBuyerCardNumber(signCardNumber);
|
fastProtocolSignDTO.setBuyerMobile(signDto.getSignPhone());
|
fastProtocolSignDTO.setPayerIDNo(signIdNo);
|
fastProtocolSignDTO.setUserId(customerUser.getId().toString());
|
fastProtocolSignDTO.setImei(signDto.getImei());
|
FastProtocolResponse response = yinShengUtils.fastProtocolSign(fastProtocolSignDTO);
|
if (response == null) {
|
throw new CommonException("请求异常");
|
}
|
if (!response.isSuccess()) {
|
log.error("银盛快捷协议支付签约失败" + response.toString());
|
throw new CommonException("签约失败");
|
}
|
if (SignStatusEnum.SUCCESS.getCode().equals(response.getTradeStatus())
|
|| SignStatusEnum.WAIT_CONFIRM.getCode().equals(response.getTradeStatus())) {
|
YSFastProtocolSignVo ysFastProtocolSignVo = new YSFastProtocolSignVo();
|
YinShengSignRecord signRecord = new YinShengSignRecord();
|
YinShengSignRecord signRecordDb = getSignRecordByUserId(customerUser.getId());
|
signRecord.setOrderNo(orderNo);
|
signRecord.setSignName(signDto.getSignName());
|
signRecord.setCustomerUserId(customerUser.getId());
|
signRecord.setSignCardNumber(signCardNumber);
|
signRecord.setSignPhone(signDto.getSignPhone());
|
signRecord.setSignIdNo(signIdNo);
|
signRecord.setImei(signDto.getImei());
|
signRecord.setSignResult(response.getTradeStatus());
|
signRecord.setSignProtocolNo(response.getProtocolNo());
|
signRecord.setLastUpdatedDate(new Date());
|
if (signRecordDb != null) {
|
signRecord.setId(signRecordDb.getId());
|
signRecordMapper.updateById(signRecord);
|
} else {
|
signRecord.setCreationDate(signRecord.getLastUpdatedDate());
|
signRecordMapper.insert(signRecord);
|
}
|
if (SignStatusEnum.SUCCESS.getCode().equals(response.getTradeStatus())) {
|
ysFastProtocolSignVo.setNeedVerify(false);
|
} else {
|
ysFastProtocolSignVo.setNeedVerify(true);
|
}
|
return ysFastProtocolSignVo;
|
}
|
throw new CommonException("签约失败");
|
}
|
|
@Override
|
public boolean protocolPaySignConfirmByYs(YSProtocolSignConfirmDto signConfirmDto, HttpServletRequest request) {
|
String token = request.getHeader("Authorization");
|
UserDetail user = UserUtil.getUser(token);
|
if (user == null || user.getId() == null) {
|
throw new CommonException("Token无效");
|
}
|
CustomerUser customerUser = customerUserService.getById(user.getId());
|
if (customerUser == null) {
|
throw new CommonException("用户不存在");
|
}
|
YinShengSignRecord signRecord = getSignRecordByUserId(customerUser.getId());
|
if (signRecord == null) {
|
throw new CommonException("签约记录不存在");
|
}
|
FastProtocolSignConfirmDTO confirmDTO = new FastProtocolSignConfirmDTO();
|
confirmDTO.setOutTradeNo(signRecord.getOrderNo());
|
confirmDTO.setMobileVerifyCode(signConfirmDto.getVerifyCode());
|
FastProtocolResponse response = yinShengUtils.fastProtocolSignConfirm(confirmDTO);
|
if (response == null) {
|
throw new CommonException("签约确认异常");
|
}
|
if (!response.isSuccess()) {
|
log.error("银盛快捷协议支付签约确认失败" + response.toString());
|
return false;
|
}
|
if (SignStatusEnum.SUCCESS.getCode().equals(response.getTradeStatus())) {
|
signRecordMapper.update(null, Wrappers.<YinShengSignRecord>lambdaUpdate()
|
.set(YinShengSignRecord::getSignResult, response.getTradeStatus())
|
.set(YinShengSignRecord::getLastUpdatedDate, new Date())
|
.set(YinShengSignRecord::getSignProtocolNo, response.getProtocolNo())
|
.eq(YinShengSignRecord::getId, signRecord.getId()));
|
return true;
|
} else {
|
signRecordMapper.update(null, Wrappers.<YinShengSignRecord>lambdaUpdate()
|
.set(YinShengSignRecord::getSignResult, response.getTradeStatus())
|
.set(YinShengSignRecord::getLastUpdatedDate, new Date())
|
.eq(YinShengSignRecord::getId, signRecord.getId()));
|
return false;
|
}
|
}
|
|
@Override
|
public YSFastProtocolParamVo buyCardByYSProtocol(VipCardOrder vipCardOrder, VipCardVo cardVo, VipCard card) {
|
YinShengSignRecord signRecord = getSignRecordByUserId(vipCardOrder.getUserId());
|
if (signRecord == null) {
|
throw new CommonException("当前用户尚未完成签约");
|
}
|
FastProtocolPayDTO payDTO = new FastProtocolPayDTO();
|
payDTO.setOutTradeNo(vipCardOrder.getOrderId());
|
payDTO.setSubject(cardVo.getName());
|
payDTO.setTotalAmount(cardVo.getSellingPrice());
|
payDTO.setUserId(vipCardOrder.getUserId());
|
payDTO.setProtocolNo(signRecord.getSignProtocolNo());
|
FastProtocolPayResponse response = yinShengUtils.fastProtocolPay(payDTO);
|
if (response == null) {
|
throw new CommonException("请求异常");
|
}
|
if (!response.isSuccess()) {
|
log.error("银盛快捷协议支付失败" + response.toString());
|
throw new CommonException("支付失败");
|
}
|
YSFastProtocolParamVo protocolParamVo = new YSFastProtocolParamVo();
|
String status = YinShengOrderEnum.parseSystemStatus(response.getTradeStatus());
|
vipCardOrder.setStatus(status);
|
vipCardOrder.setOrderId(response.getTradeNo());
|
vipCardOrder.setPaySn(response.getPaySn());
|
if (VipCardOrderEnum.STATUS_END.getCode().equals(status)) {
|
vipCardOrderMapper.insert(vipCardOrder);
|
VipEffectiveTimeVo vipEffectiveTimeVo = customerUserService.calculateExpiredDate(vipCardOrder.getUserId(), card.getValidDate(), null, null);
|
customerUserService.updateVipEffectiveTime(vipCardOrder, vipEffectiveTimeVo);
|
protocolParamVo.setNeedVerify(false);
|
} else if (VipCardOrderEnum.STATUS_CLOSE.getCode().equals(status)) {
|
throw new CommonException("创建订单失败");
|
} else {
|
if (FastProtocolPayResponse.NEED_SMS.equals(response.getNeedSmsConfirm())) {
|
vipCardOrderMapper.insert(vipCardOrder);
|
protocolParamVo.setNeedVerify(true);
|
protocolParamVo.setPaySn(response.getPaySn());
|
} else {
|
throw new CommonException("创建订单失败");
|
}
|
}
|
return protocolParamVo;
|
}
|
|
@Override
|
public boolean protocolPaySmsConfirmByYs(YSProtocolPaySmsConfirmDto smsConfirmDto) {
|
VipCardOrder vipCardOrder = vipCardOrderMapper.selectOne(Wrappers.<VipCardOrder>lambdaQuery()
|
.eq(VipCardOrder::getPartnerThirdOrderId, smsConfirmDto.getPartnerThirdOrderId()));
|
if (vipCardOrder == null) {
|
throw new CommonException("订单不存在");
|
}
|
VipCard card = vipCardMapper.selectOne(Wrappers.<VipCard>lambdaQuery()
|
.eq(VipCard::getCardId, vipCardOrder.getCardId()));
|
if (card == null) {
|
throw new CommonException("对应会员卡不存在");
|
}
|
SmsConfirmDTO confirmDTO = new SmsConfirmDTO();
|
confirmDTO.setMobileVerifyCode(smsConfirmDto.getVerifyCode());
|
confirmDTO.setPaySn(smsConfirmDto.getPaySn());
|
FastProtocolPayResponse response = yinShengUtils.smsConfirm(confirmDTO);
|
if (response == null) {
|
throw new CommonException("请求异常");
|
}
|
if (!response.isSuccess()) {
|
log.error("银盛快捷协议支付短信确认失败" + response.toString());
|
throw new CommonException(response.getMsg());
|
}
|
String status = YinShengOrderEnum.parseSystemStatus(response.getTradeStatus());
|
if (!Objects.equals(status, vipCardOrder.getStatus())) {
|
vipCardOrder.setStatus(status);
|
vipCardOrder.setOrderId(response.getTradeNo());
|
vipCardOrder.setPaySn(response.getPaySn());
|
vipCardOrderMapper.update(null, Wrappers.<VipCardOrder>lambdaUpdate()
|
.set(VipCardOrder::getStatus, vipCardOrder.getStatus())
|
.set(VipCardOrder::getOrderId, vipCardOrder.getOrderId())
|
.set(VipCardOrder::getPaySn, vipCardOrder.getPaySn())
|
.eq(VipCardOrder::getId, vipCardOrder.getId()));
|
if (VipCardOrderEnum.STATUS_END.getCode().equals(status)) {
|
VipEffectiveTimeVo vipEffectiveTimeVo = customerUserService.calculateExpiredDate(vipCardOrder.getUserId(), card.getValidDate(), null, null);
|
customerUserService.updateVipEffectiveTime(vipCardOrder, vipEffectiveTimeVo);
|
return true;
|
}
|
}
|
return false;
|
}
|
|
@Override
|
public void getProtocolPaySmsByYs(YSProtocolPaySmsDto smsDto) {
|
if (StringUtils.isEmpty(smsDto.getPaySn())) {
|
throw new CommonException("支付流水号不能为空");
|
}
|
SmsResendResponse response = yinShengUtils.smsResend(smsDto.getPaySn());
|
if (response == null) {
|
throw new CommonException("请求异常");
|
}
|
if (!response.isSuccess()) {
|
log.error("银盛快捷协议支付重新获取短信失败" + response.toString());
|
throw new CommonException("获取短信失败");
|
}
|
}
|
|
@Override
|
public YSFastProtocolSignCheckVo checkProtocolSignByYs(HttpServletRequest request) {
|
String token = request.getHeader("Authorization");
|
UserDetail user = UserUtil.getUser(token);
|
if (user == null || user.getId() == null) {
|
throw new CommonException("Token无效");
|
}
|
CustomerUser customerUser = customerUserService.getById(user.getId());
|
if (customerUser == null) {
|
throw new CommonException("用户不存在");
|
}
|
YSFastProtocolSignCheckVo checkVo = new YSFastProtocolSignCheckVo();
|
YinShengSignRecord signRecord = getSignRecordByUserId(customerUser.getId());
|
Customer customer = customerMapper.getLatestCustomerRecord(customerUser.getPhone());
|
if (signRecord != null && SignStatusEnum.SUCCESS.getCode().equals(signRecord.getSignResult())) {
|
checkVo.setSign(true);
|
checkVo.setSignCardNumber(signRecord.getSignCardNumber());
|
checkVo.setSignIdNo(signRecord.getSignIdNo());
|
checkVo.setSignName(signRecord.getSignName());
|
checkVo.setSignPhone(signRecord.getSignPhone());
|
} else {
|
if (customer != null) {
|
checkVo.setSignName(customer.getName());
|
checkVo.setSignIdNo(customer.getIdCard());
|
}
|
}
|
if (customer != null){
|
checkVo.setBankName(customer.getBankName());
|
checkVo.setBankCode(customer.getBankCode());
|
}
|
return checkVo;
|
}
|
}
|