f9ccc4c6171e34b1424765eee3ff80b2baac35ca.svn-base 17 KB

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