对接第三方接口教程(发送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请求及返回参数处理)的主要内容,如果未能解决你的问题,请参考以下文章

web前端怎么调用api接口

对接第三方顺丰丰桥下单Api接口实战教程java

对接第三方支付接口-类似文件锁的编程小技巧

从第三方接口地址获取返回的参数

如何用jmeter 完成http请求

soapui 自动化教程