diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java index 86d220638..7a2b1abce 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -29,6 +30,7 @@ public class JsonUtils { static { objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.registerModules(new JavaTimeModule()); // 解决 LocalDateTime 的序列化 } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java index 4d74a3695..341a02c2b 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java @@ -53,8 +53,9 @@ public interface ErrorCodeConstants { ErrorCode EXPRESS_TEMPLATE_NAME_DUPLICATE = new ErrorCode(1011003003, "已经存在该运费模板名"); ErrorCode DELIVERY_EXPRESS_USER_ADDRESS_IS_EMPTY = new ErrorCode(1011003004, "计算快递运费时,收件人地址编号为空"); ErrorCode PRODUCT_EXPRESS_TEMPLATE_NOT_FOUND = new ErrorCode(1011003005, "找不到到商品对应的运费模板"); - ErrorCode EXPRESS_API_QUERY_FAILED = new ErrorCode(1011003006, "快递接口查询失败"); - ErrorCode PICK_UP_STORE_NOT_EXISTS = new ErrorCode(1011003007, "自提门店不存在"); + ErrorCode EXPRESS_API_QUERY_ERROR = new ErrorCode(1011003006, "快递查询接口异常"); + ErrorCode EXPRESS_API_QUERY_FAILED = new ErrorCode(1011003007, "快递查询返回失败, 原因:{}"); + ErrorCode PICK_UP_STORE_NOT_EXISTS = new ErrorCode(1011003008, "自提门店不存在"); // ========== Price 相关 1011004000 ============ ErrorCode PRICE_CALCULATE_PAY_PRICE_ILLEGAL = new ErrorCode(1011004000, "支付价格计算异常,原因:价格小于等于 0"); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java index c0705b74b..567e34085 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressQueryProperties.java @@ -55,10 +55,20 @@ public class TradeExpressQueryProperties { } /** - * 快递100 配置项 TODO + * 快递100 配置项 */ + @Data public static class Kd100Config { - + /** + * 快递 100 授权码 + */ + @NotEmpty(message = "快递 100 授权码配置项不能为空") + private String customer; + /** + * 快递 100 授权 key + */ + @NotEmpty(message = "快递 100 授权 Key 配置项不能为空") + private String key; } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java index 834c6170e..d22f61ae5 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/convert/ExpressQueryConvert.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.trade.framework.delivery.core.convert; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO; +import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100.Kd100ExpressQueryReqDTO; +import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100.Kd100ExpressQueryRespDTO; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao.KdNiaoExpressQueryReqDTO; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao.KdNiaoExpressQueryRespDTO; import org.mapstruct.Mapper; @@ -16,5 +18,9 @@ public interface ExpressQueryConvert { List convertList(List expressTrackList); + List convertList2(List expressTrackList); + KdNiaoExpressQueryReqDTO convert(ExpressQueryReqDTO dto); + + Kd100ExpressQueryReqDTO convert2(ExpressQueryReqDTO dto); } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryReqDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryReqDTO.java new file mode 100644 index 000000000..e2d55db34 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryReqDTO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 快递 100 快递查询 Req DTO + * + * @author jason + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Kd100ExpressQueryReqDTO { + + /** + * 快递公司编码 + */ + @JsonProperty("com") + private String expressCompanyCode; + + /** + * 快递单号 + */ + @JsonProperty("num") + private String logisticsNo; + + /** + * 收、寄件人的电话号码 + */ + private String phone; + + /** + * 出发地城市 + */ + private String from; + + /** + * 目的地城市,到达目的地后会加大监控频率 + */ + private String to; + + /** + * 返回结果排序:desc降序(默认),asc 升序 + */ + private String order; +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryRespDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryRespDTO.java new file mode 100644 index 000000000..49be06234 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/dto/provider/kd100/Kd100ExpressQueryRespDTO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * 快递 100 实时快递查询 Resp DTO 参见 快递 100 文档 + * + * @author jason + */ +@Data +public class Kd100ExpressQueryRespDTO { + + /** + * 快递公司编码 + */ + @JsonProperty("com") + private String expressCompanyCode; + + /** + * 快递单号 + */ + @JsonProperty("nu") + private String logisticsNo; + + /** + * 快递单当前状态 + */ + private String state; + + /** + * 查询结果, 失败返回 "false" + */ + private String result; + + /** + * 查询结果失败时的错误信息 + */ + private String message; + + @JsonProperty("data") + private List tracks; + + @Data + public static class ExpressTrack { + /** + * 轨迹发生时间 + */ + @JsonProperty("time") + private String time; + /** + * 轨迹描述 + */ + @JsonProperty("context") + private String state; + } +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java index 12a2fe653..07a51d0c9 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProvider.java @@ -1,19 +1,39 @@ package cn.iocoder.yudao.module.trade.framework.delivery.core.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.HexUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties; import cn.iocoder.yudao.module.trade.framework.delivery.core.ExpressQueryProvider; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO; +import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100.Kd100ExpressQueryReqDTO; +import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kd100.Kd100ExpressQueryRespDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.*; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; +import java.util.Collections; import java.util.List; +import java.util.Objects; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_FAILED; +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_ERROR; +import static cn.iocoder.yudao.module.trade.framework.delivery.core.convert.ExpressQueryConvert.INSTANCE; /** - * 快递 100 服务商 TODO + * 快递 100 服务商 + * * @author jason */ +@Slf4j public class Kd100ExpressQueryProvider implements ExpressQueryProvider { + private static final String REAL_TIME_QUERY_URL = "https://poll.kuaidi100.com/poll/query.do"; private final RestTemplate restTemplate; private final TradeExpressQueryProperties.Kd100Config config; @@ -25,6 +45,63 @@ public class Kd100ExpressQueryProvider implements ExpressQueryProvider { @Override public List realTimeQueryExpress(ExpressQueryReqDTO reqDTO) { - return null; + Kd100ExpressQueryReqDTO kd100ReqParam = INSTANCE.convert2(reqDTO); + // 快递公司编码需要转成小写 + kd100ReqParam.setExpressCompanyCode(kd100ReqParam.getExpressCompanyCode().toLowerCase()); + Kd100ExpressQueryRespDTO respDTO = sendExpressQueryReq(REAL_TIME_QUERY_URL, kd100ReqParam, + Kd100ExpressQueryRespDTO.class); + log.debug("快递 100 接口 查询接口返回 {}", respDTO); + if (Objects.equals("false", respDTO.getResult())) { + log.error("快递 100 接口 返回失败 {} ", respDTO.getMessage()); + throw exception(EXPRESS_API_QUERY_FAILED, respDTO.getMessage()); + } else { + if (CollUtil.isNotEmpty(respDTO.getTracks())) { + return INSTANCE.convertList2(respDTO.getTracks()); + } else { + return Collections.emptyList(); + } + } + } + + /** + * 发送快递 100 实时快递查询请求,可以作为通用快递 100 通用请求接口。 目前没有其它场景需要使用。暂时放这里 + * @param url 请求 url + * @param req 对应请求的请求参数 + * @param respClass 对应请求的响应 class + * @param 每个请求的请求结构 Req DTO + * @param 每个请求的响应结构 Resp DTO + */ + private Resp sendExpressQueryReq(String url, Req req, Class respClass) { + // 请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + // 生成签名 + String param = JsonUtils.toJsonString(req); + String sign = generateReqSign(param, config.getKey(), config.getCustomer()); + log.debug("快递 100 快递 接口生成签名的: {}", sign); + // 请求体 + MultiValueMap requestBody = new LinkedMultiValueMap<>(); + requestBody.add("customer", config.getCustomer()); + requestBody.add("sign", sign); + requestBody.add("param", param); + log.debug("快递 100 接口的请求参数: {}", requestBody); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + // 发送请求 + ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); + log.debug("快递 100 接口响应结果 {}", responseEntity); + // 处理响应 + if (responseEntity.getStatusCode().is2xxSuccessful()) { + String response = responseEntity.getBody(); + return JsonUtils.parseObject(response, respClass); + } else { + throw exception(EXPRESS_API_QUERY_ERROR); + } + } + + private String generateReqSign(String param, String key, String customer) { + String plainText = String.format("%s%s%s", param, key, customer); + log.debug("快递 100 接口待签名的数据 {}", plainText); + return HexUtil.encodeHexStr(DigestUtil.md5(plainText), false); } } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java index 00a2f8b24..b911892cd 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProvider.java @@ -11,7 +11,6 @@ import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReq import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao.KdNiaoExpressQueryReqDTO; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.provider.kdniao.KdNiaoExpressQueryRespDTO; -import com.fasterxml.jackson.core.type.TypeReference; import lombok.extern.slf4j.Slf4j; import org.springframework.http.*; import org.springframework.util.LinkedMultiValueMap; @@ -23,6 +22,7 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_FAILED; +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.EXPRESS_API_QUERY_ERROR; import static cn.iocoder.yudao.module.trade.framework.delivery.core.convert.ExpressQueryConvert.INSTANCE; /** @@ -57,34 +57,28 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider { KdNiaoExpressQueryRespDTO respDTO = sendKdNiaoApiRequest(REAL_TIME_QUERY_URL, REAL_TIME_FREE_REQ_TYPE, kdNiaoReqData, KdNiaoExpressQueryRespDTO.class); log.debug("快递鸟即时查询接口返回 {}", respDTO); - if (respDTO.getSuccess() && CollUtil.isNotEmpty(respDTO.getTracks())) { - return INSTANCE.convertList(respDTO.getTracks()); + if(!respDTO.getSuccess()){ + throw exception(EXPRESS_API_QUERY_FAILED, respDTO.getReason()); }else{ - return Collections.emptyList(); + if (CollUtil.isNotEmpty(respDTO.getTracks())) { + return INSTANCE.convertList(respDTO.getTracks()); + }else{ + return Collections.emptyList(); + } } } - private Resp sendKdNiaoApiRequest(String url, String requestType, Req req, - Class respClass){ - return sendKdNiaoApiRequest(url, requestType, req, respClass, null); - } - private Resp sendKdNiaoApiRequest(String url, String requestType, Req req, - TypeReference typeRefResp){ - return sendKdNiaoApiRequest(url, requestType, req, null, typeRefResp); - } - /** - * 快递鸟 通用的 API 请求 + * 快递鸟 通用的 API 请求, 暂时没有其他应用场景, 暂时放这里 * @param url 请求 url * @param requestType 对应的请求指令 (快递鸟的RequestType) * @param req 对应请求的请求参数 * @param respClass 对应请求的响应 class - * @param typeRefResp 对应请求的响应 TypeReference * @param 每个请求的请求结构 Req DTO * @param 每个请求的响应结构 Resp DTO */ private Resp sendKdNiaoApiRequest(String url, String requestType, Req req, - Class respClass, TypeReference typeRefResp){ + Class respClass){ // 请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); @@ -106,13 +100,9 @@ public class KdNiaoExpressQueryProvider implements ExpressQueryProvider { // 处理响应 if (responseEntity.getStatusCode().is2xxSuccessful()) { String response = responseEntity.getBody(); - if (respClass != null && typeRefResp == null) { - return JsonUtils.parseObject(response, respClass); - } else { - return JsonUtils.parseObject(response, typeRefResp); - } + return JsonUtils.parseObject(response, respClass); } else { - throw exception(EXPRESS_API_QUERY_FAILED); + throw exception(EXPRESS_API_QUERY_ERROR); } } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProviderTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProviderTest.java new file mode 100644 index 000000000..0d82f745b --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/Kd100ExpressQueryProviderTest.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.trade.framework.delivery.core.impl; + +import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties; +import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +import javax.annotation.Resource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * @author jason + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = Kd100ExpressQueryProviderTest.Application.class) +@ActiveProfiles("trade-delivery-query") // 设置使用 trade-delivery-query 配置文件 +public class Kd100ExpressQueryProviderTest { + @Resource + private RestTemplateBuilder builder; + @Resource + private TradeExpressQueryProperties expressQueryProperties; + + private Kd100ExpressQueryProvider kd100ExpressQueryProvider; + + @BeforeEach + public void init(){ + kd100ExpressQueryProvider = new Kd100ExpressQueryProvider(builder.build(),expressQueryProperties.getKd100()); + } + @Test + @Disabled("需要 授权 key. 暂时忽略") + void testRealTimeQueryExpressFailed() { + ServiceException t = assertThrows(ServiceException.class, () -> { + ExpressQueryReqDTO reqDTO = new ExpressQueryReqDTO(); + reqDTO.setExpressCompanyCode("yto"); + reqDTO.setLogisticsNo("YT9383342193097"); + kd100ExpressQueryProvider.realTimeQueryExpress(reqDTO); + }); + assertEquals(1011003007, t.getCode()); + } + + @Import({ + RestTemplateAutoConfiguration.class + }) + @EnableConfigurationProperties(TradeExpressQueryProperties.class) + public static class Application { + } +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java index f64550c77..cdde6c683 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/impl/KdNiaoExpressQueryProviderTest.java @@ -1,9 +1,10 @@ package cn.iocoder.yudao.module.trade.framework.delivery.core.impl; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressQueryProperties; import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryReqDTO; -import cn.iocoder.yudao.module.trade.framework.delivery.core.dto.ExpressQueryRespDTO; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -13,9 +14,8 @@ import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; import javax.annotation.Resource; -import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author jason @@ -35,12 +35,14 @@ public class KdNiaoExpressQueryProviderTest { kdNiaoExpressQueryProvider = new KdNiaoExpressQueryProvider(builder.build(),expressQueryProperties.getKdNiao()); } @Test - void queryExpress() { - ExpressQueryReqDTO reqDTO = new ExpressQueryReqDTO(); - reqDTO.setExpressCompanyCode("yto"); - reqDTO.setLogisticsNo("YT1764381060802"); - List expressQueryRespDTOS = kdNiaoExpressQueryProvider.realTimeQueryExpress(reqDTO); - assertNotNull(expressQueryRespDTOS); + @Disabled("需要 授权 key. 暂时忽略") + void testRealTimeQueryExpressFailed() { + assertThrows(ServiceException.class,() ->{ + ExpressQueryReqDTO reqDTO = new ExpressQueryReqDTO(); + reqDTO.setExpressCompanyCode("yy"); + reqDTO.setLogisticsNo("YT9383342193097"); + kdNiaoExpressQueryProvider.realTimeQueryExpress(reqDTO); + }); } @Import({ diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/resources/application-trade-delivery-query.yaml b/yudao-module-mall/yudao-module-trade-biz/src/test/resources/application-trade-delivery-query.yaml index 9922b84b9..e01cb1652 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/test/resources/application-trade-delivery-query.yaml +++ b/yudao-module-mall/yudao-module-trade-biz/src/test/resources/application-trade-delivery-query.yaml @@ -3,7 +3,7 @@ spring: lazy-initialization: true # 开启懒加载,加快速度 banner-mode: off # 单元测试,禁用 Banner ---- #################### 数据库相关配置 #################### +--- #################### 交易快递查询相关配置 #################### yudao: trade: @@ -11,5 +11,8 @@ yudao: query: express-query-provider: kd_niao kd-niao: - api-key: 8e22d97d-6a3d-442e-b243-2190c9f0cfdd - business-id: 1801700 \ No newline at end of file + api-key: xxx + business-id: xxxxxxxx + kd100: + customer: xxxx + key: xxxxx