Pu Zhibing
2 天以前 41422cb74d137e590fefefa4390cd6eedc02a0fb
对接部分抖音接口
1个文件已添加
9个文件已修改
582 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java 87 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java
@@ -315,6 +315,12 @@
    @TableField("modify_price_permission")
    private Integer modifyPricePermission;
    
    /**
     * 抖音门店id
     */
    @TableField("poi_id")
    private String poiId;
    
    @Override
    protected Serializable pkVal() {
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java
@@ -74,10 +74,14 @@
        merVerifyCodeDto.setUserId(userId);
        String verifyCode = merVerifyCodeDto.getVerifyCode();
        MerVerifyOrderVo merVerifyOrderVo = null;
        if (!verifyCode.contains("http")) {
        if (!verifyCode.contains("https")) {
            merVerifyOrderVo = orderService.verifyOrder(verifyCode, merVerifyCodeDto.getShopId());
        } else {
            //三方订单
            //抖音
            if (verifyCode.contains("douyin")) {
                merVerifyOrderVo = orderService.verifyOrderDouYin(verifyCode, merVerifyCodeDto.getShopId());
            }
        }
        return R.ok(merVerifyOrderVo);
    }
@@ -88,10 +92,14 @@
        Long userId = SecurityUtils.getUserId();
        merVerifyOrderDto.setUserId(userId);
        MerVerifyOrderVo merVerifyOrderVo = null;
        if (!merVerifyOrderDto.getOrderId().contains("http")) {
        if (!merVerifyOrderDto.getOrderId().contains("https")) {
            merVerifyOrderVo = orderService.sureVerifyOrder(merVerifyOrderDto);
        } else {
            //三方订单
            //抖音
            if (merVerifyOrderDto.getOrderId().contains("douyin")) {
                merVerifyOrderVo = orderService.sureVerifyOrderDouYin(merVerifyOrderDto);
            }
        }
        return R.ok(merVerifyOrderVo);
    }
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java
@@ -15,16 +15,19 @@
 */
@Data
public class MerVerifyOrderDto extends MerBaseDto {
    @ApiModelProperty(value = "订单id")
    private String orderId;
    @ApiModelProperty(value = "核销用户电话号码")
    private String phone;
    @ApiModelProperty(value = "实收金额")
    private BigDecimal relReceiveMoney;
    @ApiModelProperty(value = "实付金额")
    private BigDecimal relPayMoney;
    @ApiModelProperty(value = "支付方式1微信2现金3支付宝")
    private Integer payType;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java
@@ -195,21 +195,26 @@
     */
    @TableField("new_member_flag")
    private Integer newMemberFlag;
    /**
     * @description  未绑定标记
     * @author  jqs
     * @date    2023/9/8 10:45
     * @description 未绑定标记
     * @author jqs
     * @date 2023/9/8 10:45
     * @param null
     * @return  null
     * @return null
     */
    @TableField("unbinding_flag")
    private Integer unbindingFlag;
    /**
     * 三方平台订单id
     */
    @TableField("tripartite_order_id")
    private String tripartiteOrderId;
    @Override
    protected Serializable pkVal() {
        return this.orderId;
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java
@@ -27,7 +27,7 @@
    @ApiModelProperty(value = "订单状态0.已取消1.待支付2.待核销3.已完成")
    private Integer orderStatus;
    @ApiModelProperty(value="订单来源1.商城2.秒杀活动3.线下创建")
    @ApiModelProperty(value = "订单来源1.商城2.秒杀活动3.线下创建4.抽奖5.美团6.抖音7.快手")
    private Integer orderFrom;
    @ApiModelProperty(value = "商品总价")
@@ -73,25 +73,28 @@
    @ApiModelProperty(value = "用户姓名")
    private String userName;
    @ApiModelProperty(value = "用户电话")
    private String userMobile;
    @ApiModelProperty(value="实收金额")
    @ApiModelProperty(value = "实收金额")
    
    private BigDecimal realReceiveMoney;
    @ApiModelProperty(value="已收金额")
    @ApiModelProperty(value = "已收金额")
    
    private BigDecimal receiveMoney;
    @ApiModelProperty(value="未收金额")
    @ApiModelProperty(value = "未收金额")
    
    private BigDecimal unReceiveMoney;
    @ApiModelProperty(value="支付方式1.全款2订金")
    @ApiModelProperty(value = "支付方式1.全款2订金")
    private Integer payType;
    @ApiModelProperty(value="结清标记0否1是")
    @ApiModelProperty(value = "结清标记0否1是")
    private Integer closeFlag;
    @ApiModelProperty(value = "剩余可核销次数")
    private Integer laveTime;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.douyin.openapi.client.models.*;
import com.github.binarywang.wxpay.bean.ecommerce.*;
import com.github.binarywang.wxpay.bean.ecommerce.enums.TradeTypeEnum;
import com.github.binarywang.wxpay.bean.profitsharingV3.ProfitSharingNotifyResult;
@@ -49,6 +50,8 @@
import com.ruoyi.order.service.account.ProfitSharingService;
import com.ruoyi.order.service.order.*;
import com.ruoyi.order.util.HuiFuTianXiaUtil;
import com.ruoyi.order.util.douyin.OrderUtil;
import com.ruoyi.order.util.douyin.VerifyUtil;
import com.ruoyi.system.api.constant.AppErrorConstant;
import com.ruoyi.system.api.constant.DelayTaskEnum;
import com.ruoyi.system.api.constant.SecurityConstant;
@@ -1809,12 +1812,12 @@
        merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList);
        merVerifyOrderVo.setPayType(order.getPayType());
        merVerifyOrderVo.setRealReceiveMoney(order.getChangeReceivableMoney());
        if(order.getPayType()==1){
        if (order.getPayType() == 1) {
            merVerifyOrderVo.setReceiveMoney(order.getPayMoney());
        }else{
            if(order.getOfflinePayMoney()!=null){
        } else {
            if (order.getOfflinePayMoney() != null) {
                merVerifyOrderVo.setReceiveMoney(order.getOfflinePayMoney());
            }else{
            } else {
                merVerifyOrderVo.setReceiveMoney(BigDecimal.ZERO);
            }
        }
@@ -1826,7 +1829,41 @@
        // 返回结果
        return merVerifyOrderVo;
    }
    @Override
    public MerVerifyOrderVo verifyOrderDouYin(String orderId, Long shopId) {
        CertificatePrepareResponseData data = VerifyUtil.certificatePrepare(orderId);
        if (null == data) {
            throw new ServiceException("查询券信息失败");
        }
        List<CertificatePrepareResponseDataCertificatesItem> itemList = data.getCertificates();
        if (null == itemList || itemList.isEmpty()) {
            throw new ServiceException("查询券信息失败");
        }
        CertificatePrepareResponseDataCertificatesItem certificatesItem = itemList.get(0);
        //商品信息
        CertificatePrepareResponseDataCertificatesItemSku sku = certificatesItem.getSku();
        //次卡信息
        CertificatePrepareResponseDataCertificatesItemTimeCard timeCard = certificatesItem.getTimeCard();
        //券的状态
        Number status = certificatesItem.getStatus();
        // 创建返回对象
        MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo();
        // 设置返回对象的属性值
        merVerifyOrderVo.setOrderId(orderId);
        merVerifyOrderVo.setOrderFrom(6);
        merVerifyOrderVo.setOrderStatus(status.intValue() == 1 ? 2 : 3);
        List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = new ArrayList<>();
        AppUserOrderGoodsPageVo orderGoodsPageVo = new AppUserOrderGoodsPageVo();
        orderGoodsPageVo.setGoodsName(sku.getTitle());
        appUserOrderGoodsPageVoList.add(orderGoodsPageVo);
        merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList);
        merVerifyOrderVo.setLaveTime(timeCard.getTimesCount() - timeCard.getTimesUsed());
        // 返回结果
        return merVerifyOrderVo;
    }
    /**
     * 确认核销订单
     *
@@ -2068,17 +2105,222 @@
        remoteMemberService.changeMemberTotal(memberTotalChangeDto);
        return merVerifyOrderVo;
    }
    /**
     * @description  分账实现
     * @author  jqs
     * @date    2023/9/8 11:56
     * 核销抖音券
     *
     * @return
     */
    @Override
    @Transactional
    @GlobalTransactional(rollbackFor = Exception.class)
    public MerVerifyOrderVo sureVerifyOrderDouYin(MerVerifyOrderDto merVerifyOrderDto) {
        String phone = merVerifyOrderDto.getPhone();
        String orderId = merVerifyOrderDto.getOrderId();
        Long shopId = merVerifyOrderDto.getShopId();
        //获取核销商户
        Shop shop = remoteShopService.getShop(shopId).getData();
        CertificatePrepareResponseData data = VerifyUtil.certificatePrepare(orderId);
        if (null == data) {
            throw new ServiceException("查询券信息失败");
        }
        List<CertificatePrepareResponseDataCertificatesItem> itemList = data.getCertificates();
        if (null == itemList || itemList.isEmpty()) {
            throw new ServiceException("查询券信息失败");
        }
        CertificatePrepareResponseDataCertificatesItem certificatesItem = itemList.get(0);
        Number status = certificatesItem.getStatus();
        if (status.intValue() == 2) {
            throw new ServiceException("该抖音券不能重复核销");
        }
        if (status.intValue() != 1) {
            throw new ServiceException("抖音券核销失败");
        }
        String encryptedCode = certificatesItem.getEncryptedCode();
        List<CertificateVerifyResponseDataVerifyResultsItem> items = VerifyUtil.certificateVerify(data.getVerifyToken(), shop.getPoiId(), new ArrayList<String>() {{
            add(encryptedCode);
        }});
        if (null == items || items.isEmpty()) {
            throw new ServiceException("抖音券核销失败");
        }
        Order one = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getTripartiteOrderId, data.getOrderId()));
        if (null != one) {
            throw new ServiceException("该抖音券不能重复核销");
        }
        TradeOrderQueryResponseData tradeOrderQueryResponseData = OrderUtil.queryOrderList(1, 10, data.getOrderId());
        //原始金额
        BigDecimal originAmount = BigDecimal.ZERO;
        //支付金额
        BigDecimal payAmount = BigDecimal.ZERO;
        //优惠金额
        BigDecimal payDiscountAmount = BigDecimal.ZERO;
        if (null != tradeOrderQueryResponseData) {
            TradeOrderQueryResponseDataOrdersItem ordersItem = tradeOrderQueryResponseData.getOrders().get(0);
            TradeOrderQueryResponseDataOrdersItemAmountInfo amountInfo = ordersItem.getAmountInfo();
            originAmount = BigDecimal.valueOf(amountInfo.getOriginAmount()).divide(new BigDecimal(100));
            payAmount = BigDecimal.valueOf(amountInfo.getPayAmount()).divide(new BigDecimal(100));
            payDiscountAmount = BigDecimal.valueOf(amountInfo.getPayDiscountAmount()).divide(new BigDecimal(100));
        }
        Date nowTime = new Date();
        Member member = remoteMemberService.getMemberByMobile(phone).getData();
        //开始添加订单数据
        Order order = new Order();
        order.setOrderId(IdUtils.fastSimpleUUID());
        order.setDelFlag(0);
        order.setOrderStatus(3);
        order.setOrderNo(CodeFactoryUtil.getShopOrderNo());
        order.setOrderFrom(6);
        order.setShopId(shopId);
        order.setUserId(member.getUserId());
        order.setOrderMoney(originAmount);
        order.setDiscountMoney(payDiscountAmount);
        order.setReceivableMoney(payAmount);
        order.setPayType(1);
        order.setPayMoney(payAmount);
        order.setOnlinePayMoney(payAmount);
        order.setOrderRemark("抖音订单");
        order.setCreateTime(nowTime);
        order.setPayTime(nowTime);
        order.setTripartiteOrderId(data.getOrderId());
        //绑定用户判断核销商户
        if (member.getBindingFlag() == 1) {
            if (!member.getRelationShopId().equals(shopId)) {
                throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR);
            }
        }
        order.setUseTime(nowTime);
        order.setUseUserId(merVerifyOrderDto.getUserId());
        order.setCloseFlag(1);
        this.save(order);
        //创建服务商品
        //获取商品信息(商品简介,调理问题)
        //商品信息
        CertificatePrepareResponseDataCertificatesItemSku sku = certificatesItem.getSku();
        //次卡信息
        CertificatePrepareResponseDataCertificatesItemTimeCard timeCard = certificatesItem.getTimeCard();
        OrderGoods orderGoods = new OrderGoods();
        orderGoods.setOrderGoodsId(IdUtils.simpleUUID());
        orderGoods.setDelFlag(0);
        orderGoods.setOrderId(order.getOrderId());
        orderGoods.setBuyNum(timeCard.getTimesCount());
        orderGoods.setCycleNumFlag(1);
        orderGoods.setServiceNum(timeCard.getTimesCount());
        orderGoods.setGoodsType(2);
        orderGoods.setGoodsName(sku.getTitle());
        orderGoodsService.save(orderGoods);
        ConsumerGoods consumerGoods = new ConsumerGoods();
        consumerGoods.setConsumerGoodsId(IdUtils.simpleUUID());
        consumerGoods.setDelFlag(0);
        consumerGoods.setServiceStatus(1);
        consumerGoods.setShopId(order.getShopId());
        consumerGoods.setUserId(order.getUserId());
        consumerGoods.setOrderId(orderId);
        consumerGoods.setOrderGoodsId(orderGoods.getOrderGoodsId());
        consumerGoods.setGoodsName(sku.getTitle());
        consumerGoods.setCycleNumFlag(1);
        consumerGoods.setServiceNum(timeCard.getTimesCount());
        consumerGoods.setCreateTime(nowTime);
        consumerGoods.setGoodsType(2);
        consumerGoods.setSourceFrom(1);
        consumerGoodsService.save(consumerGoods);
        //生成返回
        MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo();
        merVerifyOrderVo.setOrderId(orderId);
        merVerifyOrderVo.setOrderNo(order.getOrderNo());
        merVerifyOrderVo.setOrderStatus(order.getOrderStatus());
        merVerifyOrderVo.setOrderFrom(order.getOrderFrom());
        merVerifyOrderVo.setOrderGoodsMoney(order.getOrderMoney());
        merVerifyOrderVo.setCouponDiscount(order.getCouponMoney());
        merVerifyOrderVo.setReceivableDeposit(order.getReceivableDeposit());
        merVerifyOrderVo.setPayMoney(order.getPayMoney());
        merVerifyOrderVo.setOrderRemark(order.getOrderRemark());
        merVerifyOrderVo.setAppUserOrderGoodsPageVoList(new ArrayList<AppUserOrderGoodsPageVo>() {{
            add(new AppUserOrderGoodsPageVo() {{
                setOrderGoodsId(orderGoods.getOrderGoodsId());
                setGoodsName(orderGoods.getGoodsName());
                setGoodsType(orderGoods.getGoodsType());
                setBuyNum(orderGoods.getBuyNum());
            }});
        }});
        merVerifyOrderVo.setCreateTime(order.getCreateTime());
        merVerifyOrderVo.setPayTime(order.getPayTime());
        merVerifyOrderVo.setUseTime(order.getUseTime());
        merVerifyOrderVo.setPayType(order.getPayType());
        merVerifyOrderVo.setRealReceiveMoney(order.getChangeReceivableMoney());
        //根据支付方式返回应收金额和已收金额
        if (order.getPayType() == 1) {
            merVerifyOrderVo.setReceivableMoney(order.getOrderMoney().subtract(order.getPayMoney()));
            merVerifyOrderVo.setReceiveMoney(order.getPayMoney());
        } else {
            merVerifyOrderVo.setReceivableMoney(order.getOrderMoney().subtract(order.getCouponMoney()).subtract(order.getReceivableDeposit()));
            if (order.getOfflinePayMoney() != null) {
                merVerifyOrderVo.setReceiveMoney(order.getOfflinePayMoney());
            } else {
                merVerifyOrderVo.setReceiveMoney(BigDecimal.ZERO);
            }
        }
        merVerifyOrderVo.setUnReceiveMoney(merVerifyOrderVo.getRealReceiveMoney().subtract(merVerifyOrderVo.getReceiveMoney()));
        merVerifyOrderVo.setUserId(order.getUserId());
        merVerifyOrderVo.setUserName(member.getRealName());
        merVerifyOrderVo.setUserMobile(member.getMobile());
        merVerifyOrderVo.setCloseFlag(order.getCloseFlag());
        //判断用户是否绑定  2023-09-05需求改变核销时绑定用户
        if (member.getBindingFlag() != 1) {
            //绑定商户
            AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto();
            appMemberBindingDto.setShopId(order.getShopId());
            appMemberBindingDto.setUserId(order.getUserId());
            appMemberBindingDto.setBindingFlag(1);
            if (order.getOrderFrom() == 1) {
                appMemberBindingDto.setBindingType(1);
            } else if (order.getOrderFrom() == 2) {
                appMemberBindingDto.setBindingType(2);
            }
            remoteMemberService.updateMemberBinding(appMemberBindingDto);
            order.setNewMemberFlag(1);
        } else {
            order.setNewMemberFlag(0);
        }
        this.saveOrUpdate(order);
        //更新用户积分和消费统计
        MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto();
        memberTotalChangeDto.setUserId(order.getUserId());
        // 如果存在积分兑换比例,则计算积分
        if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) {
            Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL);
            BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue);
            BigDecimal integralBig = moneyValueBig.multiply(order.getOnlinePayMoney()).setScale(0, BigDecimal.ROUND_HALF_UP);
            Integer integral = Integer.valueOf(integralBig.toString());
            if (integral > 0) {
                memberTotalChangeDto.setChangeIntegral(integral);
                memberTotalChangeDto.setTypeIntegral(1);
                memberTotalChangeDto.setOrderId(orderId);
                memberTotalChangeDto.setOrderNo(order.getOrderNo());
            }
        }
        //更新消费时间
        memberTotalChangeDto.setConsumeTime(nowTime);
        remoteMemberService.changeMemberTotal(memberTotalChangeDto);
        return merVerifyOrderVo;
    }
    /**
     * @param orderId
     * @param orderNo
     * @param shopId
     * @param orderMoney
     * @param orderFrom
     * @return  void
     * @return void
     * @description 分账实现
     * @author jqs
     * @date 2023/9/8 11:56
     */
    private void submitProfitSharing(String orderId, String orderNo, Long shopId, BigDecimal orderMoney, Integer orderFrom) {
        String sendMessage = "";
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
@@ -7,7 +7,6 @@
import com.github.binarywang.wxpay.bean.ecommerce.RefundNotifyResult;
import com.github.binarywang.wxpay.bean.profitsharingV3.ProfitSharingNotifyResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.ruoyi.order.domain.dto.MerVerifyPrizeDto;
import com.ruoyi.order.domain.dto.*;
import com.ruoyi.order.domain.pojo.order.Order;
import com.ruoyi.order.domain.vo.*;
@@ -105,36 +104,55 @@
     * @return
     */
    MerHomeShopTotalVo getMerHomeTotal(MerHomeShopTotalVo merHomeShopTotalVo);
    /**
     * 获取核销订单
     *
     * @param orderId
     * @return
     */
    MerVerifyOrderVo verifyOrder(String orderId,Long shopId);
    MerVerifyOrderVo verifyOrder(String orderId, Long shopId);
    /**
     * 获取抖音的核销订单
     *
     * @param orderId
     * @param shopId
     * @return
     */
    MerVerifyOrderVo verifyOrderDouYin(String orderId, Long shopId);
    /**
     * 确认核销订单
     *
     * @param merVerifyOrderDto
     * @return
     */
    MerVerifyOrderVo sureVerifyOrder(MerVerifyOrderDto merVerifyOrderDto);
    /**
     * @description  确认核销优惠券
     * @author  jqs
     * @date    2023/6/28 11:26
     * 核销抖音券
     *
     * @return
     */
    MerVerifyOrderVo sureVerifyOrderDouYin(MerVerifyOrderDto merVerifyOrderDto);
    /**
     * @param merVerifyCouponDto
     * @return  MerVerifyCouponVo
     * @return MerVerifyCouponVo
     * @description 确认核销优惠券
     * @author jqs
     * @date 2023/6/28 11:26
     */
    MerVerifyCouponVo sureVerifyCoupon(MerVerifyCouponDto merVerifyCouponDto);
    /**
     * @description  确认核销奖品
     * @author  jqs
     * @date    2023/7/9 9:54
     * @param merVerifyPrizeDto
     * @return  MerVerifyAwardVo
     * @return MerVerifyAwardVo
     * @description 确认核销奖品
     * @author jqs
     * @date 2023/7/9 9:54
     */
    MerVerifyAwardVo sureVerifyPrize(MerVerifyPrizeDto merVerifyPrizeDto);
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java
@@ -7,17 +7,17 @@
 */
public interface DouyinConfig {
    
    String APP_ID = "your app id";
    String APP_ID = "awhqgkio6uhnx28e";
    /**
     * 应用唯一标识
     */
    String CLIENT_KEY = "your app secret";
    String CLIENT_KEY = "awhqgkio6uhnx28e";
    /**
     * 应用的密钥
     */
    String CLIENT_SECRET = "your redirect uri";
    String CLIENT_SECRET = "fbe8067d93660d6468d6c408ab2a7c46";
    /**
     * 来客商户根账户ID
     */
    String ACCOUNT_ID = "your redirect uri";
    String ACCOUNT_ID = "7215050221296814140";
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java
@@ -1,8 +1,13 @@
package com.ruoyi.order.util.douyin;
import com.douyin.openapi.client.Client;
import com.douyin.openapi.client.models.*;
import com.douyin.openapi.client.models.TradeOrderQueryRequest;
import com.douyin.openapi.client.models.TradeOrderQueryResponse;
import com.douyin.openapi.client.models.TradeOrderQueryResponseData;
import com.douyin.openapi.client.models.TradeOrderQueryResponseExtra;
import com.douyin.openapi.credential.models.Config;
import com.ruoyi.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
@@ -12,95 +17,47 @@
 * @author zhibing.pu
 * @Date 2025/6/11 18:58
 */
@Slf4j
public class OrderUtil {
    
    
    /**
     * 查询订单列表
     *
     * @param page
     * @param pageSize
     * @param startTime
     * @param endTime
     * @return
     */
    public static OrderQueryResponse queryOrderList(Integer page, Integer pageSize, LocalDateTime startTime, LocalDateTime endTime) {
    public static TradeOrderQueryResponseData queryOrderList(Integer page, Integer pageSize, String order_id) {
        //判断token是否过期
        long now = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
        if(ClientTokenUtil.expiration_time < now){
        if (ClientTokenUtil.expiration_time < now) {
            ClientTokenUtil.getClientToken();
        }
        try {
            Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret
            Client client = new Client(config);
            OrderQueryRequest queryRequest = new OrderQueryRequest();
            TradeOrderQueryRequest queryRequest = new TradeOrderQueryRequest();
            queryRequest.setAccessToken(ClientTokenUtil.token);
            queryRequest.setAccountId(DouyinConfig.ACCOUNT_ID);
            queryRequest.setPage(page);
            queryRequest.setSize(pageSize);
            if(null != startTime){
                queryRequest.setStartTime(startTime.toEpochSecond(ZoneOffset.of("+8")));
            queryRequest.setPageNum(page);
            queryRequest.setPageSize(pageSize);
            if (StringUtils.isNotEmpty(order_id)) {
                queryRequest.setOrderId(order_id);
            }
            if(null != endTime){
                queryRequest.setEndTime(endTime.toEpochSecond(ZoneOffset.of("+8")));
            TradeOrderQueryResponse tradeOrderQueryResponse = client.TradeOrderQuery(queryRequest);
            TradeOrderQueryResponseExtra extra = tradeOrderQueryResponse.getExtra();
            Integer errorCode = extra.getErrorCode();
            if (0 != errorCode) {
                log.error("【抖音】查询订单失败:" + extra.getDescription());
                return null;
            }
            OrderQueryResponse queryResponse = client.OrderQuery(queryRequest);
            return queryResponse;
            return tradeOrderQueryResponse.getData();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 根据订单id查询订单详情
     * @param orderId
     * @return
     */
    public static OrderGetResponse getOrder(String orderId) {
        //判断token是否过期
        long now = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
        if(ClientTokenUtil.expiration_time < now){
            ClientTokenUtil.getClientToken();
        }
        try {
            Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret
            Client client = new Client(config);
            OrderGetRequest getRequest = new OrderGetRequest();
            getRequest.setAccessToken(ClientTokenUtil.token);
            getRequest.setOrderId(orderId);
            OrderGetResponse orderGetResponse = client.OrderGet(getRequest);
            return orderGetResponse;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 根据订单id获取详细的订单信息
     * @param orderId
     * @return
     */
    public static OrderDetailGetResponse getOrderDetail(String orderId) {
        //判断token是否过期
        long now = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
        if(ClientTokenUtil.expiration_time < now){
            ClientTokenUtil.getClientToken();
        }
        try {
            Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret
            Client client = new Client(config);
            OrderDetailGetRequest request = new OrderDetailGetRequest();
            request.setAccessToken(ClientTokenUtil.token);
            request.setOrderId(orderId);
            OrderDetailGetResponse orderDetailGetResponse = client.OrderDetailGet(request);
            return orderDetailGetResponse;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java
New file
@@ -0,0 +1,102 @@
package com.ruoyi.order.util.douyin;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.douyin.openapi.client.Client;
import com.douyin.openapi.client.models.*;
import com.douyin.openapi.credential.models.Config;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List; /**
 * @author zhibing.pu
 * @Date 2025/6/16 10:28
 */
@Slf4j
public class VerifyUtil {
    /**
     * 验券准备
     * @param code  短链地址
     * @return
     */
    public static CertificatePrepareResponseData certificatePrepare(String code){
        //判断token是否过期
        long now = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
        if(ClientTokenUtil.expiration_time < now){
            ClientTokenUtil.getClientToken();
        }
        try {
            //用户短链地址获取长链地址,获取encryptedData参数
            HttpRequest get = HttpUtil.createGet(code);
            HttpResponse execute = get.execute();
            int status = execute.getStatus();
            String encryptedData = "";
            if(302 == status){
                String location = execute.header("Location");
                location = location.substring(location.indexOf("object_id=") + 1);
                location = location.substring(0, location.indexOf("&"));
                encryptedData = location;
            }
            Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret
            Client client = new Client(config);
            CertificatePrepareRequest request = new CertificatePrepareRequest();
            request.setAccessToken(ClientTokenUtil.token);
            request.setEncryptedData(encryptedData);
            CertificatePrepareResponse response = client.CertificatePrepare(request);
            CertificatePrepareResponseExtra extra = response.getExtra();
            Integer errorCode = extra.getErrorCode();
            if(0 != errorCode){
                log.error("【抖音】验券准备失败");
                return null;
            }
            return response.getData();
        }catch (Exception e) {
            log.error("【抖音】验券准备失败");
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 验券
     * @param poiId 抖音门店id
     * @param encryptedCodes    加密券码
     * @return
     */
    public static List<CertificateVerifyResponseDataVerifyResultsItem> certificateVerify(String verify_token, String poiId, List<String> encryptedCodes){
        //判断token是否过期
        long now = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
        if(ClientTokenUtil.expiration_time < now){
            ClientTokenUtil.getClientToken();
        }
        try {
            Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret
            Client client = new Client(config);
            CertificateVerifyRequest request = new CertificateVerifyRequest();
            request.setAccessToken(ClientTokenUtil.token);
            request.setVerifyToken(verify_token);
            request.setPoiId(poiId);
            request.setEncryptedCodes(encryptedCodes);
            CertificateVerifyResponse response = client.CertificateVerify(request);
            CertificateVerifyResponseExtra extra = response.getExtra();
            Integer errorCode = extra.getErrorCode();
            if(0 != errorCode){
                log.error("【抖音】验券失败");
                return null;
            }
            CertificateVerifyResponseData data = response.getData();
            List<CertificateVerifyResponseDataVerifyResultsItem> verifyResults = data.getVerifyResults();
            return verifyResults;
        }catch (Exception e) {
            log.error("【抖音】验券失败");
            e.printStackTrace();
        }
        return null;
    }
}