工行银企互联非NC模式

#工行银企互联非NC模式

##请求工行接口
public static String send4(String t_cdoe, String data,Enterprise3 e,ICBC3 i,String PackageID,int type) throws Exception {
org.apache.http.client.HttpClient hc = new org.apache.http.impl.client.DefaultHttpClient();
List nvps = new ArrayList<>();
//请根据实际修改上送包xml数据,POST请求没有长度限制,get请求太长会报错,根据实际情况,一般的数据传送会要求进行签名、BASE64编码或者压缩等机制进行传输
String url = “https://”+i.getIp()+":"+i.getPort();
//加载证书
java.security.KeyStore trustStore = java.security.KeyStore.getInstance(java.security.KeyStore.getDefaultType());
//"123456"为制作证书时的密码
//trustStore.load(new FileInputStream(new File(i.getTruststore())), e.getStorepass().toCharArray());
trustStore.load(new FileInputStream(new File(i.getTruststore())), null);
org.apache.http.conn.ssl.SSLSocketFactory socketFactory = new org.apache.http.conn.ssl.SSLSocketFactory(trustStore);
//不校验域名
socketFactory.setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
//这个8446是和被访问端约定的端口,一般为443
org.apache.http.conn.scheme.Scheme sch = new org.apache.http.conn.scheme.Scheme(“https”, socketFactory, Integer.parseInt(i.getPort()));
hc.getConnectionManager().getSchemeRegistry().register(sch);
org.apache.http.client.methods.HttpPost hr = new org.apache.http.client.methods.HttpPost(url);
String version = “0.0.1.0”;
String bank_code = e.getBankcode();
String group_code = e.getCis();
String tran_code = t_cdoe;
String id = e.getId();//请根据实际修改证书名称
byte[] certificate = null;
try{
FileInputStream fii = new FileInputStream(new File(e.getCerfile()));
certificate = new byte[fii.available()];
fii.read(certificate);
fii.close();
}catch (IOException e4){
log.error(“无法读取配置企业数据层公钥文件”);
return null;
}
String Cert = new BASE64Encoder().encode(certificate);
nvps.add(new BasicNameValuePair(“Version”, version));
nvps.add(new BasicNameValuePair(“TransCode”, tran_code));
nvps.add(new BasicNameValuePair(“BankCode”, bank_code));
nvps.add(new BasicNameValuePair(“GroupCIS”, group_code));
nvps.add(new BasicNameValuePair(“ID”, id));
nvps.add(new BasicNameValuePair(“PackageID”, PackageID));
nvps.add(new BasicNameValuePair(“Cert”, Cert));
String reqData = null;
if (type == 1){
reqData = SignVerify.getSendData3(data,e);
}else {
reqData = new BASE64Encoder().encode(data.getBytes(“GBK”));
}
nvps.add(new BasicNameValuePair(“reqData”, reqData));
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nvps,“GBK”);
hr.setEntity(urlEncodedFormEntity);
hr.setHeader(“Content-Type”, “application/x-www-form-urlencoded;charset=GBK”);
org.apache.http.HttpResponse hres = hc.execute(hr);
org.apache.http.HttpEntity entity = hres.getEntity();
int re_code = hres.getStatusLine().getStatusCode();
if (re_code == 200) {
String repMsg = org.apache.http.util.EntityUtils.toString(entity,“GBK”);
//首先做整字段解码
String postbody = getstrFromBASE64(repMsg);
log.info(“已接收{}返回信息:{}”,t_cdoe,postbody);
return postbody;
}
return null;
}

public static String getstrFromBASE64(String s) {
    if (s == null){
        return null;
    }
    BASE64Decoder decoder = new BASE64Decoder();
    try {
        return newString(decoder.decodeBuffer(s),"GBK");
    } catch (Exception e) {
        return null;
    }
}

@Data
@ConfigurationProperties(prefix = "icbc.paras.enterprise")
@Component
public class Enterprise3 {
	private String name;

	private String bankcode ;

	private String cis;

	private String port;

	private String store;

	private String storepass;

	private String cerfile;

	private String key;

	private String keypass;

	private String id;
}

@Data
@ConfigurationProperties(prefix = "icbc.paras.ICBC")
@Component
public class ICBC3 {

	private String ip;

	private String port;

	private String truststore;
}

@Slf4j
public class SignVerify {
    public static String getSendData3(String body,Enterprise3 e){
        String signStr = String.valueOf(body.length());
        String lenStr = signStr;
        for (int i = 0; i < 10 - signStr.length(); i++) {
            lenStr = "0" + lenStr;
        }
        //签名
        byte[] data = new byte[0];
        try {
            data = body.getBytes("GBK");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        String ICBCPrivateKeyFilePath =e.getKey();
        java.io.FileInputStream sin = null;
        byte[] key = null;
        try {
            sin = new java.io.FileInputStream(ICBCPrivateKeyFilePath);
            key = new byte[sin.available()];
            sin.read(key);
        } catch (java.io.IOException e1) {
            e1.printStackTrace();
            log.error("无法读取企业数据层私钥文件");
            return null;
        }
        byte[] signature = new byte[0];
        try {
            signature = sign(data, data.length, key, e.getKeypass().toCharArray());
            if (signature == null){
                log.error("签名异常,返回结果为空");
            }
        } catch (Exception e1) {
            e1.printStackTrace();
            log.error("签名异常");
        }
        BASE64Encoder enc = new BASE64Encoder();
        //对签名得到的数据进行base64编码
        String fileValue = enc.encode(signature);
        //拼串
        String tmptt = (lenStr+ body+ "ICBCCMP"+ fileValue);//企业.key
        //base64编码
        String tmptt64 = null;
        try {
            tmptt64 = enc.encode(tmptt.getBytes("GBK"));
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        return tmptt64;
    }
    
    public static byte[] sign(byte[] src, int srcLen, byte[] privateKey, char[] keyPass) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException {
        byte[] signedResult = (byte[])null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1", "INFOSEC");
            byte[] hash = md.digest(src);
            signedResult = privateEncryptPwd(hash, privateKey, keyPass);
        } catch (Exception var7) {
            var7.printStackTrace();
            signedResult = (byte[])null;
        }
        return signedResult;
    }
    
    public static byte[] privateEncryptPwd(byte[] src, byte[] privateKey, char[] keyPass) throws NoSuchAlgorithmException, NoSuchProviderException, IOException, InvalidKeySpecException {
        byte[] result = (byte[])null;    
        try {
            byte[] temp = new byte[privateKey.length - 2];
            System.arraycopy(privateKey, 2, temp, 0, temp.length);
            CEA cea = new CEA();
            byte[] pass = (new String(keyPass)).getBytes();
            byte[] priKey = new byte[temp.length];
            int rv = cea.Decrypt(temp, priKey, temp.length, pass, pass.length);
            if(rv != 0) {
                return null;
            } else {
                result = privateEncrypt(src, priKey);
                return result;
            }
        } catch (Exception var9) {
            var9.printStackTrace();
            return null;
        }
    }
    
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值