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> 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); } 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 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 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/ClientTokenUtil.java
New file @@ -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()); } } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KSWebHookController.java
New file @@ -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); } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/KuaiShouConfig.java
New file @@ -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=="; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/OrderUtil.java
New file @@ -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; } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/kuaishou/VerifyUtil.java
New file @@ -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; } } ruoyi-modules/ruoyi-order/src/main/resources/lib/ks669347494775509202_202507153-1.0.1764.jarBinary files differ