YJ
2021-05-17 c960041c8912c4118cb45317e58384286c7fb4d1

5个文件已修改
3个文件已添加
332 ■■■■ 已修改文件
facade-vip/src/main/java/com/ks/vip/pojo/DTO/PayWayInfoDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
facade-vip/src/main/java/com/ks/vip/service/VipOrederPayService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/query/ProviderAccountQuery.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/service/remote/LiJinProviderAccountServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/service/remote/LijinCreateServiceImpl.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/util/Constant.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/resources/mapper/LiJinProviderAccountMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-vip/src/main/java/com/ks/vip/service/remote/VipOrderPayServiceImpl.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
facade-vip/src/main/java/com/ks/vip/pojo/DTO/PayWayInfoDTO.java
New file
@@ -0,0 +1,28 @@
package com.ks.vip.pojo.DTO;
public class PayWayInfoDTO {
    //0-表示支付成功
    private int payWay;
    private String payUrl;
    public PayWayInfoDTO(int payWay, String payUrl) {
        this.payWay = payWay;
        this.payUrl = payUrl;
    }
    public int getPayWay() {
        return payWay;
    }
    public void setPayWay(int payWay) {
        this.payWay = payWay;
    }
    public String getPayUrl() {
        return payUrl;
    }
    public void setPayUrl(String payUrl) {
        this.payUrl = payUrl;
    }
}
facade-vip/src/main/java/com/ks/vip/service/VipOrederPayService.java
New file
@@ -0,0 +1,9 @@
package com.ks.vip.service;
public interface VipOrederPayService {
}
service-lijin/src/main/java/com/ks/lijin/query/ProviderAccountQuery.java
@@ -11,6 +11,7 @@
    // 名称
    public String name;
    public Long providerId;
    public String appKey;
    public String appSecret;
}
service-lijin/src/main/java/com/ks/lijin/service/remote/LiJinProviderAccountServiceImpl.java
@@ -27,6 +27,7 @@
        ProviderAccountQuery query = new ProviderAccountQuery();
        query.id = obj.getId();
        query.state = obj.getState();
        query.providerId = obj.getProviderId();
        query.appKey =  obj.getAppKey();
        query.appSecret =  obj.getAppSecret();
        return liJinProviderAccountMapper.count(query);
@@ -38,6 +39,7 @@
        ProviderAccountQuery query = new ProviderAccountQuery();
        query.id = obj.getId();
        query.state = obj.getState();
        query.providerId = obj.getProviderId();
        query.appKey =  obj.getAppKey();
        query.appSecret =  obj.getAppSecret();
        query.start = (page - 1) * pageSize;
