luodangjia
2024-05-30 a3990d3644885c51f4ea0fc7a27c1097f4808bfb
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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);
    }
}