yujian
2020-06-15 3579201658f94480a8421507c24d2ece83dbf0c7
云发单相关
6个文件已添加
26个文件已修改
1个文件已删除
1278 ■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/controller/admin/OrderAdminController.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/admin/UserInfoAdminController.java 182 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/admin/user/cloud/UserCloudAdminController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/UserCloudControllerV2.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/HongBaoV2CountMapper.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/user/cloud/UserCloudSendRecordDao.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/user/invite/ThreeSaleDetailDao.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dto/AlipayTradeWapPayDTO.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dto/aitaoker/RobotInfoDTO.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/bus/user/cloud/CloudOrderMenuEnum.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/config/AlipayWapConfig.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/job/UserCloudJob.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/mapping/hongbao/HongBaoV2CountMapper.xml 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/count/HongBaoV2CountServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserInfoServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudManageServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudOrderServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudSendRecordServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudServiceImpl.java 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/invite/ThreeSaleDetailSerivceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/count/HongBaoV2CountService.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/user/cloud/UserCloudSendRecordService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/user/invite/ThreeSaleDetailService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/manger/alipay/UserCloudAlipayManager.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/Constant.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/aitaoker/AitaokerApiUtil.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/alipay/AlipayApi.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/alipay/AlipayWapConfig.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/vo/user/cloud/UserCloudInfoVO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/resource/alipay/web/alipayCertPublicKey_RSA2.crt 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/resource/alipay/web/alipayRootCert.crt 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/resource/alipay/web/appCertPublicKey_2021001164655513.crt 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/resource/alipay_wap.properties 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/admin/OrderAdminController.java
@@ -447,30 +447,51 @@
    
    @RequestMapping(value = "countOrderInfo")
    public void countOrderInfo(String callback, Long uid, PrintWriter out) {
        JSONObject data = new JSONObject();
        /* ---------  本月累计 ------------*/
        JSONObject month = new JSONObject();
        // 自购已到账
        long selfNumEnd = hongBaoV2CountService.countMyDirectOrderByCashArrival(uid, null, 1);
        month.put("selfNumEnd", hongBaoV2CountService.countOrderByCashArrival(uid, null, 1, 1));
        // 分享已到账
        long shareNumEnd = hongBaoV2CountService.countMyDirectOrderByCashArrival(uid, null, 2);
        month.put("shareNumEnd", hongBaoV2CountService.countOrderByCashArrival(uid, null, 2, 1));
        // 邀请已到账
        month.put("inviteNumEnd", hongBaoV2CountService.countOrderByCashArrival(uid, null, 3, 1));
        // 自购未到账
        long selfNum = hongBaoV2CountService.countMyDirectOrderByCashNotArrival(uid, null, 1);
        month.put("selfNum", hongBaoV2CountService.countOrderByCashNotArrival(uid, null, 1, 1));
        // 分享未到账
        long shareNum = hongBaoV2CountService.countMyDirectOrderByCashNotArrival(uid, null, 2);
        month.put("shareNum", hongBaoV2CountService.countOrderByCashNotArrival(uid, null, 2, 1));
        // 邀请未到账
        month.put("inviteNum", hongBaoV2CountService.countOrderByCashNotArrival(uid, null, 3, 1));
        data.put("month", month);
        
        
        /* ---------  历史累计 ------------*/
        JSONObject history = new JSONObject();
        // 自购已到账
        history.put("selfNumEnd", hongBaoV2CountService.countOrderByCashArrival(uid, null, 1, null));
        // 分享已到账
        history.put("shareNumEnd", hongBaoV2CountService.countOrderByCashArrival(uid, null, 2, null));
        // 邀请已到账
        history.put("inviteNumEnd", hongBaoV2CountService.countOrderByCashArrival(uid, null, 3, null));
        // 自购未到账
        history.put("selfNum", hongBaoV2CountService.countOrderByCashNotArrival(uid, null, 1, null));
        // 分享未到账
        history.put("shareNum", hongBaoV2CountService.countOrderByCashNotArrival(uid, null, 2, null));
        // 邀请未到账
        history.put("inviteNum", hongBaoV2CountService.countOrderByCashNotArrival(uid, null, 3, null));
        data.put("history", history);
        /* ---------  付款金额大于1 ------------*/
        // 自购已到账
        long selfAccountEnd = hongBaoV2CountService.countMyDirectOrderByCashArrival(uid, Constant.VIP_ORDER_PAY, 1);
        // 分享已到账
        long shareAccountEnd = hongBaoV2CountService.countMyDirectOrderByCashArrival(uid, Constant.VIP_ORDER_PAY, 2);
        // 自购未到账
        long selfAccount = hongBaoV2CountService.countMyDirectOrderByCashNotArrival(uid, Constant.VIP_ORDER_PAY, 1);
        long selfAccount = hongBaoV2CountService.countOrderByCashNotArrival(uid, Constant.VIP_ORDER_PAY, 1, null);
        // 分享未到账
        long shareAccount = hongBaoV2CountService.countMyDirectOrderByCashNotArrival(uid, Constant.VIP_ORDER_PAY, 2);
        JSONObject data = new JSONObject();
        data.put("selfNumEnd", selfNumEnd);
        data.put("shareNumEnd", shareNumEnd);
        data.put("selfNum", selfNum);
        data.put("shareNum", shareNum);
        long shareAccount = hongBaoV2CountService.countOrderByCashNotArrival(uid, Constant.VIP_ORDER_PAY, 2, null);
        data.put("selfAccountEnd", selfAccountEnd);
        data.put("shareAccountEnd", shareAccountEnd);
        data.put("selfAccount", selfAccount);
fanli/src/main/java/com/yeshi/fanli/controller/admin/UserInfoAdminController.java
@@ -32,11 +32,13 @@
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode;
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode.ForbiddenUserIdentifyCodeTypeEnum;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.UserActiveLog;
import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.bus.user.UserInviteValidNum;
import com.yeshi.fanli.entity.bus.user.UserRank;
import com.yeshi.fanli.entity.bus.user.vip.TearcherInfo;
import com.yeshi.fanli.entity.bus.user.vip.UserVIPInfo;
import com.yeshi.fanli.entity.common.AdminUser;
import com.yeshi.fanli.entity.integral.IntegralDetail;
@@ -45,6 +47,7 @@
import com.yeshi.fanli.exception.user.ForbiddenUserIdentifyCodeException;
import com.yeshi.fanli.exception.user.vip.UserVIPInfoException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.count.UserInfoCountService;
import com.yeshi.fanli.service.inter.money.UserMoneyDetailService;
import com.yeshi.fanli.service.inter.money.extract.BindingAccountService;
@@ -58,9 +61,11 @@
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserRankService;
import com.yeshi.fanli.service.inter.user.integral.IntegralDetailService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleDetailService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.invite.UserInviteValidNumService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.inter.user.vip.TearcherService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.fanli.tag.PageEntity;
import com.yeshi.fanli.util.Constant;
@@ -129,6 +134,15 @@
    
    @Resource
    private HongBaoV2Service hongBaoV2Service;
    @Resource
    private TearcherService tearcherService;
    @Resource
    private ThreeSaleDetailService threeSaleDetailService;
    @Resource
    private HongBaoV2CountService hongBaoV2CountService;
    
    
    /**
@@ -380,6 +394,148 @@
            e.printStackTrace();
        }
    }
    /**
     *  用户粉丝统计
     *
     * @param callback
     * @param pageIndex
     * @param pageSize
     * @param id
     * @param out
     */
    @RequestMapping(value = "countTeamFans")
    public void countTeamFans(String callback, Long uid, PrintWriter out) {
        JSONObject data = new JSONObject();
        // 导师
        String tearcherName = "";
        TearcherInfo tearcherInfo = tearcherService.selectByUid(uid);
        if (tearcherInfo != null) {
            tearcherName = tearcherInfo.getNickName();
        }
        data.put("tearcherName", tearcherName);
        // 邀请人
        String bossName = "";
        UserInfo boss = threeSaleSerivce.getBoss(uid);
        if (boss != null) {
            bossName =  boss.getNickName();
        }
        data.put("bossName", bossName);
        // 邀请粉丝
        int doneFirst = 0;
        int doneSecond = 0;
        UserInviteValidNum userInviteValidNum = userInviteValidNumService.selectByPrimaryKey(uid);
        if (userInviteValidNum != null) {
            doneFirst = userInviteValidNum.getNumFirst() == null ? 0 : userInviteValidNum.getNumFirst();
            doneSecond = userInviteValidNum.getNumSecond() == null ? 0 : userInviteValidNum.getNumSecond();
        }
        data.put("doneFirst", doneFirst);
        data.put("doneSecond", doneSecond);
        // 九代粉丝数量
        data.put("nineFans", threeSaleDetailService.countByBossUidAndMaxLevel(uid, 9));
        // 有效粉丝
        data.put("first", threeSaleSerivce.countFirstTeam(uid));
        data.put("second", threeSaleSerivce.countSecondTeam(uid));
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 用户详细信息
     * @param callback
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getInfoDetail")
    public void getInfoDetail(String callback, Long uid, PrintWriter out) {
        JSONObject data = new JSONObject();
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        data.put("phone", user.getPhone());
        data.put("state", user.getState());
        data.put("createtime", user.getCreatetime());
        String mark = "";
        String activation = "未激活";
        UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
        if (userInfoExtra != null) {
            if (!StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
                mark = userInfoExtra.getMark();
            }
            String inviteCode = userInfoExtra.getInviteCode();
            if (!StringUtil.isNullOrEmpty(inviteCode)) {
                activation = "已激活";
            } else {
                activation = "未激活";
            }
        }
        data.put("mark", mark);
        data.put("activation", activation);
        // 最近一次下单时间
        String orderTime = "";
        Date lastOrderTime = hongBaoV2CountService.getLastHongBaoTime(uid);
        if (lastOrderTime != null) {
            orderTime = TimeUtil.formatDate(lastOrderTime);
        }
        data.put("orderTime", orderTime);
        // 最近登录时间
        String activeTime = "";
        UserActiveLog userActiveLog = userActiveLogService.getUserLatestActiveInfo(uid);
        if (userActiveLog != null) {
            activeTime = TimeUtil.formatDate(userActiveLog.getCreateTime());
        }
        data.put("activeTime", activeTime);
//
//        // 显示用户微信 淘宝 老版本存在
//        String wxUnionId = userInfoVO.getWxUnionId();
//        if (wxUnionId == null || wxUnionId.trim().length() == 0) {
//            userInfoVO.setWxName(null);
//        }
//
//        // 是否绑定支付宝(购买 + 分享权限)
//        String taoBaoUid = userInfoVO.getTaoBaoUid();
//        String tbSpecialId = userInfoVO.getTbSpecialId();
//        String tbRelationId = userInfoVO.getTbRelationId();
//        if (StringUtil.isNullOrEmpty(taoBaoUid) || StringUtil.isNullOrEmpty(tbSpecialId)
//                || StringUtil.isNullOrEmpty(tbRelationId)) {
//            userInfoVO.setTbName(null);
//            userInfoVO.setTaoBaoUid(null);
//        }
//
//        Long uid = userInfoVO.getId();
//        /* 绑定收款账号信息 */
//        List<BindingAccount> account = bindingAccountMapper.selectByUid(uid);
//        if (account != null && account.size() > 0) {
//            BindingAccount bindingAccount = account.get(0);
//            Integer type = bindingAccount.getType();
//            if (type != null && type == 1) {
//                // 支付宝
//                userInfoVO.setAccountAlipay(bindingAccount.getAccount());
//                userInfoVO.setAccountName(bindingAccount.getName());
//                userInfoVO.setAccountBindId(bindingAccount.getId());
//
//            } else if (type != null && type == 2) {
//                // 微信
//                userInfoVO.setAccountWX(bindingAccount.getAccount());
//                userInfoVO.setAccountNameWX(bindingAccount.getName());
//                userInfoVO.setAccountBindIdWX(bindingAccount.getId());
//            }
//        }
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    
    /**
     * 统计今日用户总情况
@@ -1479,31 +1635,7 @@
    
    
    
    /**
     *  用户粉丝统计
     *
     * @param callback
     * @param pageIndex
     * @param pageSize
     * @param id
     * @param out
     */
    @RequestMapping(value = "countTeamFans")
    public void countTeamFans(String callback, Long uid, PrintWriter out) {
        int doneFirst = 0;
        int doneSecond = 0;
        UserInviteValidNum userInviteValidNum = userInviteValidNumService.selectByPrimaryKey(uid);
        if (userInviteValidNum != null) {
            doneFirst = userInviteValidNum.getNumFirst() == null ? 0 : userInviteValidNum.getNumFirst();
            doneSecond = userInviteValidNum.getNumSecond() == null ? 0 : userInviteValidNum.getNumSecond();
        }
        JSONObject data = new JSONObject();
        data.put("doneFirst", doneFirst);
        data.put("doneSecond", doneSecond);
        data.put("first", threeSaleSerivce.countFirstTeam(uid));
        data.put("second", threeSaleSerivce.countSecondTeam(uid));
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
            
}
fanli/src/main/java/com/yeshi/fanli/controller/admin/user/cloud/UserCloudAdminController.java
@@ -1,6 +1,7 @@
package com.yeshi.fanli.controller.admin.user.cloud;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
@@ -12,12 +13,14 @@
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserSystemCoupon;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloud;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGoods;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGroup;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudSendContent;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudSendRecord;
import com.yeshi.fanli.entity.system.SystemCoupon.CouponTypeEnum;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
@@ -341,4 +344,29 @@
    }
    
    
    /**
     * 发圈记录统计
     * @param callback
     * @param uid
     * @param out
     */
    @RequestMapping(value = "statisticsCloud")
    public void statisticsCloud(String callback, Long uid, PrintWriter out) {
        try {
            long orderNum = userCloudOrderService.countOrderRecord(uid, 1);
            long recordNum = userCloudSendRecordService.countRecordNum(uid, null);
            long goodsNum = userCloudGoodsService.countByUid(uid);
            JSONObject data = new JSONObject();
            data.put("orderNum", orderNum);
            data.put("recordNum", recordNum);
            data.put("goodsNum", goodsNum);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/UserCloudControllerV2.java
@@ -38,6 +38,7 @@
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGoodsService;
@@ -55,6 +56,7 @@
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.suning.SuningUtil;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
import com.yeshi.fanli.vo.homemodule.BannerVO;
import com.yeshi.fanli.vo.user.cloud.CloudOrderMenuVO;
import com.yeshi.fanli.vo.user.cloud.UserCloudInfoVO;
@@ -98,6 +100,8 @@
    @Resource
    private RedisManager redisManager;
    
    @Resource
    private SwiperPictureService swiperPictureService;
    /**
     * 查询开通记录
@@ -237,6 +241,13 @@
                }
            }
        }
        // 教程
        List<BannerVO> listBanner = swiperPictureService.getByBannerCard("cloud_course");
        if (listBanner != null && listBanner.size() > 0) {
            cloudInfoVO.setCourse(listBanner.get(0));
        }
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(cloudInfoVO));
    }
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/HongBaoV2CountMapper.java
@@ -144,16 +144,29 @@
             @Param("type")Integer type);
    
    /**
     *  注:1笔且付款总金额不小于 payment 元(退款为失效
     * 统计已到账订单数量
     * @param uid
     * @param payment
     * @param payment -付款金额
     * @param type -类型: 1自购 2分享 3邀请  4自购+分享
     * @param dateType 1本月
     * @return
     */
    Long countMyDirectOrderByCashNotArrival(@Param("uid") Long uid, @Param("payment") BigDecimal payment,
             @Param("type")Integer type);
    Long countOrderByCashArrival(@Param("uid") Long uid, @Param("payment") BigDecimal payment,
             @Param("type")Integer type, @Param("dateType")Integer dateType);
    
    
    /**
     * 统计未到账订单数量
     * @param uid
     * @param payment -付款金额
     * @param type -类型: 1自购 2分享 3邀请  4自购+分享
     * @param dateType 1本月
     * @return
     */
    Long countOrderByCashNotArrival(@Param("uid") Long uid, @Param("payment") BigDecimal payment,
             @Param("type")Integer type, @Param("dateType")Integer dateType);
    /**
     * 查询用户个类型预计奖金
     * @param uid
     * @param dateType 日期类型
fanli/src/main/java/com/yeshi/fanli/dao/user/cloud/UserCloudSendRecordDao.java
@@ -104,4 +104,22 @@
        }
        return count(query);
    }
    public long countRecordNum(Long uid, Integer sendOrigin){
        List<Criteria> list = new ArrayList<Criteria>();
        if (uid != null)
            list.add(Criteria.where("uid").is(uid));
        if (sendOrigin != null)
            list.add(Criteria.where("sendOrigin").is(sendOrigin));
        Query query = new Query();
        if (list.size() > 0) {
            Criteria[] cas = new Criteria[list.size()];
            for (int i = 0; i < list.size(); i++)
                cas[i] = list.get(i);
            query.addCriteria(new Criteria().andOperator(cas));
        }
        return count(query);
    }
}
fanli/src/main/java/com/yeshi/fanli/dao/user/invite/ThreeSaleDetailDao.java
@@ -68,6 +68,14 @@
        return count(query);
    }
    public long countByBossUidAndMaxLevel(Long bossUid, int minLevel) {
        Query query = new Query();
        query.addCriteria(new Criteria().andOperator(Criteria.where("bossUid").is(bossUid),
                Criteria.where("level").lte(minLevel)));
        return count(query);
    }
    public List<ThreeSaleDetail> listByWorkerUid(Long uid) {
        Query query = new Query();
        query.addCriteria(Criteria.where("workerUid").is(uid));
fanli/src/main/java/com/yeshi/fanli/dto/AlipayTradeWapPayDTO.java
New file
@@ -0,0 +1,85 @@
package com.yeshi.fanli.dto;
public class AlipayTradeWapPayDTO {
    // 收款方账号
    private String sellerId;
    // 订单号
    private String outTradeNo;
    // 订单金额:0.01元,精准到分
    private String totalAmount;
    // 订单标题
    private String subject;
    // 销售产品码,商家和支付宝签约的产品码
    private String productCode;
    // 该笔订单允许的最晚付款时间,逾期将关闭交易
    private String timeoutExpress;
    // 支付成功后返回哪个前端页面
    private String returnUrl;
    // 支付成功后回调地址
    private String notifyUrl;
    public String getSellerId() {
        return sellerId;
    }
    public void setSellerId(String sellerId) {
        this.sellerId = sellerId;
    }
    public String getOutTradeNo() {
        return outTradeNo;
    }
    public void setOutTradeNo(String outTradeNo) {
        this.outTradeNo = outTradeNo;
    }
    public String getTotalAmount() {
        return totalAmount;
    }
    public void setTotalAmount(String totalAmount) {
        this.totalAmount = totalAmount;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getProductCode() {
        return productCode;
    }
    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }
    public String getTimeoutExpress() {
        return timeoutExpress;
    }
    public void setTimeoutExpress(String timeoutExpress) {
        this.timeoutExpress = timeoutExpress;
    }
    public String getReturnUrl() {
        return returnUrl;
    }
    public void setReturnUrl(String returnUrl) {
        this.returnUrl = returnUrl;
    }
    public String getNotifyUrl() {
        return notifyUrl;
    }
    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }
}
fanli/src/main/java/com/yeshi/fanli/dto/aitaoker/RobotInfoDTO.java
@@ -5,48 +5,54 @@
public class RobotInfoDTO {
    @SerializedName("id")
    private Integer id;
    @SerializedName("robot_type")
    private Integer robotType;
    @SerializedName("uid")
    private String uid;
    @SerializedName("wechatrobot")
    private String wechatrobot;
    @SerializedName("amount")
    private String amount;
    @SerializedName("wx_id")
    private String wxId;
    @SerializedName("amount_used")
    private String amountUsed;
    @SerializedName("group_num")
    private Integer groupNum; //最大群数
    private Integer groupNum; // 最大群数
    @SerializedName("passwd")
    private String passwd;
    @SerializedName("nickname")
    private String nickname;
    @SerializedName("c_uid")
    private String cUid;
    @SerializedName("login_status")
    private String loginStatus;
    @SerializedName("end_time")
    private String endTime; //到期时间 1590139325
    @SerializedName("wId")
    private String endTime; // 到期时间 1590139325
    @SerializedName("remark")
    private String remark;
    @SerializedName("wId")
    private String wcId; //微信实例id
    @SerializedName("wc_id")
    private String wcId; // 微信实例id
    @SerializedName("agent_uid")
    private String agentUid; //代理id
    private String agentUid; // 代理id
    @SerializedName("is_enabled")
    private String isEnabled; //0 正常 1暂停
    private String isEnabled; // 0 正常 1暂停
    @SerializedName("is_new")
    private String isNew; // 0 正常 1暂停
    public String getUid() {
        return uid;
@@ -160,13 +166,28 @@
        this.id = id;
    }
    public String getAmount() {
        return amount;
    public Integer getRobotType() {
        return robotType;
    }
    public void setAmount(String amount) {
        this.amount = amount;
    public void setRobotType(Integer robotType) {
        this.robotType = robotType;
    }
    public String getWxId() {
        return wxId;
    }
    public void setWxId(String wxId) {
        this.wxId = wxId;
    }
    public String getIsNew() {
        return isNew;
    }
    public void setIsNew(String isNew) {
        this.isNew = isNew;
    }
}
fanli/src/main/java/com/yeshi/fanli/entity/bus/user/cloud/CloudOrderMenuEnum.java
@@ -3,20 +3,17 @@
import com.yeshi.fanli.util.StringUtil;
public enum CloudOrderMenuEnum {
    robotMonth(20.00, 1, 1, "机器人月套餐", "一个月"),
    robotMonth1(20.00, 1, 1, "机器人月套餐", "三个月"),
    robotMonth2(20.00, 1, 1, "机器人月套餐", "半年"),
    robotMonth3(20.00, 1, 1, "机器人月套餐", "一年");
    robotMonth(0.01, 4, 1, "机器人月套餐", "一个月");
    
    private double money;
    private Integer type;
    private Integer robotType;
    private Integer month;
    private String desc;
    private String descShow;
    private CloudOrderMenuEnum(double money, Integer type, Integer month, String desc, String descShow) {
    private CloudOrderMenuEnum(double money, Integer robotType, Integer month, String desc, String descShow) {
        this.money = money;
        this.type = type;
        this.robotType = robotType;
        this.month = month;
        this.desc = desc;
        this.descShow = descShow;
@@ -26,8 +23,8 @@
        return money;
    }
    public Integer getType() {
        return type;
    public Integer getRobotType() {
        return robotType;
    }
    public Integer getMonth() {
fanli/src/main/java/com/yeshi/fanli/entity/config/AlipayWapConfig.java
New file
@@ -0,0 +1,80 @@
package com.yeshi.fanli.entity.config;
import org.yeshi.utils.annotation.Map;
public class AlipayWapConfig {
    @Map("appId")
    private String appId;
    @Map("sellerId")
    private String sellerId;
    @Map("private_key")
    private String privateKey;
    @Map("public_key")
    private String publicKey;
    @Map("app_cert_path")
    private String appCertPath;
    @Map("alipay_root_cert_path")
    private String alipayRootCertPath ;
    @Map("alipay_cert_path")
    private String alipayCertPath ;
    public String getAppCertPath() {
        return appCertPath;
    }
    public void setAppCertPath(String appCertPath) {
        this.appCertPath = appCertPath;
    }
    public String getAlipayRootCertPath() {
        return alipayRootCertPath;
    }
    public void setAlipayRootCertPath(String alipayRootCertPath) {
        this.alipayRootCertPath = alipayRootCertPath;
    }
    public String getAlipayCertPath() {
        return alipayCertPath;
    }
    public void setAlipayCertPath(String alipayCertPath) {
        this.alipayCertPath = alipayCertPath;
    }
    public String getAppId() {
        return appId;
    }
    public void setAppId(String appId) {
        this.appId = appId;
    }
    public String getPrivateKey() {
        return privateKey;
    }
    public void setPrivateKey(String privateKey) {
        this.privateKey = privateKey;
    }
    public String getSellerId() {
        return sellerId;
    }
    public void setSellerId(String sellerId) {
        this.sellerId = sellerId;
    }
    public String getPublicKey() {
        return publicKey;
    }
    public void setPublicKey(String publicKey) {
        this.publicKey = publicKey;
    }
}
fanli/src/main/java/com/yeshi/fanli/job/UserCloudJob.java
@@ -11,6 +11,7 @@
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudOrderService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudService;
@@ -48,6 +49,7 @@
            try {
                userCloudAlipayManager.tradeQueryByOrderId(cloudOrder.getId());
            } catch (Exception e) {
                LogHelper.errorDetailInfo(e);
                e.printStackTrace();
            }
        }
fanli/src/main/java/com/yeshi/fanli/mapping/hongbao/HongBaoV2CountMapper.xml
@@ -307,15 +307,56 @@
    </select>
    
    
    <select id="countMyDirectOrderByCashNotArrival" resultType="Long">
    <select id="countOrderByCashArrival" resultType="Long">
        SELECT COUNT(0)  FROM (SELECT co.`co_order_no` FROM yeshi_ec_hongbao_v2 v2
        LEFT JOIN yeshi_ec_hongbao_order h ON v2.`hb_id` = h.`ho_hongbao_id`
        LEFT JOIN yeshi_ec_hongbao_order h ON h.`ho_hongbao_id` = IF(v2.hb_pid IS NULL,v2.hb_id,v2.hb_pid)
        LEFT JOIN yeshi_ec_common_order co ON h.`ho_order_id` = co.`co_id`
        WHERE  v2.`hb_uid` = #{uid} AND  v2.`hb_state` = 3
             <if test="type == 1"> <!-- 自购订单 -->
                 AND v2.`hb_type` = 1
             </if>
             <if test="type == 2">  <!-- 分享订单 -->
                 AND v2.`hb_type` = 20
             </if>
             <if test="type == 3"> <!-- 邀请订单 -->
                 AND (v2.`hb_type` = 5 OR v2.`hb_type` = 6 OR v2.`hb_type` = 7 OR v2.`hb_type` = 21 OR v2.`hb_type` = 22)
             </if>
             <if test="type == 4"> <!-- 直接相关订单 -->
                 AND (v2.`hb_type` = 1 OR v2.`hb_type` = 20)
             </if>
             <if test="payment != null"> <!-- 付款金额限制 -->
                 AND co.`co_payment` >=  #{payment}
             </if>
             <if test="dateType == 1"> <!-- 本月订单 -->
                 AND DATE_FORMAT(co.`co_third_create_time`,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m')
             </if>
        GROUP BY co.`co_order_no`,co.`co_source_type`)A
    </select>
    <select id="countOrderByCashNotArrival" resultType="Long">
        SELECT COUNT(0)  FROM (SELECT co.`co_order_no` FROM yeshi_ec_hongbao_v2 v2
        LEFT JOIN yeshi_ec_hongbao_order h ON h.`ho_hongbao_id` = IF(v2.hb_pid IS NULL,v2.hb_id,v2.hb_pid)
        LEFT JOIN yeshi_ec_common_order co ON h.`ho_order_id` = co.`co_id`
        WHERE  v2.`hb_uid` = #{uid} AND (v2.`hb_state` = 1 or v2.`hb_state` = 2)
             <if test="type == 1">AND v2.`hb_type` = 1</if>
             <if test="type == 2">AND v2.`hb_type` = 20</if>
             <if test="type == null">AND (v2.`hb_type` = 1 OR v2.`hb_type` = 20)</if>
             <if test="payment != null">AND co.`co_payment` >=  #{payment}</if>
             <if test="type == 1"> <!-- 自购订单 -->
                 AND v2.`hb_type` = 1
             </if>
             <if test="type == 2">  <!-- 分享订单 -->
                 AND v2.`hb_type` = 20
             </if>
             <if test="type == 3"> <!-- 邀请订单 -->
                 AND (v2.`hb_type` = 5 OR v2.`hb_type` = 6 OR v2.`hb_type` = 7 OR v2.`hb_type` = 21 OR v2.`hb_type` = 22)
             </if>
             <if test="type == 4"> <!-- 直接相关订单 -->
                 AND (v2.`hb_type` = 1 OR v2.`hb_type` = 20)
             </if>
             <if test="payment != null"> <!-- 付款金额限制 -->
                 AND co.`co_payment` >=  #{payment}
             </if>
             <if test="dateType == 1"> <!-- 本月订单 -->
                 AND DATE_FORMAT(co.`co_third_create_time`,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m')
             </if>
        GROUP BY co.`co_order_no`,co.`co_source_type`)A
    </select>
    
fanli/src/main/java/com/yeshi/fanli/service/impl/count/HongBaoV2CountServiceImpl.java
@@ -159,14 +159,6 @@
        return count;
    }
    
    @Override
    public long countMyDirectOrderByCashNotArrival(Long uid, BigDecimal payment, Integer type) {
        Long count = hongBaoV2CountMapper.countMyDirectOrderByCashNotArrival(uid, payment, type);
        if (count == null) {
            count = 0L;
        }
        return count;
    }
    
    @Override
    public BigDecimal getRewardMoneyToCount(Long uid, Integer dateType, Integer hbType, List<Integer> listSource) {
@@ -218,6 +210,22 @@
         return money;
    }
    
    @Override
    public long countOrderByCashArrival(Long uid, BigDecimal payment, Integer type, Integer dateType) {
        Long count = hongBaoV2CountMapper.countOrderByCashArrival(uid, payment, type, dateType);
        if (count == null) {
            count = 0L;
        }
        return count;
    }
    
    @Override
    public long countOrderByCashNotArrival(Long uid, BigDecimal payment, Integer type, Integer dateType) {
        Long count = hongBaoV2CountMapper.countOrderByCashNotArrival(uid, payment, type, dateType);
        if (count == null) {
            count = 0L;
        }
        return count;
    }
    
}
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserInfoServiceImpl.java
@@ -314,6 +314,14 @@
            } else {
                userInfoVO.setBossName("上级:" + boss.getNickName());
            }
            // 微信号
            String wxId = userInfoVO.getWxId();
            if (StringUtil.isNullOrEmpty(wxId)) {
                userInfoVO.setWxId("");
            } else {
                userInfoVO.setWxId("微信号:" + wxId);
            }
        }
        return userList;
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudManageServiceImpl.java
@@ -5,6 +5,7 @@
import javax.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.yeshi.fanli.dao.mybatis.user.cloud.UserCloudManageMapper;
@@ -23,6 +24,8 @@
    @Resource
    private UserCloudGoodsService userCloudGoodsService;
    
    @Async
    @Override
    public void save(Long uid, Boolean official, Boolean custom) {
        if (uid == null) 
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudOrderServiceImpl.java
@@ -73,6 +73,7 @@
        UserCloudOrder updateOrder = new UserCloudOrder();
        updateOrder.setState(true);
        updateOrder.setId(cloudOrder.getId());
        updateOrder.setDesc("成功开通 1个月");
        updateOrder.setUpdateTime(new Date());
        userCloudOrderMapper.updateByPrimaryKeySelective(updateOrder);
        
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudSendRecordServiceImpl.java
@@ -52,4 +52,10 @@
    public long count (String key, Integer sendOrigin){
        return userCloudSendRecordDao.count(key, sendOrigin);
    }
    @Override
    public long countRecordNum(Long uid, Integer sendOrigin){
        return userCloudSendRecordDao.countRecordNum(uid, sendOrigin);
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudServiceImpl.java
@@ -15,6 +15,7 @@
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.yeshi.fanli.dao.mybatis.user.cloud.UserCloudMapper;
import com.yeshi.fanli.dto.aitaoker.RobotInfoDTO;
import com.yeshi.fanli.dto.aitaoker.WeiXinGroupDTO;
import com.yeshi.fanli.dto.jd.JDCouponInfo;
import com.yeshi.fanli.dto.jd.JDPingouInfo;
@@ -230,62 +231,61 @@
            if (userCloud.getEndTime().getTime() > java.lang.System.currentTimeMillis())
                renew = true;
            // 验证套餐是否相同
            if (renew && userCloud.getRobotType() != menuEnum.getType()) {
            if (renew && userCloud.getRobotType() != menuEnum.getRobotType()) {
                LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]已有其他云发单套餐还未结束");
                throw new UserCloudException(1, "已有其他云发单套餐还未结束");
            }
        }
//        RobotInfoDTO dto = null;
//        if (renew) { // 续费
//            dto = AitaokerApiUtil.robotRenewals(userCloud.getRobotId(), menuEnum.getMonth());
//        } else { // 创建机器人
//            dto = AitaokerApiUtil.robotCreate(menuEnum.getMonth(), menuEnum.getType(), "wechatrobot", null);
//        }
//
//        if (dto == null) {
//            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回空值");
//            throw new UserCloudException(1, "机器人获取失败");
//        }
//
//        String endTimeStr = dto.getEndTime();
//        if (StringUtil.isNullOrEmpty(endTimeStr)) {
//            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回时间为空");
//            throw new UserCloudException(1, "机器人返回时间为空");
//        }
//
//        long endTime = 0;
//        try {
//            endTime = Long.parseLong(endTimeStr);
//        } catch (Exception e) {
//            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回时间格式不正确");
//            throw new UserCloudException(1, "机器人返回时间格式不正确");
//        }
//
//        Integer robotId = dto.getId();
//        if (robotId == null) {
//            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 机器人ID返回为空");
//            throw new UserCloudException(1, "机器人ID返回为空");
//        }
//
//        Integer groupNum = dto.getGroupNum();
//        if (groupNum == null) {
//            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: groupNum返回为空");
//            throw new UserCloudException(1, "groupNum返回为空");
//        }
        RobotInfoDTO dto = null;
        if (renew) { // 续费
            dto = AitaokerApiUtil.robotRenewals(userCloud.getRobotId(), menuEnum.getMonth());
        } else { // 创建机器人
            dto = AitaokerApiUtil.robotCreate(menuEnum.getMonth(), menuEnum.getRobotType(), "wechatrobot", null);
        }
        if (dto == null) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 机器人创建失败");
            throw new UserCloudException(1, "机器人创建失败");
        }
        Integer robotId = dto.getId();
        if (robotId == null) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 机器人ID返回为空");
        }
        String endTimeStr = dto.getEndTime();
        if (StringUtil.isNullOrEmpty(endTimeStr)) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回时间为空");
        }
        long endTime = 0;
        try {
            endTime = Long.parseLong(endTimeStr);
        } catch (Exception e) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回时间格式不正确");
        }
        Integer groupNum = dto.getGroupNum();
        if (groupNum == null) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: groupNum返回为空");
        }
        UserCloud newCloud = new UserCloud();
        newCloud.setUid(uid);
        newCloud.setOrderId(orderId);
//        newCloud.setGroupNum(groupNum);
//        newCloud.setRobotId(robotId);
        newCloud.setRobotType(menuEnum.getType());
//        if (renew) {
//            newCloud.setStartTime(userCloud.getStartTime());
//        } else {
//            newCloud.setStartTime(new Date());
//        }
//        newCloud.setEndTime(new Date(endTime * 1000)); // Unix 转换 普通时间
        newCloud.setGroupNum(groupNum);
        newCloud.setRobotId(robotId);
        newCloud.setRobotType(menuEnum.getRobotType());
        if (renew) {
            newCloud.setWxId(userCloud.getWxId());
            newCloud.setWxName(userCloud.getWxName());
            newCloud.setWxPortrait(userCloud.getPortrait());
            newCloud.setStartTime(userCloud.getStartTime());
        } else {
            newCloud.setStartTime(new Date());
        }
        newCloud.setEndTime(new Date(endTime * 1000)); // Unix 转换 普通时间
        newCloud.setCreateTime(new Date());
        userCloudMapper.insertSelective(newCloud);
        
fanli/src/main/java/com/yeshi/fanli/service/impl/user/invite/ThreeSaleDetailSerivceImpl.java
@@ -57,6 +57,13 @@
    public long countByBossUidAndMinLevel(Long bossUid, int minLevel) {
        return threeSaleDetailDao.countByBossUidAndMinLevel(bossUid, minLevel);
    }
    @Override
    public long countByBossUidAndMaxLevel(Long bossUid, int minLevel) {
        return threeSaleDetailDao.countByBossUidAndMaxLevel(bossUid, minLevel);
    }
    @Override
    public void addByWorkerUid(Long workerUid) {
fanli/src/main/java/com/yeshi/fanli/service/inter/count/HongBaoV2CountService.java
@@ -239,13 +239,26 @@
     */
    public BigDecimal sumMoneyByANotSettleAndUid(Long uid);
    /**
     * 统计未到账的数量
     * 统计已到账订单数量
     * @param uid
     * @param payment
     * @param type
     * @param payment -付款金额
     * @param type -类型: 1自购 2分享 3邀请  4自购+分享
     * @param dateType 1本月
     * @return
     */
    public long countMyDirectOrderByCashNotArrival(Long uid, BigDecimal payment, Integer type);
    public long countOrderByCashArrival(Long uid, BigDecimal payment, Integer type, Integer dateType);
    /**
     * 统计未到账订单数量
     * @param uid
     * @param payment -付款金额
     * @param type -类型: 1自购 2分享 3邀请  4自购+分享
     * @param dateType 1本月
     * @return
     */
    public long countOrderByCashNotArrival(Long uid, BigDecimal payment, Integer type, Integer dateType);
}
fanli/src/main/java/com/yeshi/fanli/service/inter/user/cloud/UserCloudSendRecordService.java
@@ -41,5 +41,13 @@
    public List<UserCloudSendRecord> query(int page, int count, String key, Integer sendOrigin);
    public long count(String key, Integer sendOrigin);
    /**
     * 统计记录
     * @param uid
     * @param sendOrigin
     * @return
     */
    public long countRecordNum(Long uid, Integer sendOrigin);
    
}
fanli/src/main/java/com/yeshi/fanli/service/inter/user/invite/ThreeSaleDetailService.java
@@ -83,4 +83,13 @@
     */
    ThreeSaleDetail getByBossUidAndWorkerUid(Long bossUid, Long workerUid);
    /**
     * 统计粉丝代数内
     * @param bossUid
     * @param minLevel
     * @return
     */
    public long countByBossUidAndMaxLevel(Long bossUid, int minLevel);
}
fanli/src/main/java/com/yeshi/fanli/service/manger/alipay/UserCloudAlipayManager.java
@@ -1,24 +1,25 @@
package com.yeshi.fanli.service.manger.alipay;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.yeshi.fanli.dto.AlipayTradeWapPayDTO;
import com.yeshi.fanli.entity.bus.user.cloud.CloudOrderMenuEnum;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloud;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.user.cloud.UserCloudException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGroupService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudManageService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudOrderService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.alipay.AlipayApi;
import com.yeshi.fanli.util.alipay.AlipayWapConfig;
/**
 *  云发单支付管理
@@ -61,31 +62,36 @@
        if (menuEnum == null) 
            throw new UserCloudException(1, "套餐类型不匹配");
        
        UserCloud userCloud = userCloudService.getLastByUid(uid);
        if (userCloud != null) {
            // 续费
            boolean renew = false;
            if (userCloud.getEndTime().getTime() > java.lang.System.currentTimeMillis())
                renew = true;
            // 验证套餐是否相同
            if (renew && userCloud.getRobotType() != menuEnum.getRobotType()) {
                LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "]已有其他云发单套餐还未结束");
                throw new UserCloudException(1, "已有其他云发单套餐还未结束");
            }
        }
        // 订单信息
        UserCloudOrder cloudOrder = userCloudOrderService.addCloudOrder(uid, type); 
        if (cloudOrder == null || cloudOrder.getId() == null)
            throw new UserCloudException(1, "创建订单信息失败");
        
        // 待请求参数数组
        Map<String, String> map = new HashMap<String, String>();
        map.put("seller_id", AlipayWapConfig.SELLER_ID);// 收款方账号
        // 订单号
        map.put("out_trade_no", TRADE_INDEX + cloudOrder.getId());
        // 订单金额:0.01元,精准到分
        map.put("total_amount", menuEnum.getMoney() + "");
        // 订单标题
        map.put("subject", "云发单充值");
        // 销售产品码,商家和支付宝签约的产品码
        map.put("product_code", type);
        // 该笔订单允许的最晚付款时间,逾期将关闭交易  30分钟
        map.put("timeout_express", "30m");
        AlipayTradeWapPayDTO payDTO = new AlipayTradeWapPayDTO();
        payDTO.setSubject("云发单充值");
        payDTO.setSellerId(Constant.alipayWapConfig.getSellerId());
        payDTO.setOutTradeNo(TRADE_INDEX + cloudOrder.getId());
        payDTO.setProductCode(type);
        payDTO.setTotalAmount(menuEnum.getMoney() + "");
        payDTO.setTimeoutExpress("30m");
        payDTO.setReturnUrl(configService.get(ConfigKeyEnum.cloudAlipayReturnLink.getKey()));
        payDTO.setNotifyUrl(configService.get(ConfigKeyEnum.cloudAlipayNotifyLink.getKey()) +"?id=" +cloudOrder.getId());
        
        // 支付成功后返回哪个前端页面
        String returnUrl = configService.get(ConfigKeyEnum.cloudAlipayReturnLink.getKey());
        // 支付成功后回调地址
        String notifyUrl = configService.get(ConfigKeyEnum.cloudAlipayNotifyLink.getKey()) +"?id=" +cloudOrder.getId();
        // 获取支付form
        return AlipayApi.tradeWapPayRequest(map, returnUrl, notifyUrl);
        return AlipayApi.tradeWapPayRequest(payDTO);
    }
    
@@ -95,7 +101,17 @@
     * @throws Exception
     */
    public void tradeQueryByOrderId(Long orderId) throws Exception {
        boolean result = AlipayApi.tradeQuery(TRADE_INDEX + orderId, null, null, null);
        boolean result = false;
        AlipayTradeQueryResponse response =  AlipayApi.tradeQuery(TRADE_INDEX + orderId, null, null, null);
        if(response != null && response.isSuccess()){
            // 相应成功
            if ("TRADE_SUCCESS".equals(response.getTradeStatus())) {
                result = true;
            } else if ("TRADE_FINISHED".equals(response.getTradeStatus())) {
                result = true; // (交易结束,不可退款)
            }
        }
        // 支付成功
        if (result) {
            userCloudOrderService.cloudPayCloudSuccess(orderId);
fanli/src/main/java/com/yeshi/fanli/util/Constant.java
@@ -10,6 +10,7 @@
import com.yeshi.fanli.dto.wx.WXAccountInfoDTO;
import com.yeshi.fanli.entity.config.AlipayConfig;
import com.yeshi.fanli.entity.config.AlipayWapConfig;
import com.yeshi.fanli.entity.config.ConstantConfig;
import com.yeshi.fanli.entity.config.SMSConfig;
import com.yeshi.fanli.entity.config.SystemCommonConfig;
@@ -201,6 +202,8 @@
    public static SystemCommonConfig systemCommonConfig;
    public static AlipayConfig alipayConfig;
    public static AlipayWapConfig alipayWapConfig;
    public static ZNXConfig znxConfig;
@@ -302,6 +305,13 @@
                    .getProperties(TaoBaoUtil.class.getClassLoader().getResourceAsStream("alipay.properties"));
            alipayConfig = (AlipayConfig) MapUtil.parseMap(AlipayConfig.class, ps);
        }
        if (alipayWapConfig == null) {
            Properties ps = org.yeshi.utils.PropertiesUtil
                    .getProperties(TaoBaoUtil.class.getClassLoader().getResourceAsStream("alipay_wap.properties"));
            alipayWapConfig = (AlipayWapConfig) MapUtil.parseMap(AlipayWapConfig.class, ps);
        }
        if (znxConfig == null) {
            Properties ps = org.yeshi.utils.PropertiesUtil
fanli/src/main/java/com/yeshi/fanli/util/aitaoker/AitaokerApiUtil.java
@@ -194,7 +194,34 @@
        
        // 请求结果
        String result = baseRequest("itaoke.robot.create.get", map);
//        String result = "{\r\n" +
//                "    \"status\":\"0000\",\r\n" +
//                "    \"msg\":\"亲,添加成功\",\r\n" +
//                "    \"data\":{\r\n" +
//                "        \"id\":11770,\r\n" +
//                "        \"uid\":1625,\r\n" +
//                "        \"wechatrobot\":\"wechatrobot\",\r\n" +
//                "        \"wx_id\":\"\",\r\n" +
//                "        \"amount_used\":0,\r\n" +
//                "        \"group_num\":20,\r\n" +
//                "        \"passwd\":\"\",\r\n" +
//                "        \"nickname\":\"\",\r\n" +
//                "        \"c_uid\":1625,\r\n" +
//                "        \"login_status\":0,\r\n" +
//                "        \"end_time\":1594785534,\r\n" +
//                "        \"remark\":null,\r\n" +
//                "        \"wc_id\":\"\",\r\n" +
//                "        \"agent_uid\":null,\r\n" +
//                "        \"is_enabled\":0,\r\n" +
//                "        \"robot_type\":4,\r\n" +
//                "        \"ip\":\"http://49.234.36.129:10002/\",\r\n" +
//                "        \"is_new\":1\r\n" +
//                "    }\r\n" +
//                "}\r\n" +
//                "";
        JSONObject resultJson = JSONObject.fromObject(result);
        if ("0000".equals(resultJson.optString("status"))) {
            resultJson = resultJson.optJSONObject("data");
            Type type = new TypeToken<RobotInfoDTO>() {}.getType();
@@ -218,6 +245,32 @@
        map.put("month", month +"");
        // 请求结果
        String result = baseRequest("itaoke.robot.change.get", map);
//        String result = "{\r\n" +
//                "    \"status\":\"0000\",\r\n" +
//                "    \"msg\":\"\\u4eb2,\\u6dfb\\u52a0\\u6210\\u529f\",\r\n" +
//                "    \"data\":{\r\n" +
//                "        \"id\":11770,\r\n" +
//                "        \"uid\":1625,\r\n" +
//                "        \"wechatrobot\":\"fxdaka\",\r\n" +
//                "        \"wx_id\":\"wxid_vm6eb5i0in0622\",\r\n" +
//                "        \"amount_used\":0,\r\n" +
//                "        \"group_num\":20,\r\n" +
//                "        \"passwd\":\"\",\r\n" +
//                "        \"nickname\":\"\\u5206\\u4eab\\u5927\\u5496??\",\r\n" +
//                "        \"c_uid\":1625,\r\n" +
//                "        \"login_status\":1,\r\n" +
//                "        \"end_time\":1597377534,\r\n" +
//                "        \"remark\":null,\r\n" +
//                "        \"wc_id\":\"246124e9-9a8c-4da6-a77e-7f7f88049731\",\r\n" +
//                "        \"agent_uid\":null,\r\n" +
//                "        \"is_enabled\":0,\r\n" +
//                "        \"robot_type\":4,\r\n" +
//                "        \"ip\":\"http:\\/\\/49.234.36.129:10002\\/\",\r\n" +
//                "        \"is_new\":1\r\n" +
//                "    }\r\n" +
//                "}";
        JSONObject resultJson = JSONObject.fromObject(result);
        if ("0000".equals(resultJson.optString("status"))) {
            resultJson = resultJson.optJSONObject("data");
fanli/src/main/java/com/yeshi/fanli/util/alipay/AlipayApi.java
@@ -1,38 +1,82 @@
package com.yeshi.fanli.util.alipay;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayApiException;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.yeshi.fanli.dto.AlipayTradeWapPayDTO;
import com.yeshi.fanli.entity.config.AlipayWapConfig;
import com.yeshi.fanli.util.AlipayUtil;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import net.sf.json.JSONObject;
public class AlipayApi {
    private static DefaultAlipayClient alipayClient = null;
    static {
        AlipayWapConfig alipayWapConfig = Constant.alipayWapConfig;
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
        certAlipayRequest.setAppId(alipayWapConfig.getAppId());
        certAlipayRequest.setPrivateKey(alipayWapConfig.getPrivateKey());
        certAlipayRequest.setFormat("json");
        certAlipayRequest.setCharset("UTF-8");
        certAlipayRequest.setSignType("RSA2");
        certAlipayRequest.setCertPath(
                AlipayUtil.class.getClassLoader().getResource(alipayWapConfig.getAppCertPath()).getPath());
        certAlipayRequest.setAlipayPublicCertPath(
                AlipayUtil.class.getClassLoader().getResource(alipayWapConfig.getAlipayCertPath()).getPath());
        certAlipayRequest.setRootCertPath(
                AlipayUtil.class.getClassLoader().getResource(alipayWapConfig.getAlipayRootCertPath()).getPath());
        try {
            alipayClient = new DefaultAlipayClient(certAlipayRequest);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
    }
    /**
     * 创建支付请求
     * @param map
     * @return
     * @throws Exception
     */
    public static String tradeWapPayRequest(Map<String, String> map, String payNotify, String backUrl) throws Exception{
    public static String tradeWapPayRequest(AlipayTradeWapPayDTO payDTO) throws Exception{
        // 待请求参数数组
        JSONObject json = new JSONObject();
        // 收款方账号
        json.put("seller_id", payDTO.getSellerId());
        // 订单号
        json.put("out_trade_no", payDTO.getOutTradeNo());
        // 订单金额:0.01元,精准到分
        json.put("total_amount",payDTO.getTotalAmount());
        // 订单标题
        json.put("subject", payDTO.getSubject());
        // 销售产品码,商家和支付宝签约的产品码
        json.put("product_code", payDTO.getProductCode());
        // 该笔订单允许的最晚付款时间,逾期将关闭交易  30分钟
        json.put("timeout_express", payDTO.getTimeoutExpress());
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
        // 前台回调地址
        alipayRequest.setReturnUrl(backUrl);
        alipayRequest.setReturnUrl(payDTO.getReturnUrl());
        // 成功付款回调
        alipayRequest.setNotifyUrl(payNotify);
        alipayRequest.setNotifyUrl(payDTO.getNotifyUrl());
        
        alipayRequest.setBizContent(URLEncoder.encode(JSON.toJSONString(map), "UTF-8"));
        alipayRequest.setBizContent(URLEncoder.encode(json.toString(), "UTF-8"));
        
        return AlipayWapConfig.getInstance().pageExecute(alipayRequest).getBody();
        return alipayClient.pageExecute(alipayRequest).getBody();
    }
    
    /**
     * 查询是否交易完成
@@ -43,44 +87,27 @@
     * @return
     * @throws Exception
     */
    public static boolean tradeQuery (String outTradeNo, String tradeNo, String orgPid, String queryOptions) throws Exception {
    public static AlipayTradeQueryResponse tradeQuery(String outTradeNo, String tradeNo, String orgPid, String queryOptions) throws Exception {
        // 订单支付时传入的商户订单号,和支付宝交易号不能同时为空
        if (StringUtil.isNullOrEmpty(outTradeNo) || StringUtil.isNullOrEmpty(outTradeNo)) {
            return false;
            return null;
        }
        
        // 待请求参数数组
        Map<String, String> map = new HashMap<String, String>();
        JSONObject json = new JSONObject();
        if (!StringUtil.isNullOrEmpty(outTradeNo))
            map.put("out_trade_no", outTradeNo);
            json.put("out_trade_no", outTradeNo);
        if (!StringUtil.isNullOrEmpty(tradeNo))
            map.put("trade_no", tradeNo);
            json.put("trade_no", tradeNo);
        if (!StringUtil.isNullOrEmpty(orgPid))
            map.put("org_pid", orgPid);
            json.put("org_pid", orgPid);
        if (!StringUtil.isNullOrEmpty(queryOptions))
            map.put("query_options", queryOptions);
            json.put("query_options", queryOptions);
        
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        request.setBizContent(URLEncoder.encode(JSON.toJSONString(map), "UTF-8"));
        // 支付宝查询
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayWapConfig.GATEWAY, AlipayWapConfig.APP_ID,
                AlipayWapConfig.APP_PRIVATE_KEY, AlipayWapConfig.PARAM_TYPE, AlipayWapConfig.CHARSET,
                AlipayWapConfig.ALIPAY_PUBLIC_KEY, AlipayWapConfig.SIGNTYPE);
        request.setBizContent(json.toString());
        
        AlipayTradeQueryResponse response = alipayClient.execute(request);
        if(response.isSuccess()){
            // 相应成功
            if ("TRADE_SUCCESS".equals(response.getTradeStatus())) {
                return true; // 交易支付成功
            } else if ("TRADE_FINISHED".equals(response.getTradeStatus())) {
                return true; // (交易结束,不可退款)
            }
        }
        return false;
        return alipayClient.certificateExecute(request);
    }
    
}
fanli/src/main/java/com/yeshi/fanli/util/alipay/AlipayWapConfig.java
File was deleted
fanli/src/main/java/com/yeshi/fanli/vo/user/cloud/UserCloudInfoVO.java
@@ -2,7 +2,9 @@
import java.util.List;
import com.yeshi.fanli.entity.bus.homemodule.SwiperPicture;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGroup;
import com.yeshi.fanli.entity.common.JumpDetailV2;
public class UserCloudInfoVO {
@@ -25,6 +27,9 @@
    private List<UserCloudGroup> listGroup;// 群信息
    
    private List<CloudOrderMenuVO> listMenu;// 菜单信息
    private SwiperPicture course; // 教程
    
    public String getNickName() {
@@ -107,4 +112,13 @@
        this.listMenu = listMenu;
    }
    public SwiperPicture getCourse() {
        return course;
    }
    public void setCourse(SwiperPicture course) {
        this.course = course;
    }
}
fanli/src/main/resource/alipay/web/alipayCertPublicKey_RSA2.crt
New file
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDrDCCApSgAwIBAgIQICAGCcf9EalgJMEEuqGAWDANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE
BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0
aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs
YXNzIDIgUjEwHhcNMjAwNjA5MDMwMDU0WhcNMjIwNjA5MDMwMDU0WjCBjDELMAkGA1UEBhMCQ04x
JzAlBgNVBAoMHumHjeW6huW/q+ecgeenkeaKgOaciemZkOWFrOWPuDEPMA0GA1UECwwGQWxpcGF5
MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZkOWFrOWPuC0yMDg4
MjMxMzUzNjU2NzQxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHWEgMOlGb/VbN5p
cSXv+DLX2EJ43p93zP9eyao8ghj1LcBSf5Sx4gYpuySKZ0oimILb+ErOAlDzcXwvMxcVTK0W2M6U
aUW0Vh71vOorqggOGqMJsSDpV1hvYrUSCYu1Qe5KtV85w+Kw4dImC3fayIaxUMhwySuniQ/uQtez
RHn/vwXrGigu3Y2tRgPMUptqA14EYEfhpm3KjLXsqWdJBO6ziiqILHJtow65QzkeoLM2ZHpYH6oY
y2rIj/iSIpos18MKWvr4XrqSptJYIQp+G3dwqjlt2kk4bpgAXQSR6wKAtGTkAYvlOSpkQXVqI3tI
GZO3ZM9bFQurMBoJFX790wIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJKoZIhvcNAQELBQAD
ggEBAEo++sORTzbqKf7CyLEcmg+RnX0Ez2aUOftQPkr2XGnDwNon4Air1c+j3snsRhWyTC2TMt18
qCPotlr63Zk67agPaGfrKGk7bDxc9QA/kRrctl4+0h4Jh28jgMLQ4ibNgjkGWmMMwSK4D+19k/vt
hjlGk9LtTc5lsqgm2GTvifC9C4E0ZDiK+rGz/Mo048TiKNhywO8EKWXvbT9n359rbgKoXMJmKWZQ
bWdMg8NsP/X+p6mgRAtIJNSLyl/ZzzD2J/NpnHlQxq8/OFnS2EFcs0gN71xDtX+KWp+BJHBMwPM4
asjhldpscYgoyx2c/D5CinNgMj7qfmORBQ37shpcKDw=
-----END CERTIFICATE-----
fanli/src/main/resource/alipay/web/alipayRootCert.crt
New file
@@ -0,0 +1,88 @@
-----BEGIN CERTIFICATE-----
MIIBszCCAVegAwIBAgIIaeL+wBcKxnswDAYIKoEcz1UBg3UFADAuMQswCQYDVQQG
EwJDTjEOMAwGA1UECgwFTlJDQUMxDzANBgNVBAMMBlJPT1RDQTAeFw0xMjA3MTQw
MzExNTlaFw00MjA3MDcwMzExNTlaMC4xCzAJBgNVBAYTAkNOMQ4wDAYDVQQKDAVO
UkNBQzEPMA0GA1UEAwwGUk9PVENBMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE
MPCca6pmgcchsTf2UnBeL9rtp4nw+itk1Kzrmbnqo05lUwkwlWK+4OIrtFdAqnRT
V7Q9v1htkv42TsIutzd126NdMFswHwYDVR0jBBgwFoAUTDKxl9kzG8SmBcHG5Yti
W/CXdlgwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFEwysZfZ
MxvEpgXBxuWLYlvwl3ZYMAwGCCqBHM9VAYN1BQADSAAwRQIgG1bSLeOXp3oB8H7b
53W+CKOPl2PknmWEq/lMhtn25HkCIQDaHDgWxWFtnCrBjH16/W3Ezn7/U/Vjo5xI
pDoiVhsLwg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIF0zCCA7ugAwIBAgIIH8+hjWpIDREwDQYJKoZIhvcNAQELBQAwejELMAkGA1UE
BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmlj
YXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMyMTEzNDg0MFoXDTM4MDIyODEzNDg0
MFowejELMAkGA1UEBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNV
BAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5j
aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMIICIjANBgkqhkiG9w0BAQEF
AAOCAg8AMIICCgKCAgEAtytTRcBNuur5h8xuxnlKJetT65cHGemGi8oD+beHFPTk
rUTlFt9Xn7fAVGo6QSsPb9uGLpUFGEdGmbsQ2q9cV4P89qkH04VzIPwT7AywJdt2
xAvMs+MgHFJzOYfL1QkdOOVO7NwKxH8IvlQgFabWomWk2Ei9WfUyxFjVO1LVh0Bp
dRBeWLMkdudx0tl3+21t1apnReFNQ5nfX29xeSxIhesaMHDZFViO/DXDNW2BcTs6
vSWKyJ4YIIIzStumD8K1xMsoaZBMDxg4itjWFaKRgNuPiIn4kjDY3kC66Sl/6yTl
YUz8AybbEsICZzssdZh7jcNb1VRfk79lgAprm/Ktl+mgrU1gaMGP1OE25JCbqli1
Pbw/BpPynyP9+XulE+2mxFwTYhKAwpDIDKuYsFUXuo8t261pCovI1CXFzAQM2w7H
DtA2nOXSW6q0jGDJ5+WauH+K8ZSvA6x4sFo4u0KNCx0ROTBpLif6GTngqo3sj+98
SZiMNLFMQoQkjkdN5Q5g9N6CFZPVZ6QpO0JcIc7S1le/g9z5iBKnifrKxy0TQjtG
PsDwc8ubPnRm/F82RReCoyNyx63indpgFfhN7+KxUIQ9cOwwTvemmor0A+ZQamRe
9LMuiEfEaWUDK+6O0Gl8lO571uI5onYdN1VIgOmwFbe+D8TcuzVjIZ/zvHrAGUcC
AwEAAaNdMFswCwYDVR0PBAQDAgEGMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFF90
tATATwda6uWx2yKjh0GynOEBMB8GA1UdIwQYMBaAFF90tATATwda6uWx2yKjh0Gy
nOEBMA0GCSqGSIb3DQEBCwUAA4ICAQCVYaOtqOLIpsrEikE5lb+UARNSFJg6tpkf
tJ2U8QF/DejemEHx5IClQu6ajxjtu0Aie4/3UnIXop8nH/Q57l+Wyt9T7N2WPiNq
JSlYKYbJpPF8LXbuKYG3BTFTdOVFIeRe2NUyYh/xs6bXGr4WKTXb3qBmzR02FSy3
IODQw5Q6zpXj8prYqFHYsOvGCEc1CwJaSaYwRhTkFedJUxiyhyB5GQwoFfExCVHW
05ZFCAVYFldCJvUzfzrWubN6wX0DD2dwultgmldOn/W/n8at52mpPNvIdbZb2F41
T0YZeoWnCJrYXjq/32oc1cmifIHqySnyMnavi75DxPCdZsCOpSAT4j4lAQRGsfgI
kkLPGQieMfNNkMCKh7qjwdXAVtdqhf0RVtFILH3OyEodlk1HYXqX5iE5wlaKzDop
PKwf2Q3BErq1xChYGGVS+dEvyXc/2nIBlt7uLWKp4XFjqekKbaGaLJdjYP5b2s7N
1dM0MXQ/f8XoXKBkJNzEiM3hfsU6DOREgMc1DIsFKxfuMwX3EkVQM1If8ghb6x5Y
jXayv+NLbidOSzk4vl5QwngO/JYFMkoc6i9LNwEaEtR9PhnrdubxmrtM+RjfBm02
77q3dSWFESFQ4QxYWew4pHE0DpWbWy/iMIKQ6UZ5RLvB8GEcgt8ON7BBJeMc+Dyi
kT9qhqn+lw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICiDCCAgygAwIBAgIIQX76UsB/30owDAYIKoZIzj0EAwMFADB6MQswCQYDVQQG
EwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UECwwXQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNpYWwgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkgRTEwHhcNMTkwNDI4MTYyMDQ0WhcNNDkwNDIwMTYyMDQ0
WjB6MQswCQYDVQQGEwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UE
CwwXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNp
YWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRTEwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAASCCRa94QI0vR5Up9Yr9HEupz6hSoyjySYqo7v837KnmjveUIUNiuC9pWAU
WP3jwLX3HkzeiNdeg22a0IZPoSUCpasufiLAnfXh6NInLiWBrjLJXDSGaY7vaokt
rpZvAdmjXTBbMAsGA1UdDwQEAwIBBjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRZ
4ZTgDpksHL2qcpkFkxD2zVd16TAfBgNVHSMEGDAWgBRZ4ZTgDpksHL2qcpkFkxD2
zVd16TAMBggqhkjOPQQDAwUAA2gAMGUCMQD4IoqT2hTUn0jt7oXLdMJ8q4vLp6sg
wHfPiOr9gxreb+e6Oidwd2LDnC4OUqCWiF8CMAzwKs4SnDJYcMLf2vpkbuVE4dTH
Rglz+HGcTLWsFs4KxLsq7MuU+vJTBUeDJeDjdA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIUEMdk6dVgOEIS2cCP0Q43P90Ps5YwDQYJKoZIhvcNAQEF
BQAwajELMAkGA1UEBhMCQ04xEzARBgNVBAoMCmlUcnVzQ2hpbmExHDAaBgNVBAsM
E0NoaW5hIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMMH2lUcnVzQ2hpbmEgQ2xhc3Mg
MiBSb290IENBIC0gRzMwHhcNMTMwNDE4MDkzNjU2WhcNMzMwNDE4MDkzNjU2WjBq
MQswCQYDVQQGEwJDTjETMBEGA1UECgwKaVRydXNDaGluYTEcMBoGA1UECwwTQ2hp
bmEgVHJ1c3QgTmV0d29yazEoMCYGA1UEAwwfaVRydXNDaGluYSBDbGFzcyAyIFJv
b3QgQ0EgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOPPShpV
nJbMqqCw6Bz1kehnoPst9pkr0V9idOwU2oyS47/HjJXk9Rd5a9xfwkPO88trUpz5
4GmmwspDXjVFu9L0eFaRuH3KMha1Ak01citbF7cQLJlS7XI+tpkTGHEY5pt3EsQg
wykfZl/A1jrnSkspMS997r2Gim54cwz+mTMgDRhZsKK/lbOeBPpWtcFizjXYCqhw
WktvQfZBYi6o4sHCshnOswi4yV1p+LuFcQ2ciYdWvULh1eZhLxHbGXyznYHi0dGN
z+I9H8aXxqAQfHVhbdHNzi77hCxFjOy+hHrGsyzjrd2swVQ2iUWP8BfEQqGLqM1g
KgWKYfcTGdbPB1MCAwEAAaNjMGEwHQYDVR0OBBYEFG/oAMxTVe7y0+408CTAK8hA
uTyRMB8GA1UdIwQYMBaAFG/oAMxTVe7y0+408CTAK8hAuTyRMA8GA1UdEwEB/wQF
MAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBLnUTfW7hp
emMbuUGCk7RBswzOT83bDM6824EkUnf+X0iKS95SUNGeeSWK2o/3ALJo5hi7GZr3
U8eLaWAcYizfO99UXMRBPw5PRR+gXGEronGUugLpxsjuynoLQu8GQAeysSXKbN1I
UugDo9u8igJORYA+5ms0s5sCUySqbQ2R5z/GoceyI9LdxIVa1RjVX8pYOj8JFwtn
DJN3ftSFvNMYwRuILKuqUYSHc2GPYiHVflDh5nDymCMOQFcFG3WsEuB+EYQPFgIU
1DHmdZcz7Llx8UOZXX2JupWCYzK1XhJb+r4hK5ncf/w8qGtYlmyJpxk3hr1TfUJX
Yf4Zr0fJsGuv
-----END CERTIFICATE-----
fanli/src/main/resource/alipay/web/appCertPublicKey_2021001164655513.crt
New file
@@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIIEqzCCA5OgAwIBAgIQICAGFcNUAjZwqoMnIos18TANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE
BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0
aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs
YXNzIDEgUjEwHhcNMjAwNjE1MDI1NzI1WhcNMjIwNjE1MDI1NzI1WjBzMQswCQYDVQQGEwJDTjEn
MCUGA1UECgwe6YeN5bqG5b+r55yB56eR5oqA5pyJ6ZmQ5YWs5Y+4MQ8wDQYDVQQLDAZBbGlwYXkx
KjAoBgNVBAMMITIwODgyMzEzNTM2NTY3NDEtMjAyMTAwMTE2NDY1NTUxMzCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAITMK2VIomFsH6n52BtBEhMV1Bq1u8HMMRWb1hu/6tq6V0j/RCWm
RSzv7fbm9bTUZvR3RFcD2URu6lfwShfQ44LI4QXQegiQ5Qlv/5SeDER7lzBYXMQCEDPYuLzVjXgB
Z8Huirmaq55IksHxWvYUN61ch7Ve3wLEB6+EW2vRycB+UNnkTJe41WAUovp2khw3SOBM+Ct+gVAA
b38O7rC92qRU5/he+18E56MD/c8fQRPVxfhbIfeEL9416cak51MCHNCX4W1P54/t+ToIwKzrvViQ
JHtg9XcrTYlHCayE7LE3VY7LKTsRciNYGsngn/Uc/EkSanuh8FVIttntkgfZ3/0CAwEAAaOCASkw
ggElMB8GA1UdIwQYMBaAFHEH4gRhFuTl8mXrMQ/J4PQ8mtWRMB0GA1UdDgQWBBTAC55Sk3N4W9D9
YVAA6Az4TevnFzBABgNVHSAEOTA3MDUGB2CBHAFuAQEwKjAoBggrBgEFBQcCARYcaHR0cDovL2Nh
LmFsaXBheS5jb20vY3BzLnBkZjAOBgNVHQ8BAf8EBAMCBsAwLwYDVR0fBCgwJjAkoCKgIIYeaHR0
cDovL2NhLmFsaXBheS5jb20vY3JsNDIuY3JsMGAGCCsGAQUFBwEBBFQwUjAoBggrBgEFBQcwAoYc
aHR0cDovL2NhLmFsaXBheS5jb20vY2E2LmNlcjAmBggrBgEFBQcwAYYaaHR0cDovL2NhLmFsaXBh
eS5jb206ODM0MC8wDQYJKoZIhvcNAQELBQADggEBAIiFS1WOH+mvCxERAzpyJNBgKerc0+CK0Z9j
WCRQHWB2c4Cn5dfXrRJLNM7D1FU4PlCafKUvH7x/pHOPFZmbuN9Jc0PfeiTR6n4r0oelu5iAW2mX
2p/aNY3bRZc3Q671DF0dwu0rixcWjcOoVV03EWYtQAvJ2cKwBnHQTqc5sU2Stjb49PAhItoSH+eL
J1eSIDDJ+4EzmnmKpFLPw+ghCI95A4eb/4Atpc7qM0upVuWrrHkLrLLENCegC72DAwI0a/2Lcs5p
xZBzG1WRIbynkjpJksQDCsN1/GmG55r0gKTe9z0KjLvQjSsk/7yrkjpjmq/AUW8cbVgni0YWg0Ok
1LM=
-----END CERTIFICATE-----
fanli/src/main/resource/alipay_wap.properties
New file
@@ -0,0 +1,7 @@
appId=2021001164655513
sellerId=2088231353656741
private_key=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCEzCtlSKJhbB+p+dgbQRITFdQatbvBzDEVm9Ybv+rauldI/0QlpkUs7+325vW01Gb0d0RXA9lEbupX8EoX0OOCyOEF0HoIkOUJb/+UngxEe5cwWFzEAhAz2Li81Y14AWfB7oq5mqueSJLB8Vr2FDetXIe1Xt8CxAevhFtr0cnAflDZ5EyXuNVgFKL6dpIcN0jgTPgrfoFQAG9/Du6wvdqkVOf4XvtfBOejA/3PH0ET1cX4WyH3hC/eNenGpOdTAhzQl+FtT+eP7fk6CMCs671YkCR7YPV3K02JRwmshOyxN1WOyyk7EXIjWBrJ4J/1HPxJEmp7ofBVSLbZ7ZIH2d/9AgMBAAECggEAEjPGEvj0wPPIF01WsM2ng5QvYYXdeX/ajoKww1b4Awkdo7TRi3OR8cnlTT11Glcu0X1zkZXGdxnY5zrZfRA1zxxns5tSzs/FhRij6KQNPGnQXGEQPhGmVOT01XVUEcnnhe6Dd1NbCLQb4ZeKh0ZYJ1wSgerCGKf0AbvbqBi2VbsHy9HQbuFrUUibunI8K66Td/ayyrIJr8Lckb4yBAR63wQaD23DVqEqS7VAD1nrnUZgpFq6pCo8uwH/owBVPS6EB/WQvh2kVoaFGNJILP0zjKUMnrUiZ+34DBaoIeAPon+Vy6xzWHJ+9+1YkI9HxVNWWqKsS4G1q1zzthWSiYC1xQKBgQDOroX61gjcia+hv/qKaZGYPYpEH+icX3l0OZDekOvSw0lMPzIwhpIQWR5e+Hcb4KSSOqvstcz0NbG4oqj9fwlRotSYAMz+Vf6Hqa5biHibKIcUxZfzs7O/CBsKgWQpjdes3YFyOv9AGT3uj3FJozsD4hKnesRQr0nHAcQri5NNFwKBgQCkfFCMKINsb1jOpHh6jFpOySvlvCpqmilw1o4r4CQjMd4CRgS6/UEHMqfB384pucLjPbAmCqkZ0uap40Pr82JJyHaFXWV1mqJPPgLDUkrvhafYoT6zl0i0xrAF4P+aruUbpa6gbrwBPQUKoaj60rhmhTwmzJmJRnOxNEKTOcDwCwKBgBTPn/AE8zl5p7Sqxwh+3skskSqQ5/Qu7OTWEw9GGmjLfyrtRhl6w2RgBN3dOOkWspuCyuL3315Ltcx4nHmB/Cc7NRrlIb8OW6W/YS4YTMSazRc7WjSQyK2YnFhvdO12OdxPJYSiCiejIwhNa0PV6tBWSDiS9QeGzu/57o3P7RIbAoGANIPsQ5N7wlcah39DZ/z/qD/aYBLfiAGIUZpu8dsyLnpxY1BvmjPZWy71GJUYAYJpkpvTbZHhw3juZDdHLEIck2oJTTMwfYfNYndt8maHvklx+Vwh5LzcXbtB396iPQSx6U3QnzA7njmZLnfGt64nabQILGsOaiGwNld1GgRKcVkCgYAeukNSctBKhIrnG8SR/VoKUiutsVYOy6vDHR9rn+swXzqiz+WRiTggtLibquvwSdyvjh4DkUUastY+ninf9S13yjDISVk/9lMlfadStpzbDPnrJItTy6oC+9go3yR9CI9vH5BHa7VyAhKHK5KzryoqHykNpsljEhSVA1hzY4UaxQ==
public_key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhMwrZUiiYWwfqfnYG0ESExXUGrW7wcwxFZvWG7/q2rpXSP9EJaZFLO/t9ub1tNRm9HdEVwPZRG7qV/BKF9DjgsjhBdB6CJDlCW//lJ4MRHuXMFhcxAIQM9i4vNWNeAFnwe6KuZqrnkiSwfFa9hQ3rVyHtV7fAsQHr4Rba9HJwH5Q2eRMl7jVYBSi+naSHDdI4Ez4K36BUABvfw7usL3apFTn+F77XwTnowP9zx9BE9XF+Fsh94Qv3jXpxqTnUwIc0JfhbU/nj+35OgjArOu9WJAke2D1dytNiUcJrITssTdVjsspOxFyI1gayeCf9Rz8SRJqe6HwVUi22e2SB9nf/QIDAQAB
app_cert_path=alipay/web/appCertPublicKey_2021001164655513.crt
alipay_root_cert_path=alipay/web/alipayRootCert.crt
alipay_cert_path=alipay/web/alipayCertPublicKey_RSA2.crt