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; } }