@@ -45,6 +47,18 @@
        return liJinProviderAccountMapper.listByPage(query);
    }
    @Override
    public List<LiJinProviderAccount> listByProviderId(Long providerId) {
        ProviderAccountQuery query = new ProviderAccountQuery();
        query.state =1;
        query.providerId = providerId;
        query.start = 0;
        query.count = 1000;
        return liJinProviderAccountMapper.listByPage(query);
    }
    @Override
    public void insertSelective(LiJinProviderAccount t){
        liJinProviderAccountMapper.insertSelective(t);
service-lijin/src/main/java/com/ks/lijin/service/remote/LijinCreateServiceImpl.java
@@ -13,6 +13,7 @@
import com.ks.lijin.service.LiJinProviderAccountService;
import com.ks.lijin.service.LiJinProviderNoticeService;
import com.ks.lijin.service.LijinCreateService;
import com.ks.lijin.util.Constant;
import com.ks.lijin.utils.taobao.TaoBaoUtil;
import com.ks.lijin.utils.taobao.TaoKeApiUtil;
import com.ks.vip.pojo.DO.VipGradePotence;
@@ -30,6 +31,7 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@Service(version = "1.0")
@@ -78,11 +80,11 @@
    @Override
    public BigDecimal getTBLijinAmount(Long actionId, VIPEnum vipRank) throws LiJinGoodsException,LiJinAmountException {
    public BigDecimal getTBLijinAmount(Long actionId, VIPEnum vipRank) throws LiJinGoodsException, LiJinAmountException {
        //获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(1.商品不支持礼金创建)
        BigDecimal money = null;
        // 1、判断商品
        try{
        try {
            TaoBaoGoodsBrief goods = TaoKeApiUtil.searchGoodsDetail(actionId);
            if (goods == null) {
                throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
@@ -95,16 +97,16 @@
            //券后价 * 商品佣金比例 * 返利比例
            VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank);
            if (potence != null && potence.getRebatePercent()!= null) {
                money = TaoBaoUtil.getGoodsHongBaoMoney(goods,potence.getRebatePercent(),false);
            if (potence != null && potence.getRebatePercent() != null) {
                money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getRebatePercent(), false);
            }
        } catch (TaoBaoGoodsDownException e){
        } catch (TaoBaoGoodsDownException e) {
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
        }
        // 金额为空 或者小于零 则抛出异常
        if (money == null || money.compareTo(BigDecimal.valueOf(0)) <= 0) {
            throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE,"礼金创建的金额超出规定范围");
            throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金创建的金额超出规定范围");
        }
        return money;
@@ -119,8 +121,8 @@
        // 每日最大次数判断
        Integer numMax = potence.getTaolijinMaxNumber();
        if(numMax == null || numMax.intValue() <= 0) {
           throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        if (numMax == null || numMax.intValue() <= 0) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
        // 每日最大金额判断
@@ -131,13 +133,13 @@
        // 使用次数已经超过最大次数
        int numExpend = liJinExpendRecordService.countTodayNumByExpend(uid);
        if (numMax.intValue() < numExpend){
        if (numMax.intValue() < numExpend) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
        // 统计已使用金额
        BigDecimal moneyExpend = liJinExpendRecordService.countTodayMoneyByExpend(uid);
        if(moneyExpend != null) {
        if (moneyExpend != null) {
            moneyExpend = BigDecimal.valueOf(0);
        }
        // 消耗金额已经超过最大金额
@@ -146,7 +148,6 @@
        }
        return true;
    }
    @Override
@@ -158,25 +159,25 @@
        // 每日最大次数判断
        Integer numMax = potence.getTaolijinMaxNumber();
        if(numMax == null || numMax.intValue() <= 0) {
        if (numMax == null || numMax.intValue() <= 0) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
        // 每日最大金额判断
        BigDecimal moneyMax = potence.getTaolijinMaxMoney();
        if (moneyMax == null || moneyMax.compareTo(BigDecimal.valueOf(0)) <= 0 || moneyMax.compareTo(money) <= 0 ) {
        if (moneyMax == null || moneyMax.compareTo(BigDecimal.valueOf(0)) <= 0 || moneyMax.compareTo(money) <= 0) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_MONEY_LIMIT, "用户创建淘礼金的金额超限");
        }
        // 使用次数已经超过最大次数
        int numExpend = liJinExpendRecordService.countTodayNumByExpend(uid);
        if (numMax.intValue() < numExpend){
        if (numMax.intValue() < numExpend) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
        // 统计已使用金额
        BigDecimal moneyExpend = liJinExpendRecordService.countTodayMoneyByExpend(uid);
        if(moneyExpend != null) {
        if (moneyExpend != null) {
            moneyExpend = BigDecimal.valueOf(0);
        }
        // 加上本次需要使用金额
@@ -190,7 +191,6 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public LiJinExpendRecord createTBLijin(String uid, Long goodsId) throws LiJinException, LiJinGoodsException, LiJinUserException, LiJinAmountException {
@@ -202,9 +202,9 @@
        //淘礼金创建
        TaoBaoGoodsBrief goods = null;
        try{
        try {
            goods = TaoKeApiUtil.searchGoodsDetail(goodsId);
        } catch (TaoBaoGoodsDownException e){
        } catch (TaoBaoGoodsDownException e) {
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
        }
        if (goods == null) {
@@ -217,16 +217,11 @@
        // 执行创建淘礼金
        LiJinCreateParam params = getLiJinCreateParam();
        // TODO
       // params.setAppkey();
       //  params.setAppsecret();
        TaoLiJinDTO taoLiJinDTO = executeTaoLiJinAPI(uid, goodsId, lijinAmount, params);
        if (taoLiJinDTO == null) {
            throw new LiJinException(1, "淘宝API推广红包创建失败");
        }
        // 保存记录
        LiJinExpendRecord record = new LiJinExpendRecord();
@@ -243,49 +238,71 @@
    }
    // 创建淘礼金
    private TaoLiJinDTO executeTaoLiJinAPI(String uid, Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException {
        String appkey =params.getAppkey();
        String appsecret = params.getAppsecret();
    /**
     * 调用账号以及淘宝API
     * @param uid
     * @param goodsId
     * @param lijinAmount
     * @param params
     * @return
     * @throws LiJinGoodsException
     * @throws LiJinException
     */
    private TaoLiJinDTO executeTaoLiJinAPI(String uid, Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException, LiJinException {
        // 查询供应商账号信息
        List<LiJinProviderAccount> listAccount = liJinProviderAccountService.listByProviderId(Constant.PROVIDER_DEFAULT_ID);
        if (listAccount == null || listAccount.size() == 0) {
            throw new LiJinException(1, "供应商账号不存在");
        }
        TaoLiJinDTO taoLiJinDTO = null;
        // 遍历账号 用可使用账号
        for (LiJinProviderAccount account : listAccount) {
            params.setAppkey(account.getAppKey());
            params.setAppsecret(account.getAppSecret());
            try {
                taoLiJinDTO = executeTaoLiJinAPI(uid, goodsId, lijinAmount, params);
                if (taoLiJinDTO != null) {
                    break;
                }
            } catch (LiJinException e) {
                // 通知相应供应商  TODO
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        LiJinProviderNotice notice = new LiJinProviderNotice();
                        notice.setRead(false);
                        notice.setProviderId(account.getProviderId());
                       if (e.getCode() == LiJinException.CODE_TLJ_NO_MONEY) {
                            // 官方玩法钱包余额不足
                            notice.setTitle("玩法钱包余额不足");
                            notice.setContent("账号:" + account.getAccountName() + "官方玩法钱包余额不足");
                            notice.setType(NoticeTypeEnum.noMoney.name());
                            liJinProviderNoticeService.save(notice);
                        } else if (e.getCode() == LiJinException.CODE_TLJ_UN_PAID) {
                            // 未创建账户
                        }
                    }
                });
            }
        }
        // 创建淘礼金红包
        TaoLiJinDTO taoLiJinDTO = null;
        try {
            taoLiJinDTO = TaoKeApiUtil.createTaoLiJin(goodsId, params.getTitle(), lijinAmount,
                    params.getNum(), params.getSendStartTime(), params.getSendEndTime(),
                    params.getUseStartTime(), params.getUseEndTime(), new TaoKeAppInfo(appkey, appsecret, params.getPid()));
        } catch (LiJinException e) {
            // 通知相应供应商  TODO
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    LiJinProviderAccount account  = liJinProviderAccountService.getByAppInfo(appkey, appsecret);
                    if (account == null) {
                        return;
                    }
                    LiJinProviderNotice notice = new LiJinProviderNotice();
                    notice.setRead(false);
                    notice.setProviderId(account.getProviderId());
                    if (e.getCode() == LiJinException.CODE_TLJ_FORBIDDEN) {
                        // 该商品不支持创建淘礼金红包
                    } else if (e.getCode() == LiJinException.CODE_TLJ_NO_MONEY) {
                        // 官方玩法钱包余额不足
                        notice.setTitle("玩法钱包余额不足");
                        notice.setContent("账号:"+ appkey +"官方玩法钱包余额不足");
                        notice.setType(NoticeTypeEnum.noMoney.name());
                        liJinProviderNoticeService.save(notice);
                    } else if (e.getCode() == LiJinException.CODE_TLJ_UN_PAID) {
                        // 未创建账户
                    }
                }
            });
        }
        return taoLiJinDTO;
        return TaoKeApiUtil.createTaoLiJin(goodsId, params.getTitle(), lijinAmount,
                params.getNum(), params.getSendStartTime(), params.getSendEndTime(),
                params.getUseStartTime(), params.getUseEndTime(), new TaoKeAppInfo(params.getAppkey(), params.getAppsecret(), params.getPid()));
    }
    private BigDecimal getTBLijinAmount(TaoBaoGoodsBrief goods, VIPEnum vipRank) throws LiJinGoodsException,LiJinAmountException {
    /**
     * 获取商品可创建的礼金金额
     * @param goods 商品
     * @param vipRank  会员等级
     * @return
     * @throws LiJinGoodsException
     * @throws LiJinAmountException
     */
    private BigDecimal getTBLijinAmount(TaoBaoGoodsBrief goods, VIPEnum vipRank) throws
            LiJinGoodsException, LiJinAmountException {
        //获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(1.商品不支持礼金创建)
        BigDecimal money = null;
@@ -296,19 +313,20 @@
        //券后价 * 商品佣金比例 * 返利比例
        VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank);
        if (potence != null && potence.getRebatePercent()!= null) {
            money = TaoBaoUtil.getGoodsHongBaoMoney(goods,potence.getRebatePercent(),false);
        if (potence != null && potence.getRebatePercent() != null) {
            money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getRebatePercent(), false);
        }
        // 金额为空 或者小于零 则抛出异常
        if (money == null || money.compareTo(BigDecimal.valueOf(0)) <= 0) {
            throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE,"礼金创建的金额超出规定范围");
            throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金创建的金额超出规定范围");
        }
        return money;
    }
    /**
     * 创建淘礼金基本参数
     *
     * @return
     */
    private LiJinCreateParam getLiJinCreateParam() {
service-lijin/src/main/java/com/ks/lijin/util/Constant.java
@@ -2,8 +2,8 @@
public class Constant {
    //奖品领取有效期为7天
    public final static long ACTIVITY_DRAWN_RECIEVE_VALID_TIME = 1000 * 60 * 60L * 24 * 7;
    // 默认供应商ID
    public final static long PROVIDER_DEFAULT_ID = 1L;
}
service-lijin/src/main/resources/mapper/LiJinProviderAccountMapper.xml
@@ -82,6 +82,7 @@
  <sql id="listWhere">
    <if test="query.id!=null">and ac_id=#{query.id}</if>
    <if test="query.name!=null">and ac_account_name=#{query.name}</if>
    <if test="query.providerId!=null">and ac_provider_id=#{query.providerId}</if>
    <if test="query.state!=null">and ac_state=#{query.state}</if>
    <if test="query.appKey!=null">and ac_app_key=#{query.appKey}</if>
    <if test="query.appSecret!=null">and ac_app_secret=#{query.appSecret}</if>
service-vip/src/main/java/com/ks/vip/service/remote/VipOrderPayServiceImpl.java
New file
@@ -0,0 +1,127 @@
package com.ks.vip.service.remote;
import com.ks.vip.exception.VipOrderException;
import com.ks.vip.mapper.VipOrderMapper;
import com.ks.vip.pojo.DO.VipCombo;
import com.ks.vip.pojo.DO.VipOrder;
import com.ks.vip.pojo.DTO.PayWayInfoDTO;
import com.ks.vip.pojo.DTO.VipOrderDTO;
import com.ks.vip.pojo.Enums.OrderTypeEnum;
import com.ks.vip.query.VipOrderQuery;
import com.ks.vip.service.VipCenterService;
import com.ks.vip.service.VipComboService;
import com.ks.vip.service.VipOrederPayService;
import com.ks.vip.service.VipOrederService;
import com.ks.vip.util.Constant;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.StringUtil;
import org.yeshi.utils.alipay.AlipayH5PayUtil;
import org.yeshi.utils.entity.wx.WXPayOrderInfoV3;
import org.yeshi.utils.wx.WXPayV3Util;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@Service(version = "1.0")
public class VipOrderPayServiceImpl implements VipOrederPayService {
    @Resource
    private VipOrderMapper vipOrderMapper;
    @Resource
    private VipComboService vipComboService;
    @Resource
    private VipCenterService vipCenterService;
    @Transactional(rollbackFor = Exception.class)
    @Override
    public PayWayInfoDTO payOrder(OrderRecord record) throws OrderException, GoldCornException, PayException, VIPException, PPTVException, VideoBuyRecordException {
        String orderNo = VIPOrderUtil.getOutOrderNo(record.getOrderType(), record.getId());
        switch (record.getPayWay()) {
            case OrderRecord.PAY_WAY_ALIPAY_GOLDCORN:
                try {
                    goldCornManager.consumeGoldCorn(record, record.getGoldCorn());
                } catch (Exception e) {
                    throw new GoldCornException(1, "影视豆扣除出错");
                }
                paySuccess(record.getId(), OrderRecord.PAY_WAY_GOLDCORN, null, new Date());
                orderLogger.info("订单影视豆支付成功:id-{}", record.getId());
            case OrderRecord.PAY_WAY_ALIPAY: {
                if (record.getMoney() != null && record.getMoney().compareTo(new BigDecimal(0)) == 0) {
                    return new PayWayInfoDTO(0, VipUtil.getPaySuccessUrl(record.getId()));
                }
                //生成支付宝支付订单
                String form = VipUtil.getVipChargeAlipayForm(record.getId(), record.getOrderType(), orderNo, record.getMoney());
                //暂存2分钟
                String id = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis());
                redisManager.cacheCommonString(id, form, 120);
                String payUrl = Constant.HOST + "/BuWan/alipay/printPayForm?formId=" + id;
                orderLogger.info("订单创建支付宝支付链接成功:id-{} 链接-{}", record.getId(), payUrl);
                return new PayWayInfoDTO(OrderRecord
                        .PAY_WAY_ALIPAY, payUrl);
            }
            case OrderRecord.PAY_WAY_WX_GOLDCORN:
                try {
                    goldCornManager.consumeGoldCorn(record, record.getGoldCorn());
                } catch (){
                }
        }
        @Transactional(rollbackFor = Exception.class)
        @Override
        public OrderRecord checkOrderPayState(String id) {
            OrderRecord record = vipOrderRecordDao.find(OrderRecord.class, id);
            if (record.getState() == OrderRecord.STATE_PAY)
                return record;
            switch (record.getPayWay()) {
                case OrderRecord.PAY_WAY_ALIPAY_GOLDCORN:
                case OrderRecord.PAY_WAY_ALIPAY: {
                    //支付宝
                    AlipayTradeQueryResponse res = null;
                    try {
                        res = AlipayH5PayUtil.queryOrder(VipUtil.getAlipayApp(), VIPOrderUtil.getOutOrderNo(record.getOrderType(), id), null);
                        //支付成功
                        if (res.isSuccess() && "TRADE_SUCCESS".equalsIgnoreCase(res.getTradeStatus())) {
                            try {
                                return paySuccess(id, OrderRecord.PAY_WAY_ALIPAY, new BigDecimal(res.getTotalAmount()), new Date());
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    } catch (AlipayApiException e) {
                        e.printStackTrace();
                    }
                }
                break;
                case OrderRecord.PAY_WAY_WX_GOLDCORN:
                case OrderRecord.PAY_WAY_WX: {
                    //微信
                    try {
                        WXPayOrderInfoV3 info = WXPayV3Util.getPayOrderInfo(VIPOrderUtil.getOutOrderNo(record.getOrderType(), id), VipUtil.getWXAPP());
                        if (info != null && info.getTrade_state().equalsIgnoreCase("SUCCESS")) {
                            paySuccess(id, record.getPayWay(), new BigDecimal(info.getAmount().getPayer_total()).divide(new BigDecimal(100), 2, RoundingMode.FLOOR), new Date());
                            return record;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break;
            }
            return record;
        }
}