对于第三方接口调用的模板

发布时间 2023-12-29 18:03:43作者: 你的小铃铛呀

1.需要一个基础的Controller,用于读取配置文件里面的信息,比如第三方地址等,还有生成一个HttpPost,用于调用

public class BaseController {
  /*
   *  appId(对应第三方系统的appId)
   */
 @Value(otherSystem.appId)
 protected string appId;

  /*
   *  signId(对应第三方系统的signId
   */
@Value(otherSystem.signId)
 protected string signId

  /*
   *  url(对应第三方系统的url)
   */
@Value(otherSystem.url)
 protected string url;

protected  HttpPost setHeader(String url,String body,String bizMethod) throws MalformedURLException{
   //请求路径
   HttpPost   httpPost  = new HttpPost(url);
   //报文头
   httppost.addHeader("Content-Type", "application/json;charset=utf-8");
   httppost.addHeader("bizMethod", bizMethod);
   //需签名加密
   httppost.addHeader("appId", appId) ;
   //加密
   httppost.addHeader("signIdn, signId);
   httppost.addBeader("signMethod","sm3");
   //签名方式
   String reqTs = new SimpleDateFormat ("yyyyMddHHmmssSSS") .format(new Date ());
   httppost.addeadex("reqIs",regIs);
   //请求方发送报文的时间,unix 时间戳 
   //加密
   String logId = "m3pop" + new SimpleDateFormat ("yyMMddHHmmss5SS").format (new Date());
   httppost.addHeadex("requestId", logId);
   //请求唯一标识加
   Stxing origsign = "bizMethod=" + bizMethod + "&" + "appId=" + appld + "&" + "reqTs=" + reqTs + "&" + "requestId" + logId + "&"
   //sha256计算摘要并转换为16进制
   String sign = getSM3Stx(origSign);
   httppost.addHeadex("sign", sign);
   return  httppost;
}

protected static String getSM3Str(String str) {
      if (StringUtils.isBlank(str)){
          return null;   
         }
     String encdestr = "";
    try{
       bytel] bytes = str.getBytes("UTF-8");
       encdeStx = Hex.encodeHexString(SM3Util,sm3 (bytes));
     }catch(UnsupportedEncodingException ex){
      ex.printstackTrace();
     }
     return  encdestr ;
}

2.在配置文件里面添加第三方系统的相关配置

#第三方平台
otherSystem:
  appId: xxx
  signId: xxx
  url: xxx

需要注意的是,这些信息不能写死,等写成配置,还有一点就是需要打通你的服务器和第三方之间的网络

3.有了生成HttpPost的基础类之后,我们可以写一个业务类去继承它,在里面去封装一些需要调用接口用到的信息

@Api("第三方平台品牌业务”)
@Slf4j
@RestController
@RequestMapping("/corporater")
public class BrandManageController extends BaseController {
     
/*
 * 品牌列表查询
 */
@ApiOperation(value ="品牌列表查询)
@PostMapping("/brandlist")
public DataResponse<BrandInfoVo> queryBrandList(@RequestBody BrandListParam param) {
DataResponse<BrandInfoVo> dataResponse=new DataResponse<>();
String resultData = null;
BrandInfovo brandInfoVo=new BrandInfovo();
try (CloseableHttpClient httpclient = HttpClients.createDefault()){
   //封装请求信息
   JSONObject bodyjson = new JSONObject(); 
   bodyjson .put (uversion""1.0.0");
   bodyjson .put ("pageNum",param .getPageNum());
   bodyjson.put ("brandId", param.getBrandId());
   bodyjson.put("brandlias", param.getBrandAlias());
   bodyison.put("srcBrandId", param.getSrcBrandId());
   bodyjson.put("bussCatId",param,getBussCat2Id());
   bodyjson.put("bussCatIdGroup", param,getBussCatiId()):
   bodyison .put ("brandNm", param,getBrandNm());
   bodyjson,put("procSt","8");
   String body = bodyjson.tostring();
   
   HttpPost httppost = 
   setHeader(ssourl+"/corporate/brandlist",body,"corporate.brandlist");
   httppost.setEntity(new StringEntity(body,"UTF-8"));
   log.info("第三方品牌列表查询请求报文:{}",body):
   CloseableHttpResponse response = httpclient.execute (httppost);
   resultData = EntityUtils.toString(response.getEntity());
   log.info("第三方品牌列表查询返回数据:()",resultData);
   brandInfoVo = JSON.parseObject (resultData,BrandInfoVo.class);
   }catch(Exception e){
    log.error(e.getMessage(), e);
    log.error("品牌列表查询:(),e.getMessage());
    return new DataResponse<>(ExceptionDefinition.FuseError, brandInfoVo);
    }
    return new DataResponse<>(ExceptionDefinition.OK,brandInfoVo);
}

注意:要在调用接口前后加上日志,以便后续出问题好排查