问题:本系统为代发薪平台,请求行内短信平台,报文发送接收编码均为GBK,发送接收报文均成功,但短信平台显示发出的短信中文为乱码。
分析过程:
可能原因1:短信平台做了加密处理,不明文展示短信内容。经与短信平台沟通,未做加密处理,此项排除
可能原因2:本地报文未转码。经排查,报文发送时其中中文内容确实未经转GBK,遂转GBK,方法如下:
String resourceStr = "您的注册验证码为663523";
String trans = new String(resourceStr.getBytes(Charset.forname("utf-8"),"GBK");
经转码处理后发现短信平台展示中文依旧为乱码。问题开始变得复杂起来。
经仔细排查本地系统报文发送代码,发现最终消息发送时,使用了socket,在最后send时,将已经打包好的报文package换成了utf-8数组,源代码为socket.send(package.getBytes("utf-8"));
遂将此处utf-8替换为"GBK",再次尝试发送服务。服务发送结果成功,但却又出现了报文接收超时。
遂陷入自我怀疑,难道不是这样改的,又苦苦思索,中间走了好多弯路。
后在项目经理启示下,注意到计算出来的前八位报文头长度,与打包好的报文实际长度不符,怀疑是长度不符导致短信平台解析超时,于是排查代码,发现计算八位报文长度时,是在utf-8编码下计算的报文长度,而发送过去的报文却是八位报文头+转GBK后的报文,导致短信平台根据八位报文长度解析报文时发生超时异常。至此,问题终于解决,记录一下,以备不时之需。