ac7eecfd9220b07cb33ef0d455cbf0653c651c17.svn-base 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. package xin.glue.cargocnHttpClient;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.PrintStream;
  4. import java.sql.ResultSet;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.HashSet;
  11. import java.util.Map;
  12. import java.util.Set;
  13. import org.apache.commons.lang.StringUtils;
  14. import CoreFS.SA01.CoreIComponent;
  15. import CoreFS.SA06.CoreReturnObject;
  16. import UIB.COM.XmlSqlParsersFactory;
  17. import com.alibaba.fastjson.JSON;
  18. import com.alibaba.fastjson.JSONObject;
  19. /**
  20. * 货运中国--远程调用物流跟踪平台接口上传数据类
  21. *
  22. * @author KangMiao
  23. * @Date 2015-4-13 下午03:25:53
  24. *
  25. */
  26. public class WayBillClient extends CoreIComponent {
  27. /**
  28. * 远程测试用的地址http://dev.cargocn.net/cargocn/ws/uploadWayBill.do
  29. */
  30. private static String testUrl = "http://dev.cargocn.net/cargocn/ws/uploadWayBill.do";
  31. /**
  32. * 正式调用地址http://www.cargocn.net/cargocn/ws/uploadWayBill.do
  33. * 货运中国ip地址:120.26.85.206;
  34. */
  35. private static String runUrl = "http://120.26.85.206/cargocn/ws/uploadWayBill.do";
  36. /**
  37. * 中转地址http://192.168.3.3:8060/XGToCargocnServer/server/ForwardCargocn-SendRZ
  38. */
  39. private static String forwardUrl = "http://192.168.3.3:8060/XGToCargocnServer/server/ForwardCargocn-SendRZ";
  40. /**
  41. * 调用物流跟踪平台接口方法,将订单数据通过此方法上传给物流跟踪平台系统;
  42. * @param pDlivDirNos运输指示号,TRNF_DTIMEs发货时间,ORD_NMs收货单位,GET_ON_PCDs发货地址,DEST_PCD_DESC收货地址,
  43. * COIL_WGTs钢卷实际重量(ACT_WGT),CUST_NMs合同单位,SHIP_COMP_CDs运输公司,TRANS_CAR_NOs车号
  44. * ,SPEC_STL_GRDs牌号,OLD_SAMPL_NOs钢卷号,SM_CFNMs产品名称
  45. * @return result解密后得到的返回值返回0为成功调用,所有非0均为非成功调用,目前返回值如下:
  46. 1000:签名验证失败
  47. 1001:运单对象不得为空
  48. 1002:发货人ID不得为空
  49. 1003:发货人信息加载出错
  50. 1004:发货人状态不正常
  51. 1005:订单号不得为空
  52. 1006:承运商不得为空
  53. 1007:承运商信息加载出错
  54. 1008:承运商没在货运中国平台开户
  55. 1009:运单子项不得为空
  56. 1010:车牌号不得为空
  57. 1011:车牌号信息加载出错
  58. 1012:车牌号没在货运中国平台注册
  59. 1013:该车辆在货运中国平台尚未关联司机帐号
  60. */
  61. public String cargocnClientPost(String[] pDlivDirNos, String[] TRNF_DTIMEs,
  62. String[] ORD_NMs, String[] DEST_PCD_DESCs,
  63. String[] COIL_WGTs, String[] CUST_NMs, String[] SHIP_COMP_CDs,
  64. String[] TRANS_CAR_NOs, String[] OLD_SAMPL_NOs,
  65. String[] SPEC_STL_GRDs, String[] SM_CFNMs) {
  66. int iCnt = 0;
  67. if (null != pDlivDirNos && 0 != pDlivDirNos.length) {
  68. iCnt = pDlivDirNos.length;
  69. } else
  70. return "1001";
  71. Set<String> dlivNoSet = new HashSet<String>();
  72. Map<String, WayBill> wayMap = new HashMap<String, WayBill>();
  73. //汇总处理
  74. for (int i = 0; i < iCnt; i++) {
  75. try {
  76. if(!dlivNoSet.contains(pDlivDirNos[i])) {
  77. // 主数据
  78. WayBill b = new WayBill();
  79. // 运送指示号
  80. b.setOrderNo(pDlivDirNos[i]);
  81. // 默认1销售物流, 2:采购物流 3:内部物流
  82. b.setOrderType("1");
  83. // 发运日期TRNF_DTIME
  84. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  85. String trnFTime = TRNF_DTIMEs[i];
  86. Date sendDate = null;
  87. if(null == trnFTime || "" == trnFTime)
  88. sendDate = Calendar.getInstance().getTime();
  89. else
  90. sendDate = sdf.parse(trnFTime);
  91. b.setScheduleSendDate(sendDate);
  92. // 发货企业代码, 物流跟踪平台给出的新钢集团代码6
  93. b.setShipperCompanyId(Long.valueOf(6));
  94. // 发货城市
  95. b.setShipperCity("新余市");
  96. // 发货地点 GET_ON_PCD 冷轧系统默认为冷卷厂
  97. b.setShipperAddr("冷卷厂");
  98. // 收货单位 ORD_NMs
  99. String ordNm = ORD_NMs[i];
  100. if(StringUtils.isEmpty(ordNm)) {
  101. ordNm = CUST_NMs[i];
  102. }
  103. b.setReceiveCompanyName(ordNm);
  104. // 收货城市,mes暂无
  105. //通过到站地点从产销数据库查收货城市、收货人、电话
  106. String receiveCity = DEST_PCD_DESCs[i];
  107. String sql5 = "SELECT CX.UNLOADDOCK,CX.SHR,CX.SHRDH FROM SEL_STATIONINFO@XGCX CX WHERE CX.STATIONNAME LIKE '"
  108. + receiveCity + "%' ";
  109. String receiveNM = "";
  110. String receivePhone = "";
  111. ResultSet rs = this.getDao("KgDao").ExceuteQueryForResultSet(sql5);
  112. if (rs.next()) {
  113. receiveNM = rs.getString("SHR"); //收货人
  114. receivePhone = rs.getString("SHRDH"); //收货人电话
  115. if(!StringUtils.isEmpty(rs.getString("UNLOADDOCK")))
  116. receiveCity = rs.getString("UNLOADDOCK"); //收货城市
  117. }
  118. this.getDao("KgDao").closeRs(rs);
  119. b.setReceiveCity(receiveCity); //收货城市
  120. b.setReceiveContactName(receiveNM);
  121. b.setReceiveContactPhone(receivePhone);
  122. // 到站地点 DEST_PCD_DESC
  123. b.setReceiveAddr(DEST_PCD_DESCs[i]);
  124. // 合同单位
  125. b.setCustomerName(CUST_NMs[i]);
  126. // 运输公司 SHIP_COMP_CDs[i]
  127. // b.setLogisticsCompanyName("上海春风物流有限公司");
  128. b.setLogisticsCompanyName(SHIP_COMP_CDs[i]);
  129. // 明细打印日期(实际发运日期)当前时间
  130. b.setLoadDate(Calendar.getInstance().getTime());
  131. // 车牌号
  132. b.setCarNo(TRANS_CAR_NOs[i]);
  133. // b.setCarNo("chepai1");
  134. // 明细数据
  135. WayBillItem wbi = new WayBillItem();
  136. // 钢卷号或者块序号OLD_SAMPL_NOs
  137. wbi.setPackageNo(OLD_SAMPL_NOs[i]);
  138. // 钢种SPEC_STL_GRDs
  139. wbi.setGradeNo(SPEC_STL_GRDs[i]);
  140. // 产品名称SM_CFNM
  141. wbi.setProductName(SM_CFNMs[i]);
  142. // 过磅重量
  143. wbi.setWeight(Double.valueOf(COIL_WGTs[i])/1000);
  144. // 实际过磅重量
  145. wbi.setLoadWeight(Double.valueOf(COIL_WGTs[i])/1000);
  146. // 装车件数
  147. wbi.setNums(Integer.valueOf(1));
  148. // 实际装车件数
  149. wbi.setLoadNums(Integer.valueOf(1));
  150. ArrayList<WayBillItem> wItem = new ArrayList<WayBillItem>();
  151. wItem.add(wbi);
  152. b.setWayBillItems(wItem);
  153. dlivNoSet.add(pDlivDirNos[i]);
  154. wayMap.put(pDlivDirNos[i], b);
  155. } else {
  156. WayBill wb = wayMap.get(pDlivDirNos[i]);
  157. // 明细数据
  158. WayBillItem wbi = new WayBillItem();
  159. // 钢卷号或者块序号OLD_SAMPL_NOs
  160. wbi.setPackageNo(OLD_SAMPL_NOs[i]);
  161. // 钢种SPEC_STL_GRDs
  162. wbi.setGradeNo(SPEC_STL_GRDs[i]);
  163. // 产品名称SM_CFNM
  164. wbi.setProductName(SM_CFNMs[i]);
  165. // 过磅重量
  166. wbi.setWeight(Double.valueOf(COIL_WGTs[i])/1000);
  167. // 实际过磅重量
  168. wbi.setLoadWeight(Double.valueOf(COIL_WGTs[i])/1000);
  169. // 装车件数
  170. wbi.setNums(Integer.valueOf(1));
  171. // 实际装车件数
  172. wbi.setLoadNums(Integer.valueOf(1));
  173. ArrayList<WayBillItem> wItem = wb.getWayBillItems();
  174. wItem.add(wbi);
  175. }
  176. } catch (Exception e) {
  177. // TODO: handle exception
  178. }
  179. }
  180. return postCommit(wayMap);
  181. }
  182. /**
  183. * 调用物流跟踪平台接口方法,将订单数据通过此方法上传给物流跟踪平台系统;
  184. * @param params明细集合对象
  185. * @return result解密后得到的返回值返回0为成功调用,所有非0均为非成功调用,目前返回值如下:
  186. 1000:签名验证失败
  187. 1001:运单对象不得为空
  188. 1002:发货人ID不得为空
  189. 1003:发货人信息加载出错
  190. 1004:发货人状态不正常
  191. 1005:订单号不得为空
  192. 1006:承运商不得为空
  193. 1007:承运商信息加载出错
  194. 1008:承运商没在货运中国平台开户
  195. 1009:运单子项不得为空
  196. 1010:车牌号不得为空
  197. 1011:车牌号信息加载出错
  198. 1012:车牌号没在货运中国平台注册
  199. 1013:该车辆在货运中国平台尚未关联司机帐号
  200. */
  201. public CoreReturnObject cargocnClientPost( ArrayList<String[]> params) {
  202. CoreReturnObject cro = new CoreReturnObject();
  203. if (null == params || 0 == params.size()) {
  204. cro.setV_errMsg("Result : 1001");
  205. // cro.setV_errCode(1001);
  206. return cro;
  207. }
  208. Set<String> dlivNoSet = new HashSet<String>();
  209. Map<String, WayBill> wayMap = new HashMap<String, WayBill>();
  210. for(String[] billArrays : params){
  211. try {
  212. if(!dlivNoSet.contains(billArrays[1])) {
  213. // 主数据
  214. WayBill b = new WayBill();
  215. // 运送指示号
  216. b.setOrderNo(billArrays[1]);
  217. // 默认1销售物流, 2:采购物流 3:内部物流
  218. b.setOrderType("1");
  219. // 发运日期TRNF_DTIME
  220. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  221. String trnFTime = billArrays[8];
  222. Date sendDate = null;
  223. if(StringUtils.isEmpty(trnFTime) || "-".equals(trnFTime))
  224. sendDate = Calendar.getInstance().getTime();
  225. else
  226. sendDate = sdf.parse(trnFTime);
  227. b.setScheduleSendDate(sendDate);
  228. // 发货企业代码, 物流跟踪平台给出的新钢集团代码6
  229. b.setShipperCompanyId(Long.valueOf(6));
  230. // 发货城市
  231. b.setShipperCity("新余市");
  232. // 发货地点 GET_ON_PCD 冷轧系统默认为冷卷厂
  233. b.setShipperAddr("冷轧厂");
  234. // 收货单位 ORD_NMs
  235. String ordNm = billArrays[14];
  236. if(StringUtils.isEmpty(ordNm)) {
  237. ordNm = billArrays[13];
  238. }
  239. b.setReceiveCompanyName(ordNm);
  240. //通过到站地点从产销数据库查收货城市、收货人、电话
  241. String receiveCity = billArrays[15];
  242. String sql5 = "SELECT CX.UNLOADDOCK,CX.SHR,CX.SHRDH FROM SEL_STATIONINFO@XGCX CX WHERE CX.STATIONNAME LIKE '"
  243. + receiveCity + "%' ";
  244. String receiveNM = "";
  245. String receivePhone = "";
  246. ResultSet rs = this.getDao("KgDao").ExceuteQueryForResultSet(sql5);
  247. if (rs.next()) {
  248. receiveNM = rs.getString("SHR"); //收货人
  249. receivePhone = rs.getString("SHRDH"); //收货人电话
  250. if(!StringUtils.isEmpty(rs.getString("UNLOADDOCK")))
  251. receiveCity = rs.getString("UNLOADDOCK"); //收货城市
  252. }
  253. this.getDao("KgDao").closeRs(rs);
  254. b.setReceiveCity(receiveCity);
  255. b.setReceiveContactName(receiveNM);
  256. b.setReceiveContactPhone(receivePhone);
  257. // 到站地点 DEST_PCD_DESC
  258. b.setReceiveAddr(billArrays[15]);
  259. // 合同单位
  260. b.setCustomerName(billArrays[13]);
  261. // 运输公司若名字SHIP_COMP_NMs为空则用 SHIP_COMP_CDs[i] 新余中新物流有限公司
  262. // b.setLogisticsCompanyName("新余中新物流有限公司");
  263. if(StringUtils.isEmpty(billArrays[18])) {
  264. b.setLogisticsCompanyName(billArrays[10]);
  265. } else
  266. b.setLogisticsCompanyName(billArrays[18]);
  267. // 明细打印日期(实际发运日期)当前时间
  268. b.setLoadDate(Calendar.getInstance().getTime());
  269. // 车牌号
  270. b.setCarNo(billArrays[2]);
  271. // b.setCarNo("赣K12345");
  272. // 明细数据
  273. WayBillItem wbi = new WayBillItem();
  274. // 钢卷号或者块序号OLD_SAMPL_NOs
  275. wbi.setPackageNo(billArrays[16]);
  276. // 钢种SPEC_STL_GRDs
  277. wbi.setGradeNo(billArrays[9]);
  278. // 产品名称SM_CFNM
  279. wbi.setProductName(billArrays[17]);
  280. // 过磅重量
  281. wbi.setWeight(Double.valueOf(billArrays[6])/1000);
  282. // 实际过磅重量
  283. wbi.setLoadWeight(Double.valueOf(billArrays[6])/1000);
  284. // 装车件数
  285. wbi.setNums(Integer.valueOf(1));
  286. // 实际装车件数
  287. wbi.setLoadNums(Integer.valueOf(1));
  288. ArrayList<WayBillItem> wItem = new ArrayList<WayBillItem>();
  289. wItem.add(wbi);
  290. b.setWayBillItems(wItem);
  291. dlivNoSet.add(billArrays[1]);
  292. wayMap.put(billArrays[1], b);
  293. } else {
  294. WayBill wb = wayMap.get(billArrays[1]);
  295. // 明细数据
  296. WayBillItem wbi = new WayBillItem();
  297. // 钢卷号或者块序号OLD_SAMPL_NOs
  298. wbi.setPackageNo(billArrays[16]);
  299. // 钢种SPEC_STL_GRDs
  300. wbi.setGradeNo(billArrays[9]);
  301. // 产品名称SM_CFNM
  302. wbi.setProductName(billArrays[17]);
  303. // 过磅重量
  304. wbi.setWeight(Double.valueOf(billArrays[6])/1000);
  305. // 实际过磅重量
  306. wbi.setLoadWeight(Double.valueOf(billArrays[6])/1000);
  307. // 装车件数
  308. wbi.setNums(Integer.valueOf(1));
  309. // 实际装车件数
  310. wbi.setLoadNums(Integer.valueOf(1));
  311. ArrayList<WayBillItem> wItem = wb.getWayBillItems();
  312. wItem.add(wbi);
  313. }
  314. } catch (Exception e) {
  315. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  316. e.printStackTrace(new PrintStream(baos));
  317. String exception = baos.toString();
  318. cro.setV_errMsg("\nError : " + exception); // CoreClientParam.ReturnInfo
  319. e.printStackTrace();
  320. return cro;
  321. }
  322. }
  323. String state = postCommit(wayMap);
  324. //cro.setV_errCode(Integer.valueOf(state)); //对应客户端显示CoreClientParam.ReturnCode
  325. cro.setV_errMsg(state); // CoreClientParam.ReturnInfo
  326. //cro.setResult("setResult:" + state); //CoreClientParam.ReturnObject
  327. return cro;
  328. }
  329. /*
  330. * 提交请求
  331. */
  332. public String postCommit(Map<String, WayBill> wayMap) {
  333. StringBuffer restr = new StringBuffer("Total: [" + wayMap.size() + "] Result : ");
  334. // //公钥文件路径
  335. // String pubPath = "/" + WayBillClient.class.getResource("/") + "cargocn_server_pub.key";
  336. // //私钥文件路径
  337. // String priPath = "/" + WayBillClient.class.getResource("/") + "cargocn_client_pri.p8";
  338. for (WayBill value : wayMap.values()) {
  339. try {
  340. // 总件数
  341. value.setLoadTotalNums(value.getWayBillItems().size());
  342. // 总重量COIL_WGTs
  343. Double totalW = 0.0;
  344. for(WayBillItem item : value.getWayBillItems()){
  345. totalW += item.getLoadWeight();
  346. }
  347. value.setLoadTotalWeight(totalW);
  348. // json格式转换
  349. String bill = JSON.toJSONString(value);
  350. System.out.println("billJSON:" + bill);
  351. //直接用json数据加密传输会出现中文乱码,这里转换成unicode编码
  352. String unicBill = ChangeCharset.stringToUnicode(bill);
  353. System.out.println("unicBill:" + unicBill);
  354. // 公钥加密
  355. byte[] cipherData = RSAUtils.encryptByPublicKey(unicBill.getBytes(), RSAUtils.loadKeyStr("PUB"));
  356. // String path = value.getClass().getClassLoader().getResource("cargocn_server_pub.key").getPath();
  357. // restr.append("\n path:" + path);
  358. // byte[] cipherData = RSAUtils.encryptByPublicKey(unicBill.getBytes(),
  359. // RSAUtils.loadPublicKeyByFile(path));
  360. String cipher = Base64.encode(cipherData);
  361. System.out.println("cipher:" + cipher);
  362. // 私钥加密
  363. String signstr = RSAUtils.sign(cipher.getBytes(),RSAUtils.loadKeyStr("PRI"));
  364. // String signstr = RSAUtils.sign(cipher.getBytes(),
  365. // RSAUtils.loadPrivateKeyByFile(value.getClass().getClassLoader()
  366. // .getResource("cargocn_client_pri.p8").getPath()));
  367. System.out.println("signstr:" + signstr);
  368. //中转接口地址
  369. HttpPostUtil hu = new HttpPostUtil(forwardUrl);
  370. // 发送请求
  371. String ret = hu.post(cipher, signstr);
  372. if( "0".equals(ret)) {
  373. //返回0发送成功,则修改数据状态为7;
  374. String sql = XmlSqlParsersFactory.getSql("UIJ030030_cargocn.update");
  375. this.getDao("KgDao").ExcuteNonQuery(sql, new Object[]{value.getOrderNo()});
  376. }
  377. // 转换请求返回参数json
  378. // JSONObject jo = JSON.parseObject(ret);
  379. // restr.append("\n jo:" + jo);
  380. // String result = jo.getString("result");
  381. // String resultSign = jo.getString("sign");
  382. // // 验证签名
  383. // boolean tmp = RSAUtils.verify(result.getBytes(), RSAUtils.loadKeyStr("PUB"), resultSign);
  384. //// boolean tmp = RSAUtils.verify(result.getBytes(),
  385. //// RSAUtils.loadPublicKeyByFile(value.getClass().getClassLoader()
  386. //// .getResource("cargocn_server_pub.key").getPath()),resultSign);
  387. // if (tmp) {
  388. // // 解密
  389. // byte[] res = RSAUtils.decryptByPrivateKey(Base64.decode(result), RSAUtils.loadKeyStr("PRI"));
  390. //// byte[] res = RSAUtils.decryptByPrivateKey(Base64.decode(result), RSAUtils
  391. //// .loadPrivateKeyByFile(value.getClass().getClassLoader()
  392. //// .getResource("cargocn_client_pri.p8").getPath()));
  393. // String restr0 = new String(res);
  394. restr.append("\n " + value.getOrderNo() + " : " + ret + ";");
  395. System.out.println("返回值restr:" + ret);
  396. } catch (Exception e) {
  397. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  398. e.printStackTrace(new PrintStream(baos));
  399. String exception = baos.toString();
  400. restr.append("\nError : " + exception);
  401. e.printStackTrace();
  402. }
  403. }
  404. return restr.toString();
  405. }
  406. /*
  407. * 测试用
  408. */
  409. public static void main(String[] args) {
  410. // 主数据
  411. WayBill b = new WayBill();
  412. b.setOrderNo("20150515XY005"); // 运送指示号
  413. b.setOrderType("1"); // 默认1销售物流, 2:采购物流 3:内部物流
  414. b.setScheduleSendDate(Calendar.getInstance().getTime()); // 发运日期TRNF_DTIME
  415. b.setShipperCompanyId(Long.valueOf(6)); // 发货企业代码 物流跟踪平台给出的新钢集团代码
  416. b.setReceiveCompanyName("新余新钢集团测试数据:005"); // 收货企业 合同单位 CUST_NM
  417. b.setShipperCity("新余市"); // 发货城市
  418. b.setShipperAddr("热卷厂"); // 发货地点 GET_ON_PCD
  419. b.setReceiveCity("南昌市"); // 收货城市,mes暂无
  420. b.setReceiveAddr("新余新钢集团测试数据:005"); // 到站地点 DEST_PCD_DESC
  421. b.setLoadTotalNums(5); // 根据发运指示号获得多少件数
  422. b.setLoadTotalWeight(new Double(22)); // 根据发运指示号获得总重量COIL_WGTs
  423. b.setCustomerName("新余新钢集团测试数据:005"); // 合同单位
  424. b.setLogisticsCompanyName("新余中新物流有限公司"); // 运输公司 SHIP_COMP_CD
  425. b.setLoadDate(Calendar.getInstance().getTime()); // 明细打印日期(实际发运日期)当前时间
  426. b.setCarNo("赣K12345"); // 车牌号
  427. // 明细数据
  428. WayBillItem i = new WayBillItem();
  429. i.setPackageNo("package123"); // 钢卷号或者块序号OLD_SAMPL_NOs
  430. i.setGradeNo("50-1"); // 钢种SPEC_STL_GRDs
  431. i.setProductName("新余新钢集团测试数据:005"); // 产品名称SM_CFNM
  432. i.setWeight(Double.valueOf(42)); // 过磅重量
  433. i.setLoadWeight(Double.valueOf(41.28)); // 实际过磅重量
  434. i.setNums(Integer.valueOf(1)); // 装车件数
  435. i.setLoadNums(Integer.valueOf(1)); // 实际装车件数
  436. ArrayList<WayBillItem> li = new ArrayList<WayBillItem>();
  437. li.add(i);
  438. b.setWayBillItems(li);
  439. // 加密 签名
  440. try {
  441. String bill = JSON.toJSONString(b);
  442. System.out.println("bill:" + bill);
  443. String iso = new String(bill.getBytes("UTF-8"),"ISO-8859-1");
  444. System.out.println("iso:" + iso);
  445. String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8");
  446. System.out.println("utf8:" + utf8);
  447. String unic = ChangeCharset.stringToUnicode(bill);
  448. System.out.println("unic:" + unic);
  449. String unicTo = ChangeCharset.unicodeToString(unic);
  450. System.out.println("unicTo:" + unicTo);
  451. // 公钥加密
  452. // byte[] cipherData = RSAUtils.encryptByPublicKey(
  453. // bill.getBytes(),
  454. // RSAUtils.loadPublicKeyByFile(b.getClass().getClassLoader()
  455. // .getResource("cargocn_server_pub.key").getPath()));
  456. byte[] cipherData = RSAUtils.encryptByPublicKey(bill.getBytes(),
  457. RSAUtils.loadKeyStr("PUB"));
  458. String cipher = Base64.encode(cipherData);
  459. System.out.println("cipher:" + cipher);
  460. // 私钥加密
  461. // String signstr = RSAUtils.sign(
  462. // cipher.getBytes(),
  463. // RSAUtils.loadPrivateKeyByFile(b.getClass().getClassLoader()
  464. // .getResource("cargocn_client_pri.p8").getPath()));
  465. String signstr = RSAUtils.sign(cipher.getBytes(),RSAUtils.loadKeyStr("PRI"));
  466. System.out.println("signstr:" + signstr);
  467. // 远程接口地址
  468. HttpPostUtil hu = new HttpPostUtil(runUrl);
  469. // 发送请求
  470. String ret = hu.post(cipher, signstr);
  471. System.out.println("ret:" + ret);
  472. // 转换请求返回参数json
  473. JSONObject jo = JSON.parseObject(ret);
  474. String result = jo.getString("result");
  475. String resultSign = jo.getString("sign");
  476. // 验证签名
  477. // boolean tmp = RSAUtils.verify(
  478. // result.getBytes(),
  479. // RSAUtils.loadPublicKeyByFile(b.getClass().getClassLoader()
  480. // .getResource("cargocn_server_pub.key").getPath()),
  481. // resultSign);
  482. boolean tmp = RSAUtils.verify(result.getBytes(), RSAUtils.loadKeyStr("PUB"),
  483. resultSign);
  484. if (tmp) {
  485. // 解密
  486. // byte[] res = RSAUtils.decryptByPrivateKey(
  487. // Base64.decode(result), RSAUtils
  488. // .loadPrivateKeyByFile(b.getClass()
  489. // .getClassLoader()
  490. // .getResource("cargocn_client_pri.p8")
  491. // .getPath()));
  492. byte[] res = RSAUtils.decryptByPrivateKey(
  493. Base64.decode(result), RSAUtils.loadKeyStr("PRI"));
  494. String restr = new String(res);
  495. System.out.println("restr:" + restr);
  496. String unicTo1 = ChangeCharset.unicodeToString(unic);
  497. System.out.println("unicTo:" + unicTo1);
  498. }
  499. } catch (Exception e) {
  500. // TODO Auto-generated catch block
  501. e.printStackTrace();
  502. }
  503. }
  504. }