客户管理系统开发定制对接第三方顺丰丰桥下客户管理系统开发定制单接口实战
前言
客户管理系统开发定制在接入第三方顺丰之前要先登录LaaS开放平台,客户管理系统开发定制如果您是首次与顺丰合作,客户管理系统开发定制可通过注册平台账号后登录。
如果您已有开放平台账号,可直接使用账号密码登录。如果您已有月结管家/速打平台/数据灯塔账号,可选择对应登录方式直接登录。如果您是顺丰内部员工,可选择顺丰工号登录方式完成域账号登录。
登录完成后需要进行个人认证或企业认证,如何进行认证小伙伴在顺丰控制台首页认证,认证完成后,需要审核月结卡号哦,如果已经有月结卡号就自行绑定即可,把这些相关信息都完成了,就可以对接顺丰接口啦,话不多说,接下来直接上代码。如果不还有不了解的可以给博主留言哦
pom文件顺丰依赖
pom文件引入顺丰sdk依赖,如何引入外部依赖到内部maven仓库之前的文件有教程,不懂如何引入外部依赖的可以去看我其他文章
Controller层
/** * 生成顺丰丰桥快递订单 * @param keys * @return */ @PostMapping("createSfOrder") public Result<FhhzdH> createSfOrder (@RequestBody List<Long> keys) throws UnsupportedEncodingException { return service.createSfOrder(keys); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Service层
/** * 生成顺丰丰桥快递订单 * @param keys * @return * @throws UnsupportedEncodingException */ Result<FhhzdH> createSfOrder (List<Long> keys) throws UnsupportedEncodingException;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
ServiceImpl实现类层
/** * 生成订单 */ @SuppressWarnings("static-access") @Override @Transactional public Result<FhhzdH> createSfOrder(List<Long> keys) throws UnsupportedEncodingException { if (keys == null || keys.size() == 0) { return new Result<FhhzdH>().setCode(BussErrorCode.ARGUMENT_NOT_VALID).setReason("请求参数不能为空!"); } for (int i = 0; i < keys.size(); i++) { Long key = keys.get(i); FhhzdH fhhzdH = mapper.selectByPrimaryKey(key); if (Common.isNull(fhhzdH)) { return new Result<FhhzdH>().setCode(BussErrorCode.ARGUMENT_NOT_VALID) .setReason("单号为" + key + "发货汇总单数据不存在!"); } if (Common.isNotEmpty(fhhzdH.getKddh())) { throw new RuntimeException( String.format("单据号为[%s],快递单号为[%s]已发货", fhhzdH.getDjh(), fhhzdH.getKddh())); } //读取顺丰配置文件 loadSfProperties(); // 获取发货人信息 FhrywhH fhrywhH = Common.requiredFirst(fhrywhHMapper.select(new RmFhrywhHQuery().letBm(fhhzdH.getFhr())), String.format("该%s编码发货人员配置不存在!", fhhzdH.getFhr())); // 封装下单信息 String msgData = orderInfo(fhhzdH, fhrywhH, SF_CARD_NO); CallExpressServiceTools tools = CallExpressServiceTools.getInstance(); Map<String, String> params = new HashMap<String, String>(); String timeStamp = String.valueOf(System.currentTimeMillis());// String msgData =tools.packageMsgData(standardService); params.put("partnerID", CLIENT_CODE); // 顾客编码 ,对应丰桥上获取的clientCode params.put("requestID", UUID.randomUUID().toString().replace("-", "")); params.put("serviceCode", EXP_RECE_CREATE_ORDER);// 接口服务码 params.put("timestamp", timeStamp); params.put("msgData", msgData); params.put("msgDigest", tools.getMsgDigest(msgData, timeStamp, CHECK_WORD)); String result = HttpClientUtil.post(CALL_URL_BOX, params); ShunFengResponse res = new Gson().fromJson(result, ShunFengResponse.class); String apiResultData = res.getApiResultData(); ResultData data = new Gson().fromJson(apiResultData, ResultData.class); if (data.getSuccess() == true) {// 成功 String sfdh = data.getMsgData().getWaybillNoInfoList().get(0).getWaybillNo();// 顺丰单号 FhhzdH temp = new FhhzdH(); temp.setDjlsh(key); temp.setKddh(sfdh);//顺丰下单返回的顺丰单号更新到自己的数据库,方便后续查询订单 mapper.updateByPrimaryKeySelective(temp); } else { throw new RuntimeException(String.format("单据号为[%s],[%s]", fhhzdH.getDjh(), data.getErrorMsg())); } } return new Result<FhhzdH>().setCode(BussErrorCode.SUCCESS).setReason("顺丰下单成功!"); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
封装请求参数
我自己是使用json格式,也可以使用xml格式,这个可以根据实际情况使用即可,请求参数不需要都要和我的一样,可根据实际开发需要去定义,这只是一个范例,有不了解的小伙伴可留言
** * 顺丰丰桥下单请求参数 * @param fhhzdH * @param fhrywhH * @param sfCardNo * @return */ private String orderInfo(FhhzdH fhhzdH, FhrywhH fhrywhH,String sfCardNo) { SfOrderParam param = new SfOrderParam(); List<CargoDetail> cargoList = new ArrayList<CargoDetail>(); CargoDetail cargo = new CargoDetail();//拖寄物信息 cargo.setName("工艺品");//货物名称,如果需要生成电子运 单,则为必填。 cargo.setCount(1L);//货物数量 跨境件报关需要填写 cargo.setUnit("件");//货物单位,如:个、台、本,跨境 件报关需要填写。 cargoList.add(cargo); param.setCargoDetails(cargoList);//拖寄物信息 List<ContactInfo> contactInfoList = new ArrayList<ContactInfo>(); ContactInfo info = new ContactInfo(); // 获取发货方 省份,城市,县 Map<String, String> map = addressResolution(fhrywhH.getJfdz()); info.setContactType(1L);//地址类型: 1,寄件方信息 2,到件方信息 info.setAddress(fhrywhH.getJfdz());//详细地址 info.setCity(map.get("city")); info.setCompany(fhrywhH.getGsmc()); info.setContact(fhrywhH.getJjr());// 联系人 info.setCounty(map.get("county"));//所在县/区级行政区名称 info.setMobile(fhrywhH.getJfdh());//寄方电话 info.setProvince(map.get("province"));//所在省级行政区名称 contactInfoList.add(info); map.clear(); // 获取收货方 省份,城市,县 map = addressResolution(fhhzdH.getShdz()); ContactInfo contactInfo = new ContactInfo(); contactInfo.setContactType(2L);//地址类型: 1,寄件方信息 2,到件方信息 contactInfo.setAddress(fhhzdH.getShdz());//详细地址收货地址 contactInfo.setCity(map.get("city")); contactInfo.setCompany(fhhzdH.getMdmc()); contactInfo.setContact(fhhzdH.getShouhr());// 收货人 contactInfo.setCounty(map.get("county"));//所在县/区级行政区名称 contactInfo.setMobile(fhhzdH.getLxdh());//收 联系电话 contactInfo.setProvince(map.get("province"));//所在省级行政区名称 contactInfoList.add(contactInfo); param.setContactInfoList(contactInfoList);//收寄双方信息 param.setExpressTypeId(2L); param.setIsOneselfPickup(0L);//快件自取,支持以下值: 1:客户同意快件自取 0:客户不同意快件自取 param.setLanguage("zh-CN");//语言 param.setOrderId(fhhzdH.getDjh());//客户订单号 param.setParcelQty(1L);//包裹数 if ("1".equals(fhhzdH.getSfby())) {//付款方式,支持以下值: 1:寄方付 2:收方付 3:第三方付 param.setPayMethod(1L); //包邮寄方付 }else { param.setPayMethod(2L); //不包邮收方付 } param.setMonthlyCard(sfCardNo);//月结卡号 param.setRemark(fhhzdH.getBz()); String msgData = new Gson().toJson(param).toString(); //把请求参数转成json格式 log.info("顺丰丰桥下单请求参数:{}", msgData); return msgData; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
下单请求参数json参数示例
顺丰丰桥下单响应参数
拿到响应参数需要自己处理,因为顺丰返回的是json对象需要自己处理成自己需要的数据,就不一一演示了
以上代码看起来很多很复杂,其实是很简单的,实际还可以优化,如果对您有帮助劳烦帮忙点个赞,收藏关注一下,可以相互学习共同进步。