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 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.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.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.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.lambdaQuery() .eq(VipCardOrder::getPartnerThirdOrderId, smsConfirmDto.getPartnerThirdOrderId())); if (vipCardOrder == null) { throw new CommonException("订单不存在"); } VipCard card = vipCardMapper.selectOne(Wrappers.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.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; } }