From 41422cb74d137e590fefefa4390cd6eedc02a0fb Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期一, 16 六月 2025 16:19:03 +0800
Subject: [PATCH] 对接部分抖音接口

---
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java            |    6 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java               |    8 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java                 |  102 ++++++++++
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java                |   21 +
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java             |   27 +-
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java                  |   87 ++------
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java           |   11 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java |   12 +
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java             |   46 +++-
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java    |  262 +++++++++++++++++++++++++-
 10 files changed, 463 insertions(+), 119 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java
index b0688c8..db4e83d 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java
+++ b/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() {
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java
index b4c22d6..35368b8 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java
+++ b/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);
     }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java
index 11bc5f1..7572692 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java
+++ b/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;
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java
index 7f472e7..13dd518 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java
+++ b/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;
     }
-
+    
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java
index 7217d93..06adc1b 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java
+++ b/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;
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
index 24d7837..4640431 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
+++ b/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 = "";
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
index 55c01d7..dac1e6e 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
+++ b/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);
 
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java
index f6da792..d5c136c 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java
+++ b/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";
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java
index 8a5d454..59f295e 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java
+++ b/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;
-	}
 	
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java
new file mode 100644
index 0000000..d051b03
--- /dev/null
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java
@@ -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;
+	}
+}

--
Gitblit v1.7.1