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