快遞100
阿新 • • 發佈:2020-07-20
註冊獲取金鑰
快遞公司編碼大全 https://poll.kuaidi100.com/manager/page/document/kdbm
需要存入資料庫,後續介面需要獲取快遞公司的程式碼才能正確呼叫介面 springboot 配置kuaidi100: key: customer: secret: userId: judge: queryUrl: https://poll.kuaidi100.com/poll/query.do #查詢快遞的地址 固定 subscribeUrl: https://poll.kuaidi100.com/poll #訂閱快遞的地址 固定 judgeUrl: http://www.kuaidi100.com/autonumber/auto #智慧判斷快遞的地址 固定 callbackUrl: http://121.36.107.100:30000/kuaiDi100/callback #快遞訊息 狀態變更後通知的地址
實時查詢快遞介面 https://poll.kuaidi100.com/manager/page/document/synquery
@Data public class QueryExpressParam { @NotNull @ApiModelProperty("快遞公司編碼") private String com; @NotNull @ApiModelProperty("快遞單號") private String num; @ApiModelProperty("收件人或寄件人的手機號,可選(順豐必填)") private String phone; @ApiModelProperty("出發地城市,省-市-區(可選)") private String from; @ApiModelProperty("目的地城市,省-市-區(可選)") private String to; } public String queryOrder(QueryExpressParam queryExpressParam) { String queryUrl= kuaiDi100Properties.getQueryUrl(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> map= new LinkedMultiValueMap<>(); String paramString = JSONObject.toJSONString(queryExpressParam); String sign = md5Uppercase(paramString + kuaiDi100Properties.getKey() + kuaiDi100Properties.getCustomer()); map.add("customer", kuaiDi100Properties.getCustomer()); map.add("sign", sign); map.add("param", paramString); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(queryUrl, request, String.class); return responseEntity.getBody(); }
訂閱推送介面https://poll.kuaidi100.com/manager/page/document/subscribe
public KuaiDi100Response subscribe(SubscribeParam subscribeParam) { //快遞100訂閱地址 String subscribeUrl = kuaiDi100Properties.getSubscribeUrl(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> map= new LinkedMultiValueMap<>(); SubscribeExpressModel model = initSubscribeExpressModel(subscribeParam); map.add("schema", "json"); map.add("param", JSONObject.toJSONString(model)); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(subscribeUrl, request, String.class); return JSON.parseObject(responseEntity.getBody(), KuaiDi100Response.class); } // 回撥 public KuaiDi100Response callback(HttpServletRequest request) { String sign = request.getParameter("sign"); String param = request.getParameter("param"); String id = request.getParameter("id"); String type = request.getParameter("type"); KuaiDi100Response kuaiDi100Response = new KuaiDi100Response(); try { CallBackParam callBackParam = JSONObject.parseObject(param, CallBackParam.class); CallBackParam.LastResultBean lastResult = callBackParam.getLastResult(); List<CallBackParam.LastResultBean.DataBean> data = lastResult.getData(); // 快遞json資料 String dataString = JSONObject.toJSONString(data); String num = lastResult.getNu(); String companyCode = lastResult.getCom(); ExpressRecord record = expressRecordService.getByCompanyCodeAndNum(companyCode, num); //新增記錄 或修改記錄 if(null == record){ ExpressCompanyDict expressCompanyDict = expressCompanyDictService.getByCompanyCode(companyCode); String companyName = expressCompanyDict.getCompanyName(); ExpressRecord expressRecord = new ExpressRecord(); expressRecord.setId(IdUtil.simpleUUID()); expressRecord.setStatus(callBackParam.getStatus()); expressRecord.setNum(lastResult.getNu()); expressRecord.setCompanyName(companyName); expressRecord.setState(lastResult.getState()); expressRecord.setIscheck(lastResult.getIscheck()); expressRecord.setData(dataString); if(StringUtils.hasText(id) && StringUtils.hasText(type)){ expressRecord.setBusinessId(id); expressRecord.setBusinessType(type); } expressRecordService.insert(expressRecord); }else { ExpressRecord expressRecord = new ExpressRecord(); BeanUtil.copyProperties(record, expressRecord); expressRecord.setData(dataString); expressRecord.setStatus(callBackParam.getStatus()); expressRecord.setState(lastResult.getState()); expressRecord.setIscheck(lastResult.getIscheck()); expressRecordService.updateSelective(expressRecord); } //修改業務狀態 boolean updateFlag = StringUtils.hasText(id) && StringUtils.hasText(type) && (3 == lastResult.getState() || 1 == lastResult.getIscheck()); if(updateFlag){ updateStatusByBusinessParam(id, type); } kuaiDi100Response.setResult(true); kuaiDi100Response.setReturnCode("200"); kuaiDi100Response.setMessage("接收成功"); } catch (Exception e) { e.printStackTrace(); log.error("kuaiDi100 callback has error: {}", e.getMessage()); kuaiDi100Response.setResult(false); kuaiDi100Response.setReturnCode("500"); kuaiDi100Response.setMessage(e.getMessage()); } return kuaiDi100Response; }智慧判斷介面 https://poll.kuaidi100.com/manager/page/document/autonumber
public String judgeExpressNum(String num) { String getUrl = kuaiDi100Properties.getJudgeUrl() + "?" + "num=" + num + "&key=" + kuaiDi100Properties.getJudge(); ResponseEntity<String> responseEntity = restTemplate.getForEntity(getUrl, String.class); return responseEntity.getBody(); } public List<JudgeResult> getJudgeResult(String num) { String jsonStr = judgeExpressNum(num); if(jsonStr.contains("returnCode")){ JSONObject jsonObject = JSONObject.parseObject(jsonStr); ExceptionCast.cast(new ErrorCode(500, jsonObject.getString("message"))); } List<JudgeResult> results = JSONObject.parseArray(jsonStr, JudgeResult.class); for (JudgeResult result : results) { ExpressCompanyDict expressCompany = expressCompanyDictService.getByCompanyCode(result.getComCode()); if(null != expressCompany){ result.setCompanyName(expressCompany.getCompanyName()); } } return results; }