加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java中实现http/post/xml发送数据报文

(2012-08-27 17:29:02)
标签:

it

分类: 工作

public class BestTvCore {
 
 private static Logger logger = Logger.getLogger(BestTvCore.class);
 //密钥
 private static String  key= "61F1544985191F32";

 public BestTvCore() {
  
 }

 public static void main(String[] args)  {
  Map<String, String> requestMap = new HashMap<String, String>();
  requestMap.put("cardnum1", "111111");
  requestMap.put("cardnum2","111111");
  Map<String, String> responseMap = new HashMap<String, String>();
  String respInfo = NoBankRecharge(requestMap,responseMap);
  System.out.println("respInfo= " + respInfo);
 }


 // 非银行卡充值
 public static String NoBankRecharge(Map<String, String> requestMap,
   Map<String, String> responseMap) { 
  String cardnum1=requestMap.get("cardnum1");
  String cardnum2=requestMap.get("cardnum2");
  //DES加密  充值卡卡号码的暗码
  byte[] encrypt = encrypt(StringUtils.hexStrToBytes(key),cardnum1.getBytes());
  String afterDes = StringUtils.bytesToHexStr(encrypt);
  String afterBase64 = Base64.encode(StringUtils.hexStrToBytes(afterDes));
  requestMap.put("cardnum1", afterBase64);
  //DES加密  充值卡卡密码的暗码
  byte[] encrypt1 = encrypt(StringUtils.hexStrToBytes(key),cardnum2.getBytes());
  String afterDes1 = StringUtils.bytesToHexStr(encrypt1);
  String afterBase64_1 = Base64.encode(StringUtils.hexStrToBytes(afterDes1));
  requestMap.put("cardnum2", afterBase64_1);
  String sendXml = sendXmlNoBankCardCreate(requestMap);
  if(StringUtils.isEmpty(sendXml)){
   logger.error("sendXml filed has error,please check your send xml info");
   return "sendXml filed has error,please check your send xml info";
  }
  String responStr = sendXmlReturnRespCode(sendXml);
  return compareReciveXml(responStr, responseMap);
 }

