package com.stylefeng.guns.modular.system.kaipiao.util;
|
|
|
import cn.hutool.http.HttpUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.stylefeng.guns.modular.system.kaipiao.entity.GlobalInfo;
|
import com.stylefeng.guns.modular.system.kaipiao.entity.ReturnData;
|
import org.springframework.util.Base64Utils;
|
import cn.hutool.core.codec.Base64;
|
import javax.crypto.Mac;
|
import javax.crypto.spec.SecretKeySpec;
|
import java.nio.charset.StandardCharsets;
|
import java.security.InvalidKeyException;
|
import java.security.NoSuchAlgorithmException;
|
import java.util.Objects;
|
|
public class CreatAndSendUtil {
|
|
/**
|
* 通用调用数票通接口
|
* @param dataJson 业务接口请求报文json,具体字段见接口对接文档
|
* @param appSecret 企业密钥 由江苏航信分配获取
|
* @param appId 企业标识 由江苏航信分配获取
|
* @param interfaceCode 接口代码 接口代码详见接口对接文档
|
* @return ReturnData
|
*/
|
public static ReturnData creatAndSend(String dataJson, String appSecret, String appId, String interfaceCode){
|
ReturnData returnData = new ReturnData();
|
ReturnData.ReturnInfo returnInfo = new ReturnData.ReturnInfo();
|
|
//对json进行Base64编码
|
String dataBase64Str = Base64.encode(dataJson, "UTF-8");
|
//生成报文globalInfo
|
GlobalInfo globalInfo = CreatAndSendUtil.createGlobalInfo(interfaceCode, appId);
|
//生成数据签名
|
String dataSign = CreatAndSendUtil.createDataSign(globalInfo.toString(), dataBase64Str, appSecret);
|
//组装请求报文
|
JSONObject jsonObj = new JSONObject();
|
jsonObj.put("global_info", globalInfo);
|
jsonObj.put("data", dataBase64Str);
|
jsonObj.put("data_sign", dataSign);
|
String qqbw = JSONObject.toJSONString(jsonObj);
|
//System.out.println(qqbw);
|
//发送请求,数票通url见接口对接文档
|
String sptUrl = "https://csfw.jsaisino.com/csapp/invincomeservice";
|
String returnStr = "";
|
try {
|
returnStr = HttpUtil.post(sptUrl, qqbw);
|
} catch (Exception e) {
|
e.printStackTrace();
|
returnInfo.setReturn_code("9998");
|
returnInfo.setReturn_message("http接口请求异常:" + e.getMessage());
|
returnData.setReturn_info(returnInfo);
|
return returnData;
|
}
|
if (!Objects.equals(returnStr, "")){
|
//将调用返回的数据进行转换
|
JSONObject returnObj = JSONObject.parseObject(returnStr);
|
returnData = JSONObject.toJavaObject(returnObj, ReturnData.class);
|
return returnData;
|
}
|
return returnData;
|
}
|
|
/**
|
* 创建外层报文
|
* @param appId 企业标识 由江苏航信分配获取
|
* @param interfaceCode 接口代码 接口代码详见接口对接文档
|
* @return ReturnData
|
*/
|
public static GlobalInfo createGlobalInfo(String interfaceCode, String appId){
|
GlobalInfo globalInfo = new GlobalInfo();
|
globalInfo.setApplication_code("JXFW");
|
globalInfo.setInterface_code(interfaceCode);
|
//版本 目前为1.0
|
globalInfo.setVersion("1.0");
|
globalInfo.setApp_abbr("");
|
//企业标识 由江苏航信分配获取
|
globalInfo.setApp_id(appId);
|
//数据流水号 企业标识+日期(yyyyMMdd)+序列号
|
globalInfo.setData_id("");
|
return globalInfo;
|
}
|
|
/**
|
* 对报文进行加密,生成数据签名
|
* @param globalInfoStr 外层报文Json
|
* @param data 数据 业务接口请求报文的Base64编码
|
* @param appSecret 企业密钥 由江苏航信分配获取
|
* @return String
|
*/
|
public static String createDataSign(String globalInfoStr, String data, String appSecret){
|
String str = globalInfoStr + "\"data\":\"" + data + "\"," + "\"data_sign\":\"" + "\"" + "}";
|
byte[] byteKey = appSecret.getBytes(StandardCharsets.UTF_8);
|
SecretKeySpec secretKeySpec = new SecretKeySpec(byteKey, "HmacSHA512");
|
byte[] byteData = null;
|
try {
|
Mac mac = Mac.getInstance("HmacSHA512");
|
mac.init(secretKeySpec);
|
byteData = mac.doFinal(str.getBytes(StandardCharsets.UTF_8));
|
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
|
e.printStackTrace();
|
}
|
return Base64Utils.encodeToString(byteData);
|
}
|
}
|