package cc.mrbird.febs.pay.service.impl; import cc.mrbird.febs.blockchain.entity.MemberCoinAddressEntity; import cc.mrbird.febs.blockchain.enumerates.CoinTypeEnum; import cc.mrbird.febs.blockchain.mapper.MemberCoinAddressDao; import cc.mrbird.febs.blockchain.service.Trc20Service; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.pay.model.AliPayPassbackModel; import cc.mrbird.febs.pay.properties.AliPayProperties; import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.rabbit.producer.UsdtUpdateProducer; import cc.mrbird.febs.video.dto.VipBuyDto; import cc.mrbird.febs.video.entity.DataDictionaryCustom; import cc.mrbird.febs.video.entity.VideoMemberEntity; import cc.mrbird.febs.video.entity.VideoVipOrderInfoEntity; import cc.mrbird.febs.video.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.video.mapper.VideoMemberMapper; import cc.mrbird.febs.video.mapper.VideoVipOrderInfoMapper; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.AlipayTradeAppPayModel; import com.alipay.api.response.AlipayTradeAppPayResponse; import com.ijpay.alipay.AliPayApi; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Date; import java.util.Map; /** * @author wzy * @date 2021-09-27 **/ @Slf4j @Service public class PayServiceImpl implements IPayService { @Resource private AliPayProperties aliPayProperties; @Resource private DataDictionaryCustomMapper dataDictionaryCustomMapper; @Resource private VideoVipOrderInfoMapper videoVipOrderInfoMapper; @Resource private VideoMemberMapper videoMemberMapper; @Resource private MemberCoinAddressDao memberCoinAddressDao; @Resource private UsdtUpdateProducer usdtUpdateProducer; @Value("${spring.profiles.active}") private String active; @Override @Transactional(rollbackFor = Exception.class) public String aliPay(VipBuyDto vipBuyDto) { VideoMemberEntity loginUser = LoginUserUtil.getLoginUser(); DataDictionaryCustom data = dataDictionaryCustomMapper.selectDataByTypeAndCode(AppContants.DIC_VIP_COST, vipBuyDto.getType()); if (data == null) { throw new FebsException("参数错误"); } VideoVipOrderInfoEntity vipOrderInfo = new VideoVipOrderInfoEntity(); vipOrderInfo.setOrderNo(MallUtils.getOrderNum()); vipOrderInfo.setPayType(VideoVipOrderInfoEntity.PAY_TYPE_ALIPAY); vipOrderInfo.setStatus(VideoVipOrderInfoEntity.PAY_STATUS_WAIT); vipOrderInfo.setMemberId(loginUser.getId()); vipOrderInfo.setGoodsType(vipBuyDto.getType()); vipOrderInfo.setAmount(new BigDecimal(data.getValue())); videoVipOrderInfoMapper.insert(vipOrderInfo); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setSubject("会员支付"); model.setBody(data.getDescription()); model.setOutTradeNo(vipOrderInfo.getOrderNo()); model.setTimeoutExpress("15m"); if ("dev".equals(active) || "test".equals(active)) { model.setTotalAmount("0.01"); } else { model.setTotalAmount(vipOrderInfo.getAmount().toString()); } AliPayPassbackModel passbackModel = new AliPayPassbackModel(); passbackModel.setOrderId(vipOrderInfo.getId()); passbackModel.setMemberId(vipOrderInfo.getMemberId()); model.setPassbackParams(JSONObject.toJSONString(passbackModel)); model.setProductCode("QUICK_MSECURITY_PAY"); AlipayTradeAppPayResponse resp = null; try { resp = AliPayApi.appPayToResponse(model, aliPayProperties.getNoticeUrl()); } catch (AlipayApiException e) { log.error("支付宝支付异常", e); throw new FebsException("支付宝支付异常"); } return resp.getBody(); } @Override @Transactional(rollbackFor = Exception.class) public void aliCallback(Map params) { String modelStr = params.get("passback_params"); AliPayPassbackModel passback = JSONObject.parseObject(modelStr, AliPayPassbackModel.class); VideoVipOrderInfoEntity orderInfo = videoVipOrderInfoMapper.selectById(passback.getOrderId()); if (orderInfo.getPayType() != 1) { return; } VideoMemberEntity member = videoMemberMapper.selectById(orderInfo.getMemberId()); orderInfo.setStatus(VideoVipOrderInfoEntity.PAY_STATUS_PAY); orderInfo.setPayTime(new Date()); orderInfo.setPayTraderNo(params.get("trade_no")); videoVipOrderInfoMapper.updateById(orderInfo); } @Override public String findUsdtAddress() { VideoMemberEntity loginUser = LoginUserUtil.getLoginUser(); MemberCoinAddressEntity coinAddress = this.memberCoinAddressDao.selectAddressByMemberIdAndSymbol(loginUser.getId(), CoinTypeEnum.USDT.name()); if (coinAddress == null) { Map usdtMap = Trc20Service.createAddress(); String address = usdtMap.get("address"); String key = usdtMap.get("privateKey"); // 发送新增的地址到监听集合 usdtUpdateProducer.sendAddressMsg(address+","+"TRC20"); coinAddress = new MemberCoinAddressEntity(); coinAddress.setAddress(address); coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES); coinAddress.setMemberId(loginUser.getId()); coinAddress.setPrivateKey(key); coinAddress.setSymbol(CoinTypeEnum.USDT.name()); this.memberCoinAddressDao.insert(coinAddress); return address; } return coinAddress.getAddress(); } }