对接第三方接口教程(发送Http请求及返回参数处理)
Posted JAVA开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对接第三方接口教程(发送Http请求及返回参数处理)相关的知识,希望对你有一定的参考价值。
1.首先Http工具类建议使用
package cn.hutool.http; //这个包下面的 HttpUtil.post(String urlString, String body) 这个方法会省去很多事情,不用去设置header的一些基本东西,get就不说了,get也能用post请求,把参数拼url后边就行了
2.要看第三方接口的鉴权是如何做的,如果是token鉴权,那么在请求业务方法之前还要先请求获取token的接口。获取token后最好把token放到缓存里,避免每次都请求token。
如果是秘钥鉴权,比较简单,把秘钥放在body里,跟参数一块发过去,主要看第三方的接口文档。如果需要秘钥放在header里,那么要用 HttpUtil.createPost()这个方法。
3.是要看返回值的处理,一般先有个状态码,为成功的话处理,否则抛异常
最好写一个映射实体类,和返回的data里的一致,然后强转就可以了。图快的话也可以用map
4.代码案例,下面贴两个代码段
1)
HashMap<String,Object> req = new HashMap<>(); req.put("product","xx"); //鉴权用 req.put("sign","xxx-xxx");//签名,相当于秘钥,鉴权用 req.put("userId",erpUserId); HashMap<String,Object> formData = new HashMap<>(); formData.put("name",crmCustomer.getCustomerName()); formData.put("relaCustsupCode",crmCustomerExt.getCustomerCode()); formData.put("province",crmCustomerExt.getAddrProvince()); formData.put("city",crmCustomerExt.getAddrCity()); formData.put("inPool",crmCustomerExt.getIsEnterpool()); formData.put("custIndustry",crmCustomerExt.getCustomerIndustry()); req.put("formData",formData); String codeMsg = ""; try JSONObject o = (JSONObject) JSON.toJSON(req); //先把map转成josn对象 String body = HttpUtil.post(ERP_DOMAIN_URL+"/api-suppliers/busi/comm/api/ibf/suppliers/bl/add", o.toJSONString()); //把josn对象转成josn字符串 JSONObject jsonObject = JSON.parseObject(body); if (jsonObject != null && jsonObject.get("code").equals("0000")) JSONObject data = (JSONObject) jsonObject.get("data"); //todo 返回值处理 根据给的接口文档,对返回参数进行处理,也可以debug跟文档对一下return true; else codeMsg = jsonObject.get("codeMsg").toString(); throw new CrmException(500,codeMsg); catch (Exception e) log.error("推送数据至ERP失败,请重试!客户:" +crmCustomer.getCustomerName()); throw new CrmException(500,codeMsg);
2)
try String body = HttpUtil.createPost("http://url/crm_department_info/execute") .header("Content-Type","application/json;charset=UTF-8") .header("appKey","xx") .header("appSecret","xxxxx") .execute().body(); JSONObject jsonObject = JSON.parseObject(body); //将返回的信息转成json对象 if (jsonObject != null && jsonObject.get("code").equals(200)) if (jsonObject.get("data") == null) return true; else JSONArray data = (JSONArray) jsonObject.get("data"); //这个data里是一个list。这里有两种处理方案,一种是声明类,字段与JsonArray里的一致,然后强转出来,不想写类的话,就用我下面这种 List<HashMap<String,Object>> hashMapList = new ArrayList<>(); List<DeptIdCodeMatch> deptIdCodeMatchList = this.queryDeptIdCodeMatchList(); Map<String, DeptIdCodeMatch> maps = deptIdCodeMatchList.stream().collect(Collectors.toMap( DeptIdCodeMatch::getDeptCode, Function.identity(), (key1, key2) -> key2)); for (Object obj: data) HashMap<String,Object> hp = JSONObject.parseObject(JSONObject.toJSONString(obj), HashMap.class);//遍历JsonArray,放到map里 hashMapList.add(hp); Set<String> codeSet = new HashSet<>();//对数据去查 if (hashMapList != null && !hashMapList.isEmpty()) hashMapList.forEach(v -> String parentdeptCode = v.get("parentId").toString(); String deptCode = v.get("id").toString(); codeSet.add(parentdeptCode); codeSet.add(deptCode); ); this.insertDeptCodeList(codeSet); List<AdminDept> list = new ArrayList<>(); hashMapList.forEach(v->//映射实体类 AdminDept adminDept = new AdminDept(); adminDept.setParentdept(v.get("parentId").toString()); adminDept.setOwnerUserName(v.get("userName").toString()); adminDept.setCode(v.get("id").toString()); adminDept.setName(v.get("groupName").toString()); adminDept.setPid(maps.get(v.get("parentId").toString()).getDeptId()); list.add(adminDept); ); if (list == null || list.size() == 0) return true; this.getBaseMapper().saveOrUpdateAdminDeptSyncErp(list); return true; else log.error("查询数据失败!日期:"+formatDate); catch (Exception e) log.error("同步数据失败!日期:"+formatDate);
对接第三方支付接口-记录
对接支付接口,得知这种第三方的支付接口的对接方式一般为:组装接口需要的参数,以json数据格式或者其他格式(大多数为json),请求第三方支付接口的url,并且将回调的通知地址放在参数中,等支付完成后,一般成功后会异步请求这个通知接口,会返回相应的数据给系统做一系列的数据操作,然后返回一个成功状态。这样一次第三方支付接口的请求算结束。
由于这次是与APP端开发人员对接,场景为:用户在APP上进行还款操作,APP开发人员将该期还款计划的id和还款方式(主动还款/代扣)传给后台,后台服务端将传递的参数进行相应的逻辑处理,比如查出还款计划、查出该笔订单,然后将这些数据组装成第三方支付接口需要字段并且json格式,通过后台服务端的接口在传递到APP这边,APP开发人员接收到后台的参数,解析后直接将json串作为请求第三方支付接口的参数,请求第三方支付的相关接口。请求成功后如上所说,会有一个异步的通知,请求后台服务端的接口,后台服务端解析接口传递过来的参数,并同样做相应的逻辑处理,这次的异步通知参数的格式为:直接通过HTTP字节流方式,后台服务端直接使用request.getInputStream()即可获取到。完成相应的逻辑操作后返回一个结果状态和提示信息
{ "resule_code":"0000", "result_msg":"交易成功" }
以上是关于对接第三方接口教程(发送Http请求及返回参数处理)的主要内容,如果未能解决你的问题,请参考以下文章