 //根据模版动态创建xml文件
 private static String sendXmlNoBankCardCreate(Map<String, String> requestMap) {

  String sendXml = "";
  try {
   String templateName = "config/BestTvTemplate.xml";
   String temStr = loadTemplateToMemoryStr(templateName);
   sendXml = transTemplateStrSendMsg(temStr, requestMap);
   System.out.println("完整报文=" + sendXml);
   sendXml = Base64.encode(sendXml.getBytes());
   String xmlLen = String.valueOf(sendXml.length());
   while (xmlLen.length() < 5) {
    xmlLen = "0" + xmlLen;
   }
   sendXml = xmlLen + sendXml;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return sendXml;

 }
 //向服务器发送报文并得到响应结果
 private static String sendXmlReturnRespCode(String sendXml) {
  String url = "http://192.168.17.115:9084/bestv/trans/";
  String returnXml = "";
  try {
   logger.debug("sendXml is ==[" + sendXml + "]");

   // 发送报文
   URL sendUrl = new URL(url.trim());
   URLConnection connection = sendUrl.openConnection();
   
   connection.setConnectTimeout(30000);
   connection.setReadTimeout(30000);
   connection.setDoOutput(true);
   
   OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
   out.write(sendXml);

   out.flush();
   out.close();
   
   // 一旦发送成功,用以下方法就可以得到服务器的回应:
   String sCurrentLine;
   String sTotalString;
   sCurrentLine = "";
   sTotalString = "";
   InputStream l_urlStream = connection.getInputStream();

   InputStreamReader isr = new InputStreamReader(l_urlStream,
     Constants.ENCODING);
   BufferedReader l_reader = new BufferedReader(isr);
   while ((sCurrentLine = l_reader.readLine()) != null) {
    sTotalString += sCurrentLine + "\r\n";
   }
   System.out.println("sTotalString="+sTotalString);
   if (sTotalString.length() > 0) {
    returnXml = new String(Base64Decoder.decode(sTotalString
      .substring(4)));
   }
  } catch (Exception ex) {
   logger.error("ErrorInfo is ==[" + ex.getMessage() + "]");
   ex.printStackTrace();
  }
  logger.debug("response =====================================================");
  logger.debug("");
  logger.debug("responseXml is ==[" + returnXml + "]");
  String respCode = XmlParserUtils.fetchValueByNodename(returnXml,
    "Resp.respCode");
  if ("00".equals(respCode) == false) {
   logger.error("发送报文错误");
  }
  System.out.println("returnXml =" + returnXml);
  System.out.println("respCode =" + respCode);
  return returnXml;
 }

 //比对响应报文以及响应map中对应字段的值
 private static String compareReciveXml(String responXml,
   Map<String, String> respMap) {
  String result = "报文格式错误";
  if (!"00".equals(XmlParserUtils.fetchValueByNodename(responXml,
    "Resp.respCode")))
   return result;
  StringBuilder sb = new StringBuilder();
  for (String str : respMap.keySet()) {
   String keyValue = respMap.get(str);
   String reciveValue = XmlParserUtils.fetchValueByNodename(responXml,
     str);
   if (keyValue.equals(reciveValue))
    continue;
   sb.append(str + ":(" + keyValue + "," + reciveValue + ");<br>");
  }
  if (StringUtils.isEmpty(sb.toString())) {
   result = "OK";
  } else {
   result = "Error:<br>" + sb.toString();
  }
  return result;
 }

 private static String transTemplateStrSendMsg(String templateStr,
   Map<String, String> requestMap) {
  Set<String> keySet = requestMap.keySet();
  for (String key : keySet) {
   String keyValue = requestMap.get(key);
   String templateKeyValue = XmlParserUtils.fetchValueByNodename(
     templateStr, key);
   if (key.contains(".")) {
    templateStr = changeNodeText(key, templateStr, keyValue);
   } else {
    if (templateStr.contains(key)) {
     templateStr = templateStr.replace("<" + key + ">"
       + templateKeyValue + "</" + key + ">", "<" + key
       + ">" + keyValue + "</" + key + ">");
    }
   }
  }
  return templateStr;
 }

 private static String changeNodeText(String nodeTexts, String templateStr,
   String secondValue) {
  String[] nodeStr = nodeTexts.split("\\.");

  String firstNode = StringUtils.substringBetween(templateStr, "<"
    + nodeStr[0] + ">", "</" + nodeStr[0] + ">");
  String firstOldStr = "<" + nodeStr[0] + ">" + firstNode + "</"
    + nodeStr[0] + ">";
  String secondNode = StringUtils.substringBetween(firstNode, "<"
    + nodeStr[1] + ">", "</" + nodeStr[1] + ">");
  String secondOldStr = "<" + nodeStr[1] + ">" + secondNode + "</"
    + nodeStr[1] + ">";
  String secondNodeValue = "<" + nodeStr[1] + ">" + secondValue + "</"
    + nodeStr[1] + ">";
  String newFirstStr = firstOldStr.replace(secondOldStr, secondNodeValue);
  return templateStr.replace(firstOldStr, newFirstStr);
 }

 private static String loadTemplateToMemoryStr(String templateName) {
  StringBuilder sb = new StringBuilder();
  try {
   URL resourceURL = Thread.currentThread().getContextClassLoader()
     .getResource(templateName);
   String filePath = resourceURL.getFile();
   FileInputStream fr = new FileInputStream(filePath);
   InputStreamReader is = new InputStreamReader(fr, "UTF-8");
   BufferedReader bfr = new BufferedReader(is);
   while (bfr.ready()) {
    sb.append(bfr.readLine().trim());
   }
   bfr.close();
   fr.close();
  } catch (Exception e) {
   logger.error("获取模板错误:" + e.getMessage());
   e.printStackTrace();
  }
  return sb.toString();
 }

 
 
 public static  byte[] encrypt(byte[] keyBytes,byte[] src) {
  try {
   //生成密钥
   SecretKey deskey = new SecretKeySpec(keyBytes, "DES");
   //加密
   Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");
   c1.init(Cipher.ENCRYPT_MODE, deskey);
   return c1.doFinal(src);
  } catch (java.security.NoSuchAlgorithmException e1) {
   e1.printStackTrace();
  } catch (javax.crypto.NoSuchPaddingException e2) {
   e2.printStackTrace();
  } catch (java.lang.Exception e3) {
   e3.printStackTrace();
  }
  return null;
 }
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有