#工行银企互联非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;
}
}
}