打包后调用出错(乱码问题)

This commit is contained in:
王志成 2025-02-25 11:32:36 +08:00
parent aec28f662a
commit 787892924b
3 changed files with 102 additions and 17 deletions

View File

@ -40,7 +40,9 @@ public class ThirdServiceUtil {
*/
public <T> T callDevice(LexMarkDTO lexMarkDTO, Class<T> responseType) {
try {
URL url = new URL(lexMarkServiceIp + ":" + lexMarkServicePort + "/CallDevice");
String urlStr = lexMarkServiceIp + ":" + lexMarkServicePort + "/CallDevice";
URL url = new URL(urlStr);
log.info("开始请求利盟服务URL: {}, 请求体: {}", urlStr, JSON.toJSONString(lexMarkDTO));
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
@ -52,23 +54,28 @@ public class ThirdServiceUtil {
wr.write(input, 0, input.length);
}
int responseCode = connection.getResponseCode();
log.info("利盟服务响应码: {}", responseCode);
if (responseCode != HttpURLConnection.HTTP_OK) {
throw new RRException("利盟服务请求失败,响应码:" + responseCode);
}
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
// 指定编码为 UTF-8
try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
String responseStr = response.toString();
log.info("利盟服务响应内容: {}", responseStr);
// 将响应 JSON 字符串转换为泛型对象
T result = JSON.parseObject(responseStr, responseType);
if (result instanceof LexMarkResultVO && ((LexMarkResultVO) result).getResult() != 0) {
throw new RRException(result.toString());
}
return result;
}
in.close();
// 将响应 JSON 字符串转换为泛型对象
T result = JSON.parseObject(response.toString(), responseType);
if (result instanceof LexMarkResultVO && ((LexMarkResultVO) result).getResult() != 0) {
throw new RRException(result.toString());
}
return result;
} catch (Exception e) {
log.error("利盟服务请求发生异常", e);
if (e instanceof RRException) {
throw new RRException(((RRException) e).getCode(), e.getMessage());
}

View File

@ -38,7 +38,10 @@ public class KeypadServiceImpl implements KeypadService {
*/
@Override
public Result inputData() {
log.info("开始执行密码输入流程");
// 连接数字键盘
log.info("准备连接数字键盘设备");
LexMarkDTO connect = new LexMarkDTO();
connect.setDevName(LexMarkConst.ENCRYPTOR);
connect.setActionName(MiddlewareFunctionsConst.OPEN_CONNECTION);
@ -47,11 +50,15 @@ public class KeypadServiceImpl implements KeypadService {
connectParam.put("TimeOut", 90000);
connectParam.put("ServiceName", LexMarkConst.ENCRYPTOR);
connect.setParam(connectParam.toJSONString());
log.info("调用设备连接方法,参数: {}", connect);
IDCardReadResultVO connectResult = thirdServiceUtil.callDevice(connect, IDCardReadResultVO.class);
log.info("设备连接结果: {}", connectResult);
WebSocketClient webSocketClient = null;
try {
if (connectResult.getResult() == 0) {
log.info("数字键盘设备连接成功,准备进行明文输入");
// 明文输入
LexMarkDTO plaintext = new LexMarkDTO();
plaintext.setDevName(LexMarkConst.ENCRYPTOR);
@ -70,43 +77,58 @@ public class KeypadServiceImpl implements KeypadService {
plaintextParam.put("ActiveKeys", 81919);
plaintextParam.put("TerminateKeys", 1024);
plaintext.setParam(plaintextParam.toJSONString());
log.info("调用明文输入方法,参数: {}", plaintext);
// 创建 WebSocket 客户端
log.info("创建 WebSocket 客户端,连接地址: ws://127.0.0.1:12347");
webSocketClient = new WebSocketClient("ws://127.0.0.1:12347");
IDCardReadResultVO plaintextResult = thirdServiceUtil.callDevice(plaintext, IDCardReadResultVO.class);
log.info("明文输入操作结果: {}", plaintextResult);
if (plaintextResult.getResult() == 0) {
log.info("明文输入成功,开始等待确认");
try {
// 适当延长等待时间
while (true) {
TimeUnit.SECONDS.sleep(1);
Boolean confirm = webSocketClient.getConfirm();
if (confirm) {
log.info("收到确认信息,结束等待");
break;
}
}
} catch (InterruptedException e) {
log.error("等待确认信息时被中断", e);
e.printStackTrace();
}
String password = webSocketClient.getPassword();
log.info("密码输入完成,密码为: {}", password);
return Result.ok("密码输入完成!", password);
} else {
log.error("密码输入异常!详情:{}", connectResult.getDesc());
return Result.error("密码输入异常!详情:" + connectResult.getDesc());
}
} else {
log.error("数字键盘设备连接失败!详情:{}", connectResult.getDesc());
return Result.error("数字键盘设备连接失败!详情:" + connectResult.getDesc());
}
} finally {
if (webSocketClient != null) {
log.info("关闭 WebSocket 客户端");
webSocketClient.close();
}
// 关闭身份证读卡设备
log.info("准备关闭数字键盘设备");
LexMarkDTO close = new LexMarkDTO();
close.setDevName(LexMarkConst.ENCRYPTOR);
close.setCallID(0);
close.setActionName(MiddlewareFunctionsConst.CLOSE_CONNECTION);
log.info("调用设备关闭方法,参数: {}", close);
IDCardReadResultVO closeResult = thirdServiceUtil.callDevice(close, IDCardReadResultVO.class);
log.info("设备关闭结果: {}", closeResult);
if (closeResult.getResult() != 0) {
log.info("数字键盘设备关闭异常!");
log.error("数字键盘设备关闭异常!");
}
}
}

View File

@ -46,7 +46,9 @@ public class ReadCardServiceImpl implements ReadCardService {
@Override
public Result IDCardReader() {
Result result = null;
log.info("开始执行身份证读取流程");
try {
log.info("准备连接非接身份证读卡模块");
// 连接非接身份证读卡模块
LexMarkDTO connect = new LexMarkDTO();
connect.setActionName(MiddlewareFunctionsConst.OPEN_CONNECTION);
@ -56,8 +58,11 @@ public class ReadCardServiceImpl implements ReadCardService {
connectParam.put("TimeOut", 30000);
connectParam.put("ServiceName", LexMarkConst.ID_CARD_READ);
connect.setParam(connectParam.toJSONString());
log.info("调用设备连接方法,参数: {}", connect);
IDCardReadResultVO connectResult = thirdServiceUtil.callDevice(connect, IDCardReadResultVO.class);
log.info("设备连接结果: {}", connectResult);
if (connectResult.getResult() == 0) {
log.info("设备连接成功,准备读取身份证");
// 身份证读取
LexMarkDTO read = new LexMarkDTO();
read.setActionName(MiddlewareFunctionsConst.ACCEPT_AND_READ_TRACKS);
@ -67,10 +72,14 @@ public class ReadCardServiceImpl implements ReadCardService {
readParam.put("TimeOut", 0);
readParam.put("TrackMap", 776);
read.setParam(readParam.toJSONString());
log.info("调用设备读取方法,参数: {}", read);
IDCardReadResultVO readResult = thirdServiceUtil.callDevice(read, IDCardReadResultVO.class);
log.info("设备读取结果: {}", readResult);
if (readResult.getResult() == 0) {
log.info("身份证读取成功,开始解析身份证信息");
IDCardReadResultVO.Param resultParam = JSON.parseObject(readResult.getParam().toString(), IDCardReadResultVO.Param.class);
if (resultParam.getResult() == 0) {
log.info("身份证信息解析成功,开始封装用户信息");
UserInfoVO userInfoVO = new UserInfoVO();
// 身份证基本信息 解析
String[] array = Stream.of(resultParam.getChipdata().getDatas().split("\\|"))
@ -92,26 +101,34 @@ public class ReadCardServiceImpl implements ReadCardService {
// 反面
userInfoVO.setBackimage(resultParam.getBackimage().getDatas());
result = Result.ok(userInfoVO);
log.info("用户信息封装成功,返回结果: {}", result);
} else {
result = Result.error("身份证读取失败!");
log.error("身份证信息解析失败,返回结果: {}", result);
}
} else {
result = Result.error(readResult.getDesc());
log.error("身份证读取失败,错误信息: {}, 返回结果: {}", readResult.getDesc(), result);
}
} else {
result = Result.error(connectResult.getDesc());
log.error("设备连接失败,错误信息: {}, 返回结果: {}", connectResult.getDesc(), result);
}
} finally {
log.info("准备关闭身份证读卡设备");
// 关闭身份证读卡设备
LexMarkDTO close = new LexMarkDTO();
close.setDevName(LexMarkConst.ID_CARD_READ);
close.setCallID(0);
close.setActionName(MiddlewareFunctionsConst.CLOSE_CONNECTION);
log.info("调用设备关闭方法,参数: {}", close);
IDCardReadResultVO closeResult = thirdServiceUtil.callDevice(close, IDCardReadResultVO.class);
log.info("设备关闭结果: {}", closeResult);
if (closeResult.getResult() != 0) {
log.info("身份证读卡设备关闭异常!");
log.error("身份证读卡设备关闭异常!");
}
}
log.info("身份证读取流程结束,最终返回结果: {}", result);
return result;
}
@ -128,7 +145,10 @@ public class ReadCardServiceImpl implements ReadCardService {
@Override
public Result SocialSecurityCardReader() {
log.info("开始执行社保卡读取流程");
// 社保卡读卡设备连接
log.info("准备连接社保卡读卡设备");
LexMarkDTO connect = new LexMarkDTO();
connect.setActionName(MiddlewareFunctionsConst.OPEN_CONNECTION);
connect.setCallID(19256);
@ -137,9 +157,14 @@ public class ReadCardServiceImpl implements ReadCardService {
connectParam.put("TimeOut", 30000);
connectParam.put("ServiceName", LexMarkConst.CARD_READER);
connect.setParam(connectParam.toJSONString());
log.info("调用设备连接方法,参数: {}", connect);
IDCardReadResultVO connectResult = thirdServiceUtil.callDevice(connect, IDCardReadResultVO.class);
log.info("设备连接结果: {}", connectResult);
if (connectResult.getResult() == 0) {
log.info("社保卡读卡设备连接成功,准备进卡");
// 进卡
log.info("准备执行进卡操作");
LexMarkDTO enterTheCard = new LexMarkDTO();
enterTheCard.setActionName(MiddlewareFunctionsConst.ACCEPT_AND_READ_TRACKS);
enterTheCard.setCallID(19256);
@ -149,9 +174,14 @@ public class ReadCardServiceImpl implements ReadCardService {
enterTheCardParam.put("TrackMap", 11);
enterTheCardParam.put("TimeOut", 0);
enterTheCard.setParam(enterTheCardParam.toJSONString());
log.info("调用进卡方法,参数: {}", enterTheCard);
IDCardReadResultVO enterTheCardResult = thirdServiceUtil.callDevice(enterTheCard, IDCardReadResultVO.class);
log.info("进卡操作结果: {}", enterTheCardResult);
if (enterTheCardResult.getResult() == 0) {
log.info("进卡操作成功,准备上电");
// 上电
log.info("准备执行上电操作");
LexMarkDTO powerOn = new LexMarkDTO();
powerOn.setActionName(MiddlewareFunctionsConst.CHIPPOWER);
powerOn.setCallID(19256);
@ -160,9 +190,14 @@ public class ReadCardServiceImpl implements ReadCardService {
powerOnParam.put("PsamNo", 1);
powerOnParam.put("ChipAction", 2);
powerOn.setParam(powerOnParam.toJSONString());
log.info("调用上电方法,参数: {}", powerOn);
IDCardReadResultVO powerOnResult = thirdServiceUtil.callDevice(powerOn, IDCardReadResultVO.class);
log.info("上电操作结果: {}", powerOnResult);
if (powerOnResult.getResult() == 0) {
log.info("上电操作成功,准备读取社保卡信息");
// 社保卡信息读取
log.info("准备读取社保卡信息");
LexMarkDTO socialSecurityCardReader = new LexMarkDTO();
socialSecurityCardReader.setActionName(MiddlewareFunctionsConst.I_READ_CARD_BAS);
socialSecurityCardReader.setCallID(19256);
@ -170,8 +205,12 @@ public class ReadCardServiceImpl implements ReadCardService {
JSONObject socialSecurityCardReaderParam = new JSONObject();
socialSecurityCardReaderParam.put("iType", 3);
socialSecurityCardReader.setParam(socialSecurityCardReaderParam.toJSONString());
log.info("调用读取社保卡信息方法,参数: {}", socialSecurityCardReader);
IDCardReadResultVO socialSecurityCardReaderResult = thirdServiceUtil.callDevice(socialSecurityCardReader, IDCardReadResultVO.class);
log.info("读取社保卡信息结果: {}", socialSecurityCardReaderResult);
if (socialSecurityCardReaderResult.getResult() == 0) {
log.info("社保卡信息读取成功,开始解析信息");
// 社保信息
IDCardReadResultVO.SocialSecurityCard resultParam = JSON.parseObject(socialSecurityCardReaderResult.getParam().toString(), IDCardReadResultVO.SocialSecurityCard.class);
String[] split = resultParam.getRerurnData().split("\\|");
@ -188,17 +227,22 @@ public class ReadCardServiceImpl implements ReadCardService {
socialSecurityCardInfoVO.setExpireDate(split[8]);
socialSecurityCardInfoVO.setTerminalNumber(split[9]);
socialSecurityCardInfoVO.setTerminalDeviceNumber(split[10]);
log.info("社保卡信息解析完成,返回成功结果");
return Result.ok(socialSecurityCardInfoVO);
} else {
log.error("社保卡信息读取失败,详情:{}", socialSecurityCardReaderResult.getDesc());
return Result.error("社保卡信息读取失败!详情:" + socialSecurityCardReaderResult.getDesc());
}
} else {
log.error("社保卡读取设备上电失败,详情:{}", powerOnResult.getDesc());
return Result.error("社保卡读取设备上电失败!详情:" + powerOnResult.getDesc());
}
} else {
log.error("社保卡读取设备进卡失败,详情:{}", enterTheCardResult.getDesc());
return Result.error("社保卡读取设备进卡失败!详情:" + enterTheCardResult.getDesc());
}
} else {
log.error("社保卡读取设备连接失败,详情:{}", connectResult.getDesc());
return Result.error("社保卡读取设备连接失败!详情:" + connectResult.getDesc());
}
}
@ -210,7 +254,10 @@ public class ReadCardServiceImpl implements ReadCardService {
*/
@Override
public Result cardRefund() {
log.info("开始执行社保卡退卡流程");
// 社保卡退卡
log.info("准备发起社保卡退卡请求");
LexMarkDTO cardRefund = new LexMarkDTO();
cardRefund.setDevName(LexMarkConst.CARD_READER);
cardRefund.setCallID(19256);
@ -219,21 +266,30 @@ public class ReadCardServiceImpl implements ReadCardService {
cardRefundParam.put("position", 1);
cardRefundParam.put("ejectpos", 1);
cardRefund.setParam(cardRefundParam.toJSONString());
log.info("调用设备退卡方法,参数: {}", cardRefund);
IDCardReadResultVO cardRefundResult = thirdServiceUtil.callDevice(cardRefund, IDCardReadResultVO.class);
log.info("设备退卡操作结果: {}", cardRefundResult);
if (cardRefundResult.getResult() == 0) {
log.info("社保卡退卡成功,准备关闭社保卡读卡设备");
// 退卡成功再关闭社保卡读卡设备
LexMarkDTO close = new LexMarkDTO();
close.setDevName(LexMarkConst.CARD_READER);
close.setCallID(0);
close.setActionName(MiddlewareFunctionsConst.CLOSE_CONNECTION);
log.info("调用设备关闭方法,参数: {}", close);
IDCardReadResultVO closeResult = thirdServiceUtil.callDevice(close, IDCardReadResultVO.class);
log.info("设备关闭操作结果: {}", closeResult);
if (closeResult.getResult() != 0) {
log.info("社保卡读卡设备关闭异常!");
log.error("社保卡读卡设备关闭异常!");
}
log.info("社保卡退卡流程完成,退卡成功");
return Result.ok("退卡成功!");
} else {
log.error("退卡失败!请联系工作人员!");
return Result.error("退卡失败!请联系工作人员!");
}
}
}