怎么实现java快递电子面单打印接口对接demo
本篇内容介绍了"怎么实现java快递电子面单打印接口对接demo"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
直接调用快递鸟API。
首先登陆快递鸟官网进行会员注册http://www.kdniao.com/reg,
然后登录快递鸟官网后台认证自己的用户信息,记住自己的用户ID和API key,代码里调用接口时会使用到。我这里主要做个物流跟踪的功能,所以我需要调用的物流跟踪API,所以我需要先订阅这个API的服务。大家如果想调用别的接口就相应的去订阅就可以了。

然后在官网找到这里 点击下载相应语言的demo
在对应的快递鸟后台,可以进行如下的批量打印。
想把这个打印功能集成到自己内部系统,可以下载官方的demo
跑起来挺容易的,直接放入tomcat运行就可以了
不过demo需要tomcat8.5,需要修改的话找到项目的.settings文件夹下有一个
org.eclipse.wst.common.project.facet.core.xml 将tomcat8.5修改为对应的版本就可以了。
官方demo代码
package cc.kdniao.api;import java.io.IOException;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.security.MessageDigest;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sun.xml.internal.messaging.saaj.util.Base64;/** * Servlet implementation class printOrder */@WebServlet("/printOrder")public class printOrder extends HttpServlet { private static final long serialVersionUID = 1L; final String EBussinessID = "";//kdniao.com EBusinessID final String AppKey = ""; //kdniao.com AppKey final Integer IsPreview = 0; //是否预览 0-不预览 1-预览 /** * @see HttpServlet#HttpServlet() */ public printOrder() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //response.getWriter().append("Served at: ").append(request.getContextPath()); PrintWriter print = response.getWriter(); String jsonResult = ""; try { String ip = getIpAddress(request); jsonResult = getPrintParam(ip); } catch (Exception e) { //write log } print.println(jsonResult); print.flush(); print.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, UnsupportedEncodingException { // TODO Auto-generated method stub response.setContentType(""); PrintWriter print = response.getWriter(); String jsonResult = ""; try { String ip = getIpAddress(request); jsonResult = getPrintParam(ip); } catch (Exception e) { //wirte log } print.println(jsonResult); print.flush(); print.close(); } /** * get print order param to json string * @return * * @throws Exception */ private String getPrintParam(String ip) throws Exception { String data = "[{\"OrderCode\":\"234351215333113311353\",\"PortName\":\"SF\"},{\"OrderCode\":\"234351215333113311354\",\"PortName\":\"打印机名称二\"}]"; String result = "{\"RequestData\": \"" + URLEncoder.encode(data, "UTF-8") + "\", \"EBusinessID\":\"" + EBussinessID + "\", \"DataSign\":\"" + encrpy(ip + data, AppKey) + "\", \"IsPreview\":\"" + IsPreview + "\"}"; return result; } private String md5(String str, String charset) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes(charset)); byte[] result = md.digest(); StringBuffer sb = new StringBuffer(32); for (int i = 0; i < result.length; i++) { int val = result[i] & 0xff; if (val <= 0xf) { sb.append("0"); } sb.append(Integer.toHexString(val)); } return sb.toString().toLowerCase(); } private String encrpy(String content, String key) throws UnsupportedEncodingException, Exception { String charset = "UTF-8"; return new String(Base64.encode(md5(content + key, charset).getBytes(charset))); } /** * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址; * * @param request * @return * @throws IOException */ public final static String getIpAddress(HttpServletRequest request) throws IOException { // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } else if (ip.length() > 15) { String[] ips = ip.split(","); for (int index = 0; index < ips.length; index++) { String strIp = (String) ips[index]; if (!("unknown".equalsIgnoreCase(strIp))) { ip = strIp; break; } } } return ip; }}但是,需要注意的是,API有一个ip参数,获取这个ip快递鸟提供的方法是如下
// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 public final static String getIpAddress(HttpServletRequest request) throws IOException { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } else if (ip.length() > 15) { String[] ips = ip.split(","); for (int index = 0; index < ips.length; index++) { String strIp = (String) ips[index]; if (!("unknown".equalsIgnoreCase(strIp))) { ip = strIp; break; } } } return ip; }注意这个方法是没有问题的,但是你如果直接输入快递单号OrderCode进行打印,这个时候提交总是说数据验证不通过,并不是签名问题,而是ip问题。
因为上一个方法只要是在局域网下面,即使能访问外网,也没用,获取到的ip永远都是内网ip
有一种方式可以在本地验证通过,那就是直接百度ip,只有会有自己的ip地址

OK,在后台将ip写死,就可以进行打印预览操作了。
打印需要安装lodop打印插件,安装完成之后访问 http://localhost:8000/CLodopfuncs.js 会有相应的控件js
需要对应的打印插件,必须要有设备(热敏打印机),要不我也不至于出差了。
之后根据打印机型号,进入对应的官网下载打印驱动。之后perfect,就可以进行打印了。
官方demo给的是servlet
我使用的是SpringMVC,将代码贴出。
final String EBussinessID = "12677**";//kdniao.com EBusinessID final String AppKey = "8e9dcb4b-f0a1-42f6-9d80-372a67f851**"; //kdniao.com AppKey final Integer IsPreview = 1; //是否预览 0-不预览 1-预览 @RequestMapping("/getCloudPrintData.do") @ResponseBody public Map getCloudPrintData(HttpServletRequest request,String OrderCode,String ip) throws Exception{ System.out.println("ok:"+OrderCode+"---"+ip); Map map = new HashMap(); List 对应的html
测试打印页面
"怎么实现java快递电子面单打印接口对接demo"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
快递 接口 代码 后台 地址 官方 打印机 方法 问题 UTF-8 电子 内容 功能 插件 更多 物流 用户 知识 订阅 跟踪 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 zabbix监控数据库同步 公司网络安全日常检查表 服务器dhcp配置管理 太原科技大学互联网 大赛 小学生网络安全宣传周活动 网络安全从业者贡献 中美网络安全概念股 昆明 软件开发培训机构 php负载均衡服务器 oracle数据库读写操作阻塞 青浦区媒体数据库服务报价行情 张店物流竞价报价软件开发服务 达梦数据库获取当前年度 美女相亲男生是网络安全员 gbase8a数据库驱动 网络技术学习文案长句 创建数据库结构就是要干什么 高斯数据库占用空间估算 腾讯云服务器 登录 千针石林服务器在几区 mysql查询数据库所有表行数 搭建在线编辑服务器 青岛奥商网络技术 7k7k皮卡堂服务器上线时间 我的世界私人服务器受法律保护吗 河北肖驹网络技术 3d建模数据库 科学技术术语数据库 微信是一种网络技术应用 贴吧数据库丢失