说白了就是发送个字符串给一个地址
这个字符串有一定的要求,然后返回一个字符串,里面有你所需要的数据
按两方协商好的规则解密啥的就完了
第一步 按规则生成字符串,
try{
//生成 socket 数据包
String SchoolFlag = entiy.getSchoolFlag();
// String SchoolFlag = ReadProperties.getUrlValue("SchoolFlag");
String sendStrs = "";//发送的数据包
SimpleDateFormat NowDates1 = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date();
String DateStr = NowDates1.format(date);//请求时间
String check = ReadProperties.getUrlValue("check");
String verify = ReadProperties.getUrlValue("TS_FEES_SEARCH");//功能号
sendStrs += Processing.getStrVlaue(SchoolFlag,18);//学校ID
sendStrs += Processing.getStrVlaue(entiy.getStudentId(),18);//学生账号/学号/手机号
sendStrs += Processing.getStrVlaue(entiy.getStudentName(),18);//学生姓名
sendStrs += Processing.getStrVlaue("",16);//密码
sendStrs += Processing.getStrVlaue(entiy.getFsSerialno(),32);//缴费编号
sendStrs += Processing.getStrVlaue(DateStr,14);//请求时间
//需要加签的str
String SignStr = Processing.getStrVlaue(SchoolFlag,18)
+ Processing.getStrVlaue(entiy.getStudentId(),18)
+Processing.getStrVlaue("",16)
+ Processing.getStrVlaue(entiy.getFsSerialno(),32)
+ Processing.getStrVlaue(DateStr,14);
String Sign = Processing.md5(SignStr + check);
int SendLens = Processing.getStrLen(sendStrs) + 42;//包长度
Object sss = request.getServletContext().getAttribute("queryStuSerial");
int intS = Integer.parseInt(String.valueOf(sss))+1;
String serial = Processing.getIntVlaue(intS, 4);
serial = serial.substring(serial.length()-4);
request.getServletContext().setAttribute("queryStuSerial",serial);
String packages = Processing.getIntVlaue(SendLens,4) + verify + serial;// 包头
sendStrs = packages + sendStrs + Sign;
// System.out.println("SendStr:"+sendStrs);
log2.info("SendStr:"+sendStrs);
//发送socket并接收数据
String replyInfo = SendSocketUtis.SendMessage(sendStrs);
第二步
发送socket
/**
* 发送socket数据
* */
public static String SendMessage(String SendValue){
String ReceiveData = "";
byte[] res = null;
Socket socket = null;
InputStream is = null;
OutputStream os = null;
log2.info("IP_ADDR:"+IP_ADDR);
log2.info("PORT:"+PORT);
try {
//发送数据
socket = new Socket(IP_ADDR, PORT);
os = socket.getOutputStream();
os.write(SendValue.getBytes("GBK"));
os.flush();
//接收数据
is = socket.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count = 0;
do {
count = is.read(buffer);
bos.write(buffer, 0, count);
} while (is.available() != 0);
res = bos.toByteArray();
ReceiveData = new String(res,"ISO-8859-1");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (socket != null)
socket.close();
} catch (Exception e) {
}
}
return ReceiveData;
}
}
第三步
解析返回的数据包,按一定规则
public static PayDO TransVerific(String Vlaue) {
PayDO model = new PayDO();
model.setState(Integer.parseInt("1"));
model.setResult_str("查询缴费信息错误!");
try {
String lenStr = Vlaue.substring(0, 4);//包长度
String VERIFY = Vlaue.substring(4, 6);//功能号
String serial = Vlaue.substring(6, 10);//序列号
String valid_flag = Vlaue.substring(10, 11);//学生卡是否有效
String AccountID = Vlaue.substring(11, 23);//一卡通账号
String CreateTime = Vlaue.substring(23, 40);//开户时间
String Stu_Name = Vlaue.substring(40, 100);//学生姓名
byte[] b = Stu_Name.getBytes("ISO-8859-1");//用tomcat的格式(iso-8859-1)方式去读。
Stu_Name = new String(b, "GBK");//采用utf-8去接string
String Stu_Class = Vlaue.substring(100, 130);//班级
byte[] b1 = Stu_Class.getBytes("ISO-8859-1");//用tomcat的格式(iso-8859-1)方式去读。
Stu_Class = new String(b1, "GBK");//采用utf-8去接string
String Stu_StudyID = Vlaue.substring(130, 150);//学号
String payMoney = Vlaue.substring(150, 160);//应缴金额
String Sign = Vlaue.substring(160);//签名
model.setState(1);
model.setResult_str("失败,命令码:" + valid_flag);
//需要加签的str
String SignStr = Processing.getIntVlaue(Integer.parseInt(valid_flag), 1)
+ Processing.getIntVlaue(Integer.parseInt(AccountID), 12)
+ Processing.getStrVlaue(CreateTime, 17);
if (checkSign(model, Sign, SignStr)) return model;//验签
Object serialO = request.getServletContext().getAttribute("queryStuSerial");
if (!serial.equals(serialO)) {
model.setState(1);
model.setResult_str("序列号错误!");
return model;
} else if (!VERIFY.equals("36")) {
model.setState(1);
model.setResult_str("命令码错误!");
return model;
} else if (valid_flag.equals("1")) {
model.setState(1);
model.setResult_str("账号无对应信息!");
return model;
} else if (valid_flag.equals("2")) {
model.setState(1);
model.setResult_str("账号重复!");
return model;
} else if (valid_flag.equals("3")) {
model.setState(1);
model.setResult_str("账号姓名不符!");
return model;
} else if (valid_flag.equals("4")) {
model.setState(1);
model.setResult_str("连接一卡通服务失败!");
return model;
} else if (valid_flag.equals("5")) {
model.setState(1);
model.setResult_str("账户状态异常!");
return model;
} else if (valid_flag.equals("6")) {
model.setState(1);
model.setResult_str("其它错误!");
return model;
}
model.setState(0);
model.setResult_str("查询缴费信息成功!");
model.setCreateTime(CreateTime);
model.setStudentName(Stu_Name.trim());
model.setClassification(Stu_Class.trim());
model.setStudentId(Stu_StudyID.trim());
model.setPayMoney((double) (Integer.parseInt(payMoney) / 100));
} catch (Exception ex) {
ex.printStackTrace();
}
return model;
}
下边是其中的验签方法
/**
* 验签方法
*
* @param model
* @param sign
* @param signStr
* @return
*/
private static boolean checkSign(PayDO model, String sign, String signStr) {
String check = com.yhk.weixin.utils.socket.ReadProperties.getUrlValue("check");
String Sign1 = Processing.md5(signStr + check);
//验签
if (!Sign1.equals(sign)) {
model.setState(1);
model.setResult_str("签名不一致!");
return true;
}
return false;
}