之前的后天管理系统的电子面单打印使用的是灵通打单。

使用相对比较麻烦,需要到处Excel之后再导入,麻烦。

快递鸟有电子面单api,后台系统直接对接很是方便,不过也遇到了好些问题。

不难是不难,但是遇到的坑着实是不少,特此记录一下。

快递鸟电子面单API申请地址:http://www.kdniao.com/reg

都是在正式环境下,申请对应的商户id等一系列东西。

在对应的快递鸟后台,可以进行如下的批量打印。

想把这个打印功能集成到自己内部系统,可以下载官方的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 EBusinessIDfinal String AppKey = ""; //kdniao.com AppKeyfinal 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 stubresponse.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 EBusinessIDfinal String AppKey = "8e9dcb4b-f0a1-42f6-9d80-372a67f851**"; //kdniao.com AppKeyfinal Integer IsPreview = 1; //是否预览 0-不预览 1-预览@RequestMapping("/getCloudPrintData.do")@ResponseBodypublic Map<String, Object> getCloudPrintData(HttpServletRequest request,String OrderCode,String ip) throws Exception{System.out.println("ok:"+OrderCode+"---"+ip);Map<String,Object> map = new HashMap<String, Object>();List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();Map<String,Object> dataMap = new HashMap<String, Object>();dataMap.put("OrderCode", OrderCode);dataMap.put("PortName", "Xprinter XP-DT108A LABEL");list.add(dataMap);String jsonString = JSONArray.fromObject(dataMap).toString();        map.put("RequestData", URLEncoder.encode(jsonString, "UTF-8"));if(StringUtils.isEmpty(ip)) {ip = getIpAddress(request);}map.put("DataSign",encrpy(ip + jsonString, AppKey));System.out.println("map:"+map);return map;}@RequestMapping("/getIpAddressByJava.do")@ResponseBodypublic String getIpAddressByJava(HttpServletRequest request) throws IOException {return getIpAddress(request);}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)));}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();}// 获取请求主机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;}

对应的html

<body>
<script type="text/javascript">function fasong(){var orderNo = $("#orderNo").val();var ipAddress = $("#ipAddress").val();$.ajax({url:'/jeeadmin/jeecms/getCloudPrintData.do',data:{OrderCode:orderNo,ip:ipAddress},success:function(data){$("#RequestData").val(data.RequestData)$("#DataSign").val(data.DataSign)}})}function getIp(){$.ajax({url:'/jeeadmin/jeecms/getIpAddressByJava.do',success:function(data){alert(data);}})}
</script>
<h1>测试打印页面</h1><div id="head"></div><div><input type="text" id="orderNo"><input type="text" id="ipAddress"><input type="button" onclick="fasong()" value="发送" /></div><div><input type="button" onclick="getIp()" value="获取ip地址通过java"/></div><form id="form1" action="http://www.kdniao.com/External/PrintOrder.aspx" method="post" target="_self"><div style=""><div><input type="text" id="RequestData" name="RequestData" readonly="readonly"/>请求数据</div><div><input type="text" id="DataSign" name="DataSign" readonly="readonly"/>签名</div><div><input type="text" id="EBusinessID" name="EBusinessID" value="1267739"/>商户id</div><div><input type="text" id="IsPreview" name="IsPreview" value="1"/><span style="color: red;">是否预览 0-不预览 1-预览</span></div><div><input type="submit" id="tijiao" value="打印" /></div></div></form>
</body>

