From 878ac7cc8e1951bbc7b27619c4e7ece1e3d331ff Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期三, 16 七月 2025 16:41:12 +0800 Subject: [PATCH] 新增加快手团购券核销功能 --- ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/VerifyUtil.java | 115 +++++++++++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/OrderUtil.java | 56 +++++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java | 8 ruoyi-modules/ruoyi-order/src/main/resources/lib/ks669347494775509202_202507153-1.0.1764.jar | 0 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KSWebHookController.java | 37 +++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java | 18 + ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KuaiShouConfig.java | 24 ++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java | 244 ++++++++++++++++++++++++ ruoyi-modules/ruoyi-order/pom.xml | 8 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/ClientTokenUtil.java | 72 +++++++ 10 files changed, 582 insertions(+), 0 deletions(-) diff --git a/ruoyi-modules/ruoyi-order/pom.xml b/ruoyi-modules/ruoyi-order/pom.xml index a6e1c7c..3d8592a 100644 --- a/ruoyi-modules/ruoyi-order/pom.xml +++ b/ruoyi-modules/ruoyi-order/pom.xml @@ -167,6 +167,14 @@ <artifactId>sdk</artifactId> <version>1.0.0</version> </dependency> + <!--快手sdk--> + <dependency> + <groupId>com.kuaishou.openapi</groupId> + <artifactId>sdk</artifactId> + <version>1.0.1764</version> + <scope>system</scope> + <systemPath>${project.basedir}/src/main/resources/lib/ks669347494775509202_202507153-1.0.1764.jar</systemPath> + </dependency> </dependencies> <build> 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 1482c1c..dec5930 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 @@ -82,6 +82,10 @@ if (verifyCode.contains("douyin")) { merVerifyOrderVo = orderService.verifyOrderDouYin(verifyCode, merVerifyCodeDto.getShopId()); } + //快手 + if (verifyCode.contains("ksurl")) { + merVerifyOrderVo = orderService.verifyOrderKuaiShou(verifyCode, merVerifyCodeDto.getShopId()); + } } return R.ok(merVerifyOrderVo); } @@ -100,6 +104,10 @@ if (merVerifyOrderDto.getOrderId().contains("douyin")) { merVerifyOrderVo = orderService.sureVerifyOrderDouYin(merVerifyOrderDto); } + //快手 + if (merVerifyOrderDto.getOrderId().contains("ksurl")) { + merVerifyOrderVo = orderService.sureVerifyOrderKuaiShou(merVerifyOrderDto); + } } return R.ok(merVerifyOrderVo); } 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 2962360..7e10468 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 @@ -17,6 +17,12 @@ import com.github.binarywang.wxpay.service.WxPayService; import com.google.common.collect.Lists; import com.google.gson.Gson; +import com.kuaishou.locallife.open.api.domain.locallife_order.OpenApiOrderAmountV1; +import com.kuaishou.locallife.open.api.domain.locallife_order.OpenApiQueryOrderDetailInfoV1; +import com.kuaishou.locallife.open.api.domain.locallife_trade.SimpleCertificateTimesCard; +import com.kuaishou.locallife.open.api.domain.locallife_trade.SkuTImesCard; +import com.kuaishou.locallife.open.api.domain.locallife_trade.VerifyPrepareDataNew; +import com.kuaishou.locallife.open.api.domain.locallife_trade.VerifyResult; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.enums.UserStatus; @@ -84,6 +90,8 @@ import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; @@ -1879,6 +1887,40 @@ return merVerifyOrderVo; } + + @Override + public MerVerifyOrderVo verifyOrderKuaiShou(String orderId, Long shopId) { + VerifyPrepareDataNew data = com.ruoyi.order.util.kuaishou.VerifyUtil.certificatePrepare(redisService, orderId); + if (null == data) { + throw new ServiceException("查询券信息失败"); + } + List<SimpleCertificateTimesCard> itemList = data.getCertificates(); + if (null == itemList || itemList.isEmpty()) { + throw new ServiceException("查询券信息失败"); + } + SimpleCertificateTimesCard certificatesItem = itemList.get(0); + Long expire_time = certificatesItem.getExpire_time(); + if(LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) > expire_time){ + throw new ServiceException("优惠券已过期"); + } + //商品信息 + SkuTImesCard sku = certificatesItem.getSku(); + // 创建返回对象 + MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo(); + // 设置返回对象的属性值 + merVerifyOrderVo.setOrderId(orderId); + merVerifyOrderVo.setOrderFrom(7); + merVerifyOrderVo.setOrderStatus(2); + List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = new ArrayList<>(); + AppUserOrderGoodsPageVo orderGoodsPageVo = new AppUserOrderGoodsPageVo(); + orderGoodsPageVo.setGoodsName(sku.getTitle()); + appUserOrderGoodsPageVoList.add(orderGoodsPageVo); + merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList); + merVerifyOrderVo.setLaveTime(sku.getTimes_count()); + // 返回结果 + return merVerifyOrderVo; + } + /** * 确认核销订单 * @@ -2327,6 +2369,208 @@ /** + * 核销快手券 + * + * @return + */ + @Override + @Transactional +// @GlobalTransactional(rollbackFor = Exception.class) todo 放开分布式事务注解 + public MerVerifyOrderVo sureVerifyOrderKuaiShou(MerVerifyOrderDto merVerifyOrderDto) { + String phone = merVerifyOrderDto.getPhone(); + String orderId = merVerifyOrderDto.getOrderId(); + Long shopId = merVerifyOrderDto.getShopId(); + //获取核销商户 + Shop shop = remoteShopService.getShop(shopId).getData(); + VerifyPrepareDataNew data = com.ruoyi.order.util.kuaishou.VerifyUtil.certificatePrepare(redisService, orderId); + if (null == data) { + throw new ServiceException("查询券信息失败"); + } + List<SimpleCertificateTimesCard> itemList = data.getCertificates(); + if (null == itemList || itemList.isEmpty()) { + throw new ServiceException("查询券信息失败"); + } + SimpleCertificateTimesCard certificatesItem = itemList.get(0); + Long expire_time = certificatesItem.getExpire_time(); + if(LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) > expire_time){ + throw new ServiceException("优惠券已过期"); + } + + String encryptedCode = certificatesItem.getEncrypted_code(); + List<VerifyResult> items = com.ruoyi.order.util.kuaishou.VerifyUtil.certificateVerify(redisService, data.getVerify_token(), shop.getPoiId(), new ArrayList<String>() {{ + add(encryptedCode); + }}, data.getOrder_id()); + if (null == items || items.isEmpty()) { + throw new ServiceException("快手券核销失败"); + } + Order one = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getTripartiteOrderId, data.getOrder_id())); + if (null != one) { + throw new ServiceException("该快手券不能重复核销"); + } + + OpenApiQueryOrderDetailInfoV1 orderDetailInfoV1 = com.ruoyi.order.util.kuaishou.OrderUtil.queryOrderInfo(redisService, data.getOrder_id()); + //原始金额 + BigDecimal originAmount = BigDecimal.ZERO; + //支付金额 + BigDecimal payAmount = BigDecimal.ZERO; + //优惠金额 + BigDecimal payDiscountAmount = BigDecimal.ZERO; + if (null != orderDetailInfoV1) { + OpenApiOrderAmountV1 amountInfo = orderDetailInfoV1.getAmount(); + originAmount = BigDecimal.valueOf(amountInfo.getTotal_amount()); + payAmount = BigDecimal.valueOf(amountInfo.getPay_amount()); + payDiscountAmount = originAmount.subtract(payAmount); + } + + 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(7); + 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.getOrder_id()); + + //绑定用户判断核销商户 + 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); + //创建服务商品 + //获取商品信息(商品简介,调理问题) + //商品信息 + SkuTImesCard sku = certificatesItem.getSku(); + + OrderGoods orderGoods = new OrderGoods(); + orderGoods.setOrderGoodsId(IdUtils.simpleUUID()); + orderGoods.setDelFlag(0); + orderGoods.setOrderId(order.getOrderId()); + orderGoods.setGoodsId(sku.getSku_id()); + orderGoods.setBuyNum(sku.getTimes_count()); + orderGoods.setCycleNumFlag(1); + orderGoods.setServiceNum(sku.getTimes_count()); + 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.setGoodsId(sku.getSku_id()); + consumerGoods.setOrderGoodsId(orderGoods.getOrderGoodsId()); + consumerGoods.setGoodsName(sku.getTitle()); + consumerGoods.setCycleNumFlag(1); + consumerGoods.setServiceNum(sku.getTimes_count()); + 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 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 b5971b3..e3382a0 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 @@ -123,6 +123,17 @@ */ MerVerifyOrderVo verifyOrderDouYin(String orderId, Long shopId); + + /** + * 获取快手的核销订单 + * + * @param orderId + * @param shopId + * @return + */ + MerVerifyOrderVo verifyOrderKuaiShou(String orderId, Long shopId); + + /** * 确认核销订单 * @@ -138,6 +149,13 @@ */ MerVerifyOrderVo sureVerifyOrderDouYin(MerVerifyOrderDto merVerifyOrderDto); + /** + * 核销快手券 + * + * @return + */ + MerVerifyOrderVo sureVerifyOrderKuaiShou(MerVerifyOrderDto merVerifyOrderDto); + /** * @param merVerifyCouponDto diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/ClientTokenUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/ClientTokenUtil.java new file mode 100644 index 0000000..aaf9801 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/ClientTokenUtil.java @@ -0,0 +1,72 @@ +package com.ruoyi.order.util.kuaishou; + +import com.aliyun.tea.TeaException; +import com.kuaishou.locallife.open.api.KsLocalLifeApiException; +import com.kuaishou.locallife.open.api.client.oauth.OAuthAccessTokenKsClient; +import com.kuaishou.locallife.open.api.response.oauth.KsAccessTokenPreviousVersionResponse; +import com.ruoyi.common.redis.service.RedisService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * 快手获取client_token工具类 + * @author zhibing.pu + * @Date 2025/6/11 18:46 + */ +@Slf4j +@Component +public class ClientTokenUtil { + + + /** + * 获取client_token + */ + public static void getClientToken(RedisService redisService, String code) { + try { + OAuthAccessTokenKsClient client = new OAuthAccessTokenKsClient(KuaiShouConfig.appKey, KuaiShouConfig.appSecret); + try { + KsAccessTokenPreviousVersionResponse response = client.getAccessToken(code); + String token = response.getAccessToken(); + Long expiration_time = response.getExpiresIn(); + String refreshToken = response.getRefreshToken(); + Long refreshTokenExpiresIn = response.getRefreshTokenExpiresIn(); + redisService.setCacheObject("ks_access_token", token, expiration_time, TimeUnit.SECONDS); + redisService.setCacheObject("ks_refresh_token", refreshToken, refreshTokenExpiresIn, TimeUnit.SECONDS); + } catch (KsLocalLifeApiException e) { + throw new RuntimeException(e); + } + } catch (TeaException e) { + System.out.println(e.getMessage()); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + + /** + * 刷新client_token + */ + public static void refreshToken(RedisService redisService) { + try { + Object ks_refresh_token = redisService.getCacheObject("ks_refresh_token"); + OAuthAccessTokenKsClient client = new OAuthAccessTokenKsClient(KuaiShouConfig.appKey, KuaiShouConfig.appSecret); + try { + KsAccessTokenPreviousVersionResponse response = client.refreshAccessToken(ks_refresh_token.toString()); + String token = response.getAccessToken(); + Long expiration_time = response.getExpiresIn(); + String refreshToken = response.getRefreshToken(); + Long refreshTokenExpiresIn = response.getRefreshTokenExpiresIn(); + redisService.setCacheObject("ks_access_token", token, expiration_time, TimeUnit.SECONDS); + redisService.setCacheObject("ks_refresh_token", refreshToken, refreshTokenExpiresIn, TimeUnit.SECONDS); + } catch (KsLocalLifeApiException e) { + throw new RuntimeException(e); + } + } catch (TeaException e) { + System.out.println(e.getMessage()); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KSWebHookController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KSWebHookController.java new file mode 100644 index 0000000..592cdf2 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KSWebHookController.java @@ -0,0 +1,37 @@ +package com.ruoyi.order.util.kuaishou; + +import com.ruoyi.common.redis.service.RedisService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + + +/** + * @author zhibing.pu + * @Date 2025/6/11 19:36 + */ +@Slf4j +@RestController +@RequestMapping("/kuaishou") +public class KSWebHookController { + + @Resource + private RedisService redisService; + + + /** + * 快手webhook + */ + @ResponseBody + @GetMapping("/webhook") + public void orderWebHook(String code, String state) { + log.info("快手webhook回调,code:{},state:{}", code, state); + ClientTokenUtil.getClientToken(redisService, code); + } + + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KuaiShouConfig.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KuaiShouConfig.java new file mode 100644 index 0000000..05c076c --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KuaiShouConfig.java @@ -0,0 +1,24 @@ +package com.ruoyi.order.util.kuaishou; + +/** + * @author zhibing.pu + * @Date 2025/7/16 15:09 + */ +public interface KuaiShouConfig { + /** + * 应用key + */ + String appKey = "ks669347494775509202"; + /** + * 应用秘钥 + */ + String appSecret = "gaS7PGQyZFBt74-Lb30QDA"; + /** + * 签名秘钥 + */ + String signSecret = "ffaf72e8e4404764d472dcdfdb8a2e9c"; + /** + * 消息秘钥 + */ + String messageSecret = "ZhS0g9+xLhhja4aQLJp/Rg=="; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/OrderUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/OrderUtil.java new file mode 100644 index 0000000..50d4a7a --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/OrderUtil.java @@ -0,0 +1,56 @@ +package com.ruoyi.order.util.kuaishou; + +import com.kuaishou.locallife.open.api.KsLocalLifeApiException; +import com.kuaishou.locallife.open.api.client.KsLocalLifeAccessTokenClient; +import com.kuaishou.locallife.open.api.common.utils.GsonUtils; +import com.kuaishou.locallife.open.api.domain.locallife_order.OpenApiQueryOrderDetailInfoV1; +import com.kuaishou.locallife.open.api.request.locallife_order.GoodlifeV2TradeOrderDetailRequest; +import com.kuaishou.locallife.open.api.response.locallife_order.GoodlifeV2TradeOrderDetailResponse; +import com.ruoyi.common.redis.service.RedisService; +import lombok.extern.slf4j.Slf4j; + +/** + * 快手订单工具类 + * @author zhibing.pu + * @Date 2025/6/11 18:58 + */ +@Slf4j +public class OrderUtil { + + + /** + * 查询订单详情 + * + * @return + */ + public static OpenApiQueryOrderDetailInfoV1 queryOrderInfo(RedisService redisService, String order_id) { + //判断token是否过期 + Object ks_access_token = redisService.getCacheObject("ks_access_token"); + if(null == ks_access_token){ + //刷新token + com.ruoyi.order.util.kuaishou.ClientTokenUtil.refreshToken(redisService); + ks_access_token = redisService.getCacheObject("ks_access_token"); + } + String access_token = ks_access_token.toString(); + KsLocalLifeAccessTokenClient client = KsLocalLifeAccessTokenClient.Builder.newBuilder() + .setAccessToken(access_token) + .build(); + GoodlifeV2TradeOrderDetailRequest request = new GoodlifeV2TradeOrderDetailRequest(); + request.setOrder_id(order_id); + try { + GoodlifeV2TradeOrderDetailResponse response = client.execute(request); + log.info("【快手】查询详情返回结果:{}", GsonUtils.toJSON(response)); + if(0 != response.getData().getError_code()){ + log.error("【快手】查询详情失败"); + return null; + } + return response.getData(); + } catch (KsLocalLifeApiException e) { + log.error("查询详情失败:{}", e.getMessage()); + e.printStackTrace(); + } + return null; + } + + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/VerifyUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/VerifyUtil.java new file mode 100644 index 0000000..f353c07 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/VerifyUtil.java @@ -0,0 +1,115 @@ +package com.ruoyi.order.util.kuaishou; + +import com.kuaishou.locallife.open.api.KsLocalLifeApiException; +import com.kuaishou.locallife.open.api.client.KsLocalLifeAccessTokenClient; +import com.kuaishou.locallife.open.api.common.utils.GsonUtils; +import com.kuaishou.locallife.open.api.domain.locallife_trade.VerifyPrepareDataNew; +import com.kuaishou.locallife.open.api.domain.locallife_trade.VerifyResult; +import com.kuaishou.locallife.open.api.request.locallife_trade.GoodlifeV1FulfilmentCertificatePrepareRequest; +import com.kuaishou.locallife.open.api.request.locallife_trade.GoodlifeV1FulfilmentCertificateVerifyRequest; +import com.kuaishou.locallife.open.api.response.locallife_trade.GoodlifeV1FulfilmentCertificatePrepareResponse; +import com.kuaishou.locallife.open.api.response.locallife_trade.GoodlifeV1FulfilmentCertificateVerifyResponse; +import com.ruoyi.common.redis.service.RedisService; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/6/16 10:28 + */ +@Slf4j +public class VerifyUtil { + + + /** + * 验券准备 + * @param code 短链地址 + * @return + */ + public static VerifyPrepareDataNew certificatePrepare(RedisService redisService, String code){ + //判断token是否过期 + Object ks_access_token = redisService.getCacheObject("ks_access_token"); + if(null == ks_access_token){ + //刷新token + ClientTokenUtil.refreshToken(redisService); + ks_access_token = redisService.getCacheObject("ks_access_token"); + } + String access_token = ks_access_token.toString(); + KsLocalLifeAccessTokenClient client = KsLocalLifeAccessTokenClient.Builder.newBuilder() + .setAccessToken(access_token) + .build(); + //截取链接中的检验码 + code = code.substring(code.lastIndexOf("/") + 1); + GoodlifeV1FulfilmentCertificatePrepareRequest request = new GoodlifeV1FulfilmentCertificatePrepareRequest(); + request.setEncrypted_short_code(code); + + try { + GoodlifeV1FulfilmentCertificatePrepareResponse response = client.execute(request); + log.info("【快手】验券准备返回结果:{}", GsonUtils.toJSON(response)); + VerifyPrepareDataNew data = response.getData(); + if(0 != data.getError_code()){ + log.error("【快手】验券准备失败"); + return null; + } + return data; + } catch (KsLocalLifeApiException e) { + log.error("【快手】验券准备失败"); + e.printStackTrace(); + } + return null; + } + + + /** + * 验券 + * @param poiId 快手门店id + * @param encryptedCodes 加密券码 + * @param encryptedCodes 验券准备接口返回的加密快手券码 + * @param order_id 快手订单号 + * @return + */ + public static List<VerifyResult> certificateVerify(RedisService redisService, String verify_token, String poiId, List<String> encryptedCodes, String order_id){ + //判断token是否过期 + Object ks_access_token = redisService.getCacheObject("ks_access_token"); + if(null == ks_access_token){ + //刷新token + ClientTokenUtil.refreshToken(redisService); + ks_access_token = redisService.getCacheObject("ks_access_token"); + } + String access_token = ks_access_token.toString(); + KsLocalLifeAccessTokenClient client = KsLocalLifeAccessTokenClient.Builder.newBuilder() + .setAccessToken(access_token) + .build(); + + GoodlifeV1FulfilmentCertificateVerifyRequest request = new GoodlifeV1FulfilmentCertificateVerifyRequest(); + + request.setVerify_token(verify_token); + request.setPoi_id(poiId); + request.setEncrypted_codes(encryptedCodes); + request.setOrder_id(order_id); + try { + GoodlifeV1FulfilmentCertificateVerifyResponse response = client.execute(request); + log.info("【快手】验券返回结果:{}", GsonUtils.toJSON(response)); + if(0 != response.getData().getError_code()){ + log.error("【快手】验券失败"); + return null; + } + /** + * result 验券结果码,0表示成功,非0表示失败 + * msg 验券结果说明 + * code 代表验券传入的code或encrypted_code + * verify_id 代表券码一次核销的标识(撤销时需要) + * certificate_id 代表一张券码的标识(撤销时需要) + * origin_code 原始券码 + * account_id 代表商家总店id(查询验券历史时需要) + * is_abnormal 验券结果通知 true 异常 false 非异常 + */ + return response.getData().getVerify_results(); + } catch (KsLocalLifeApiException e) { + log.error("【快手】验券失败"); + e.printStackTrace(); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/lib/ks669347494775509202_202507153-1.0.1764.jar b/ruoyi-modules/ruoyi-order/src/main/resources/lib/ks669347494775509202_202507153-1.0.1764.jar new file mode 100644 index 0000000..df15818 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/resources/lib/ks669347494775509202_202507153-1.0.1764.jar Binary files differ -- Gitblit v1.7.1