快递鸟基于java功能打印电子面单api接口相关推荐

  1. 物流快递电子面单Api接口怎么申请对接(顺丰、快递鸟、菜鸟、拼多多)

    关于电子面单: 电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务.通过热感应显示文字,打印速度比传统针式打印速度提升4~6倍.电子面单以接口形式嵌入到自己的系统.网站上,可以在自己的平台操作打印 ...

  2. 常用快递电子面单api接口及对接调用方式

    现在电商行业发展很快,很多企业订单量大,手写快递单比较慢,所以开通对接电子面单打印API接口就成了很多企业迫切需要的功能: 目前申请渠道目前有三个,快递公司.菜鸟和快递鸟.前两个对接接口需要一定的资质 ...

  3. 电子面单api接口_JAVA调用示例

    电子面单是一种通过热敏纸打印输出纸质×××的物流服务.通过热感应显示文字,打印速度比传统针式打印速度提升4~6倍.电子面单以接口形式嵌入到自己的系统.网站上,可以在自己的平台操作打印电子面单. 目前电 ...

  4. C#圆通快递电子面单api接口调用方法

    快递电子面单支持多家快递物流公司单号获取.分拣码返回.面单打印.在线下单发货.通知快递员上门取件等功能,可用于电商平台.自营商城.打单工具.WMS仓储系统.APP等需要发货的场景,可有效提高商家的打印 ...

  5. 快递鸟单号查询接口电子面单API接入流程(全)

        电商平台和小程序都有物流模块,需要查询物流轨迹状态,一家家去对接顺丰.申通.中通.圆通.韵达.百世.邮政.EMS.京东.天天.德邦.安能等快递单号查询接口和电子面单API接口,是非常麻烦的,快 ...

  6. 电商ERP如何接入快递鸟电子面单API?

    快递鸟是全球物流接口服务商,为电商 ERP.电商平台.仓储.清关公司提供物流跟踪.电子面单.智选物流.物流金融.在线下单等服务,解决电商的物流管理模块和金融模块.现就对快递鸟电子面单API做基本描述, ...

  7. 电商平台如何接入快递鸟电子面单API?

    快递鸟是全球物流接口服务商,为电商 ERP.电商平台.仓储.清关公司提供物流跟踪.电子面单.智选物流.物流金融.在线下单等服务,解决电商的物流管理模块和金融模块.现就对快递鸟电子面单API做基本描述, ...

  8. 基于JAVA大学生健康电子档案系统计算机毕业设计源码+系统+lw文档+部署

    基于JAVA大学生健康电子档案系统计算机毕业设计源码+系统+lw文档+部署 基于JAVA大学生健康电子档案系统计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语言: ...

  9. (附源码)计算机毕业设计SSM基于Java的小型电子病历系统

    (附源码)计算机毕业设计SSM基于Java的小型电子病历系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclisp ...

最新文章

  1. FORM 中的颜色 Visual Attribute
  2. 好久没写了,重装了系统重新配置的Live Writer,看看效果:
  3. AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用)、常用算法、经典案例之详细攻略(建议收藏)
  4. 【无标题】科大星云诗社动态20220109
  5. Spark _13_二次排序问题
  6. 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
  7. springboot ---- sts如何启动两个实例
  8. Android 网络状态的监控
  9. 使用fetch封装请求_关于如何使用Fetch API执行HTTP请求的实用ES6指南
  10. csv 读写 python_Python CSV读写
  11. Windows环境下安装python+tensorflow
  12. linux用户和组管理的实验报告,LINUX实验三   用户管理
  13. Word插入图目录,表目录
  14. 完整代码-Vue+Java后台实现省市区三级联动
  15. Leaflet地图 -- 绘制台风风圈
  16. 【Unity3D】sRGB伽马(gamma)空间和sRGB Frame Buffer线性空间的简单介绍
  17. 微信个人收款码于订单应用之解决方案
  18. 梦之安魂曲 minisd_科技运动中妇女的安魂曲
  19. java程序员实习刚进入公司一般会安排做什么?
  20. Unity3D学习:飞碟游戏进化版

热门文章

  1. World Locking Tools for Unity (五)安装部分
  2. 机器学习中的L1和L2正则化项
  3. 新能源汽车车架号VIN码查询车辆信息
  4. Google,微软,科大讯飞的语音识别引擎对比
  5. QQ跨站漏洞巧利用一例【强迫别人帮你买QQ秀】【应该以失效】
  6. pc端不同分辨率适配
  7. stm32实现心电监测-原理图单片机程序C#上位机程序
  8. 盘点2018上半年最受欢迎的前端开发!
  9. codeforces 821 B Okabe and Banana Trees
  10. Word排版——毕业论文专业排版3——编号+多级列表