一、访问飞鹅云官网

http://www.feieyun.com/open/index.html

参考官网对接指引:

1、注册开发者账号

2、对接API

3、阅读飞鹅云远程接口请求调用

4、可参考官方提供的SDK

二、实际项目工程使用

对接官网必接接口,根据自身需求对接所需接口。以下为接口调用示例,根据自身项目需求自行调整:

package com.xunjing.smartCatering.modular.test;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;public class FeiEPrinterApiDemo {public static final String URL = "http://api.feieyun.cn/Api/Open/";//不需要修改public static final String USER = "";//账号名public static final String UKEY = "";//飞鹅云后台注册账号后生成的UKEYpublic static final String SN = "";// *必填*:打印机编号,必须要在管理后台里添加打印机或调用API接口添加之后,才能调用API//**********测试时,打开下面注释掉方法的即可,更多接口文档信息,请访问官网开放平台查看**********public static void main(String[] args) throws Exception {//==================添加打印机接口(支持批量)==================//***返回值JSON字符串***//正确例子:{"msg":"ok","ret":0,"data":{"ok":["sn#key#remark#carnum","316500011#abcdefgh#快餐前台"],"no":["316500012#abcdefgh#快餐前台#13688889999  (错误:识别码不正确)"]},"serverExecutedTime":3}//错误:{"msg":"参数错误 : 该帐号未注册.","ret":-2,"data":null,"serverExecutedTime":37}//提示:打印机编号(必填) # 打印机识别码(必填) # 备注名称(选填) # 流量卡号码(选填),多台打印机请换行(\n)添加新打印机信息,每次最多100行(台)。String snlist = "720511182#ky8d777c#null#";String method = addprinter(snlist);System.out.println(method);//==================方法1.小票机打印订单接口==================//***返回值JSON字符串***//成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}//            String method1 = print(SN);//该接口只能是小票机使用,如购买的是标签机请使用下面方法2,调用打印
//          System.out.println(method1);//==================方法2.标签机专用打印订单接口==================//***返回值JSON字符串***//成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}//         String method2 = printLabelMsg(SN);//打开注释调用标签机打印接口进行打印,该接口只能是标签机使用,其它型号打印机请勿使用该接口
//          System.out.println(method2);//===========方法3.查询某订单是否打印成功=============//***返回值JSON字符串***//成功:{"msg":"ok","ret":0,"data":true,"serverExecutedTime":2}//data:true为已打印,false为未打印//失败:{"msg":"错误描述","ret":非0, "data":null,"serverExecutedTime":7}//            String orderid = "xxxxxxx_xxxxxxxx_xxxxxxxx";//订单ID,从方法1返回值data获取
//          String method3 = queryOrderState(orderid);
//          System.out.println(method3);//===========方法4.查询指定打印机某天的订单详情============//***返回值JSON字符串***//成功:{"msg":"ok","ret":0,"data":{"print":6,"waiting":1},"serverExecutedTime":9}//print已打印,waiting为打印//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}//          String strdate = "2016-11-12";//注意时间格式为"yyyy-MM-dd"
//          String method4 = queryOrderInfoByDate(SN,strdate);
//          System.out.println(method4);//===========方法5.查询打印机的状态==========================//***返回值JSON字符串***//成功:{"msg":"ok","ret":0,"data":"状态","serverExecutedTime":4}//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}//         String method5 = queryPrinterStatus(SN);
//          System.out.println(method5);}//=====================以下是函数实现部分================================================private static String addprinter(String snlist) {//通过POST请求,发送打印信息到服务器RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000)//读取超时  .setConnectTimeout(30000)//连接超时.build();CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpPost post = new HttpPost(URL);List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("user", USER));String STIME = String.valueOf(System.currentTimeMillis() / 1000);nvps.add(new BasicNameValuePair("stime", STIME));nvps.add(new BasicNameValuePair("sig", signature(USER, UKEY, STIME)));nvps.add(new BasicNameValuePair("apiname", "Open_printerAddlist"));//固定值,不需要修改nvps.add(new BasicNameValuePair("printerContent", snlist));CloseableHttpResponse response = null;String result = null;try {post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));response = httpClient.execute(post);int statecode = response.getStatusLine().getStatusCode();if (statecode == 200) {HttpEntity httpentity = response.getEntity();if (httpentity != null) {result = EntityUtils.toString(httpentity);}}} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {post.abort();} catch (Exception e) {e.printStackTrace();}try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}//方法1private static String print(String sn) {//标签说明://单标签: //"<BR>"为换行,"<CUT>"为切刀指令(主动切纸,仅限切刀打印机使用才有效果)//"<LOGO>"为打印LOGO指令(前提是预先在机器内置LOGO图片),"<PLUGIN>"为钱箱或者外置音响指令//成对标签://"<CB></CB>"为居中放大一倍,"<B></B>"为放大一倍,"<C></C>"为居中,<L></L>字体变高一倍//<W></W>字体变宽一倍,"<QR></QR>"为二维码,"<BOLD></BOLD>"为字体加粗,"<RIGHT></RIGHT>"为右对齐//拼凑订单内容时可参考如下格式//根据打印纸张的宽度,自行调整内容的格式,可参考下面的样例格式String content;content = "<CB>测试打印</CB><BR>";content += "名称      单价  数量 金额<BR>";content += "--------------------------------<BR>";content += "饭       1.0    1   1.0<BR>";content += "炒饭      10.0   10  10.0<BR>";content += "蛋炒饭     10.0   10  100.0<BR>";content += "鸡蛋炒饭    100.0  1   100.0<BR>";content += "番茄蛋炒饭   1000.0 1   100.0<BR>";content += "西红柿蛋炒饭  1000.0 1   100.0<BR>";content += "西红柿鸡蛋炒饭 100.0  10  100.0<BR>";content += "备注:加辣<BR>";content += "--------------------------------<BR>";content += "合计:xx.0元<BR>";content += "送货地点:广州市南沙区xx路xx号<BR>";content += "联系电话:13888888888888<BR>";content += "订餐时间:2016-08-08 08:08:08<BR>";content += "<QR>http://www.dzist.com</QR>";//通过POST请求,发送打印信息到服务器RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000)//读取超时  .setConnectTimeout(30000)//连接超时.build();CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpPost post = new HttpPost(URL);List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("user", USER));String STIME = String.valueOf(System.currentTimeMillis() / 1000);nvps.add(new BasicNameValuePair("stime", STIME));nvps.add(new BasicNameValuePair("sig", signature(USER, UKEY, STIME)));nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));//固定值,不需要修改nvps.add(new BasicNameValuePair("sn", sn));nvps.add(new BasicNameValuePair("content", content));nvps.add(new BasicNameValuePair("times", "1"));//打印联数CloseableHttpResponse response = null;String result = null;try {post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));response = httpClient.execute(post);int statecode = response.getStatusLine().getStatusCode();if (statecode == 200) {HttpEntity httpentity = response.getEntity();if (httpentity != null) {//服务器返回的JSON字符串,建议要当做日志记录起来result = EntityUtils.toString(httpentity);}}} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {post.abort();} catch (Exception e) {e.printStackTrace();}try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}//方法2private static String printLabelMsg(String sn) {String content;content = "<DIRECTION>1</DIRECTION>";//设定打印时出纸和打印字体的方向,n 0 或 1,每次设备重启后都会初始化为 0 值设置,1:正向出纸,0:反向出纸,content += "<TEXT x='9' y='10' font='12' w='1' h='2' r='0'>#001       五号桌      1/3</TEXT><TEXT x='80' y='80' font='12' w='2' h='2' r='0'>可乐鸡翅</TEXT><TEXT x='9' y='180' font='12' w='1' h='1' r='0'>张三先生       13800138000</TEXT>";//40mm宽度标签纸打印例子,打开注释调用标签打印接口打印//通过POST请求,发送打印信息到服务器RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000)//读取超时  .setConnectTimeout(30000)//连接超时.build();CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpPost post = new HttpPost(URL);List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("user", USER));String STIME = String.valueOf(System.currentTimeMillis() / 1000);nvps.add(new BasicNameValuePair("stime", STIME));nvps.add(new BasicNameValuePair("sig", signature(USER, UKEY, STIME)));nvps.add(new BasicNameValuePair("apiname", "Open_printLabelMsg"));//固定值,不需要修改nvps.add(new BasicNameValuePair("sn", sn));nvps.add(new BasicNameValuePair("content", content));nvps.add(new BasicNameValuePair("times", "1"));//打印联数CloseableHttpResponse response = null;String result = null;try {post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));response = httpClient.execute(post);int statecode = response.getStatusLine().getStatusCode();if (statecode == 200) {HttpEntity httpentity = response.getEntity();if (httpentity != null) {//服务器返回的JSON字符串,建议要当做日志记录起来result = EntityUtils.toString(httpentity);}}} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {post.abort();} catch (Exception e) {e.printStackTrace();}try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}//方法3private static String queryOrderState(String orderid) {//通过POST请求,发送打印信息到服务器RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000)//读取超时  .setConnectTimeout(30000)//连接超时.build();CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpPost post = new HttpPost(URL);List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("user", USER));String STIME = String.valueOf(System.currentTimeMillis() / 1000);nvps.add(new BasicNameValuePair("stime", STIME));nvps.add(new BasicNameValuePair("sig", signature(USER, UKEY, STIME)));nvps.add(new BasicNameValuePair("apiname", "Open_queryOrderState"));//固定值,不需要修改nvps.add(new BasicNameValuePair("orderid", orderid));CloseableHttpResponse response = null;String result = null;try {post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));response = httpClient.execute(post);int statecode = response.getStatusLine().getStatusCode();if (statecode == 200) {HttpEntity httpentity = response.getEntity();if (httpentity != null) {//服务器返回result = EntityUtils.toString(httpentity);}}} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {post.abort();} catch (Exception e) {e.printStackTrace();}try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}//方法4private static String queryOrderInfoByDate(String sn, String strdate) {//通过POST请求,发送打印信息到服务器RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000)//读取超时  .setConnectTimeout(30000)//连接超时.build();CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpPost post = new HttpPost(URL);List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("user", USER));String STIME = String.valueOf(System.currentTimeMillis() / 1000);nvps.add(new BasicNameValuePair("stime", STIME));nvps.add(new BasicNameValuePair("sig", signature(USER, UKEY, STIME)));nvps.add(new BasicNameValuePair("apiname", "Open_queryOrderInfoByDate"));//固定值,不需要修改nvps.add(new BasicNameValuePair("sn", sn));nvps.add(new BasicNameValuePair("date", strdate));//yyyy-MM-dd格式CloseableHttpResponse response = null;String result = null;try {post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));response = httpClient.execute(post);int statecode = response.getStatusLine().getStatusCode();if (statecode == 200) {HttpEntity httpentity = response.getEntity();if (httpentity != null) {//服务器返回result = EntityUtils.toString(httpentity);}}} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {post.abort();} catch (Exception e) {e.printStackTrace();}try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}//方法5private static String queryPrinterStatus(String sn) {//通过POST请求,发送打印信息到服务器RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000)//读取超时  .setConnectTimeout(30000)//连接超时.build();CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpPost post = new HttpPost(URL);List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("user", USER));String STIME = String.valueOf(System.currentTimeMillis() / 1000);nvps.add(new BasicNameValuePair("stime", STIME));nvps.add(new BasicNameValuePair("sig", signature(USER, UKEY, STIME)));nvps.add(new BasicNameValuePair("apiname", "Open_queryPrinterStatus"));//固定值,不需要修改nvps.add(new BasicNameValuePair("sn", sn));CloseableHttpResponse response = null;String result = null;try {post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));response = httpClient.execute(post);int statecode = response.getStatusLine().getStatusCode();if (statecode == 200) {HttpEntity httpentity = response.getEntity();if (httpentity != null) {//服务器返回result = EntityUtils.toString(httpentity);}}} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {post.abort();} catch (Exception e) {e.printStackTrace();}try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}//生成签名字符串private static String signature(String USER, String UKEY, String STIME) {String s = DigestUtils.sha1Hex(USER + UKEY + STIME);return s;}}

3、格式模版调整工具类

  /*** 打印纸一行最大的字节*/private static final int LINE_BYTE_SIZE = 32;/*** 打印三列时,中间一列的中心线距离打印纸左侧的距离*/private static final int LEFT_LENGTH = 18;/*** 打印三列时,中间一列的中心线距离打印纸右侧的距离*/private static final int RIGHT_LENGTH = 14;/*** 打印三列时,第一列汉字最多显示几个文字*/private static final int LEFT_TEXT_MAX_LENGTH = 6;/*** 打印三列* @param leftText   左侧文字* @param middleText 中间文字* @param rightText  右侧文字* @return*/public static String printThreeData(String leftText, String middleText, String rightText) {StringBuilder sb = new StringBuilder();// 左边最多显示 LEFT_TEXT_MAX_LENGTH 个汉字 + 两个点if (leftText.length() > LEFT_TEXT_MAX_LENGTH) {leftText = leftText.substring(0, LEFT_TEXT_MAX_LENGTH) + "..";}int leftTextLength = getBytesLength(leftText);int middleTextLength = getBytesLength(middleText);int rightTextLength = getBytesLength(rightText);sb.append(leftText);// 计算左侧文字和中间文字的空格长度int marginBetweenLeftAndMiddle = LEFT_LENGTH - leftTextLength - middleTextLength / 2;for (int i = 0; i < marginBetweenLeftAndMiddle; i++) {sb.append(" ");}sb.append(middleText);// 计算右侧文字和中间文字的空格长度int marginBetweenMiddleAndRight = RIGHT_LENGTH - middleTextLength / 2 - rightTextLength;for (int i = 0; i < marginBetweenMiddleAndRight; i++) {sb.append(" ");}// 打印的时候发现,最右边的文字总是偏右一个字符,所以需要删除一个空格sb.delete(sb.length() - 1, sb.length()).append(rightText);return sb.toString();}/*** 获取数据长度* @param msg* @return*/private static int getBytesLength(String msg) {return msg.getBytes(Charset.forName("GB2312")).length;}/*** 打印两列** @param leftText  左侧文字* @param rightText 右侧文字* @return*/public static String printTwoData(String leftText, String rightText) {StringBuilder sb = new StringBuilder();int leftTextLength = getBytesLength(leftText);int rightTextLength = getBytesLength(rightText);sb.append(leftText);// 计算两侧文字中间的空格int marginBetweenMiddleAndRight = LINE_BYTE_SIZE - leftTextLength - rightTextLength;for (int i = 0; i < marginBetweenMiddleAndRight; i++) {sb.append(" ");}sb.append(rightText);return sb.toString();}/*** 飞鹅云打印机签名* */private static String signature(String USER, String UKEY, String STIME) {return DigestUtils.sha1Hex(USER + UKEY + STIME);}/*** 关闭网络请求* */public static void close(CloseableHttpResponse response, HttpPost post, CloseableHttpClient httpClient) {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {post.abort();} catch (Exception e) {e.printStackTrace();}try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}

调用示例:

public void printOrderInfoTakeOut(PrinterSetting ps, List<PrinterInfo> printerInfo, OrderInfo orderInfo, StoreInfo storeInfo) throws Exception {//查询打印机数量for (PrinterInfo printer : printerInfo) {//外卖单前后都打印if ("1".equals(printer.getLocation())) {//打印结算单,通过订单id查询订单详情,附在页后QueryWrapper wrapper = new QueryWrapper();wrapper.eq("storeId", orderInfo.getStoreId());wrapper.eq("orderId", orderInfo.getId());List<OrderDetails> orderDetailsList = orderDetailsService.list(wrapper);//发送前台打印命令(注意套餐打印) StringBuilder sb = new StringBuilder();sb.append("<CB><BOLD>外卖结账单(自配送)</BOLD></CB><BR>");sb.append("--------------------------------<BR>");sb.append(""+storeInfo.getName()+"<BR>");sb.append(""+printTwoData("单号",orderInfo.getId()+"")+"<BR>");sb.append(""+printTwoData("牌号",String.format("%04d", orderInfo.getBrandNum())+"")+"<BR>");sb.append(""+printTwoData("下单时间",DateUtil.formatDateTime(orderInfo.getOrderTime())+"")+"<BR>");sb.append(""+printTwoData("支付时间",DateUtil.formatDateTime(orderInfo.getPayTime())+"")+"<BR>");sb.append(""+printTwoData("就餐人数",orderInfo.getNumber()==null?"":orderInfo.getNumber()+"")+"<BR>");sb.append("------------------------------<BR>");sb.append(""+printThreeData("菜品","数量","小计")+"<BR>");sb.append("------------------------------<BR>");for(OrderDetails orderDetails : orderDetailsList ){sb.append("<B>"+orderDetails.getDishName()+"</B><BR>");sb.append(""+printTwoData(orderDetails.getNum()+"*"+(Strings.isNullOrEmpty(orderDetails.getDishUnit())?"份":orderDetails.getDishUnit()),"¥"+ MoneyUtil.changeF2Y(orderDetails.getSmallAmount()))+"<BR>");if(!Strings.isNullOrEmpty(orderDetails.getFlavorStr())||!Strings.isNullOrEmpty(orderDetails.getMakeStr())){sb.append("备注:"+orderDetails.getFlavorStr()+" "+orderDetails.getMakeStr()+"<BR>");}//1-单品,2-套餐if(orderDetails.getDishType() == 2){//如果是套餐则需要查询套餐详情QueryWrapper wrapperType = new QueryWrapper();wrapperType.eq("storeId",printer.getStoreId());wrapperType.eq("packageId",orderDetails.getDishId());List<PackageDetail> packageDetails = packageDetailService.list(wrapperType);if(packageDetails.size()>0){for(PackageDetail packageDetail : packageDetails){sb.append(printThreeData("["+packageDetail.getDishName()+"]",packageDetail.getNum()+"*份","")+"<BR>");}}}}sb.append("<BR>");sb.append("------------------------------<BR>");sb.append(""+printTwoData("结算方式:", "金额")+"<BR>");sb.append(printTwoData(orderPayTypeToString(orderInfo.getPayType()),"¥"+MoneyUtil.changeF2Y(orderInfo.getPayMoney())+""));sb.append("------------------------------<BR>");sb.append(""+printTwoData("合计:¥"+MoneyUtil.changeF2Y(orderInfo.getTotalMoney()), "优惠:¥"+MoneyUtil.changeF2Y(orderInfo.getDiscountMoney()))+"<BR>");sb.append(""+printTwoData("实收:", "¥"+MoneyUtil.changeF2Y(orderInfo.getPayMoney()))+"<BR>");sb.append("******************************<BR>");sb.append(""+printTwoData("点单员:", orderInfo.getManagerName()==null?"自配送外卖":orderInfo.getManagerName())+"<BR>");sb.append(""+printTwoData("整单备注:", orderInfo.getRemark()==null?"":orderInfo.getRemark())+"<BR>");sb.append("------------------------------<BR>");sb.append("客户姓名:"+orderInfo.getContacts()+"<BR>");sb.append("客户电话:"+ orderInfo.getContactsPhone()+"<BR>");sb.append("配送地址:"+orderInfo.getAddress()+"<BR>");sb.append("------------------------------<BR>");sb.append("<BOLD>谢谢光临<BOLD><BR>");sb.append("------------------------------<BR>");// 通过POST请求,发送打印信息到服务器RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000)// 读取超时.setConnectTimeout(30000)// 连接超时.build();CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpPost post = new HttpPost(ps.getUrl());List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("user", ps.getUser()));String STIME = String.valueOf(System.currentTimeMillis() / 1000);nvps.add(new BasicNameValuePair("stime", STIME));nvps.add(new BasicNameValuePair("sig", signature(ps.getUser(), ps.getUserKey(), STIME)));nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));// 固定值,不需要修改nvps.add(new BasicNameValuePair("sn", printer.getAppId()));nvps.add(new BasicNameValuePair("content", sb.toString()));nvps.add(new BasicNameValuePair("times", "1"));// 打印联数CloseableHttpResponse response = null;String result = null;try {post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));response = httpClient.execute(post);int statecode = response.getStatusLine().getStatusCode();if (statecode == 200) {HttpEntity httpentity = response.getEntity();if (httpentity != null) {// 服务器返回的JSON字符串,建议要当做日志记录起来result = EntityUtils.toString(httpentity);}}} catch (Exception e) {e.printStackTrace();} finally {close(response, post, httpClient);}log.info("调用云打印机后厨打印{}",result);log.info(printer.getWindowName()+":结算成功【外卖单-先付后下】,前台打印结束- - - - - - ");} else if ("2".equals(printer.getLocation())) {//后厨打印(需要分出餐口)Long windowId = printer.getWindowId();//查询详情里是此出餐口的菜品,通过订单id查询订单详情QueryWrapper wrapper = new QueryWrapper();wrapper.eq("storeId", orderInfo.getStoreId());wrapper.eq("orderId", orderInfo.getId());wrapper.eq("windowId", windowId);List<OrderDetails> orderDetailsList = orderDetailsService.list(wrapper);if (orderDetailsList.size() > 0) {//发送厨打命令(注意套餐打印)log.info(printer.getWindowName()+":结算成功,开始打印后厨......................");StringBuilder sb = new StringBuilder();sb.append("<CB><BOLD>传菜单(自配送)</BOLD></CB><BR>");sb.append(""+storeInfo.getName()+"<BR>");sb.append(""+printTwoData("单号",orderInfo.getId()+"")+"<BR>");sb.append(""+printTwoData("牌号",String.format("%04d", orderInfo.getBrandNum())+"")+"<BR>");sb.append(""+printTwoData("出菜窗口",printer.getWindowName()+"")+"<BR>");sb.append(""+printTwoData("下单时间",orderInfo.getUpdateTime()==null?DateUtil.formatDateTime(orderInfo.getOrderTime()):DateUtil.formatDateTime(orderInfo.getUpdateTime()))+"<BR>");sb.append(""+printTwoData("就餐人数",orderInfo.getNumber()==null?"":orderInfo.getNumber()+"")+"<BR>");sb.append("------------------------------<BR>");sb.append(""+printThreeData("菜品","数量","小计")+"<BR>");sb.append("------------------------------<BR>");for(OrderDetails orderDetails : orderDetailsList ){sb.append("<B>"+orderDetails.getDishName()+"</B><BR>");sb.append(""+printTwoData(orderDetails.getNum()+"*"+(Strings.isNullOrEmpty(orderDetails.getDishUnit())?"份":orderDetails.getDishUnit()),"¥"+ MoneyUtil.changeF2Y(orderDetails.getSmallAmount()))+"<BR>");if(!Strings.isNullOrEmpty(orderDetails.getFlavorStr())||!Strings.isNullOrEmpty(orderDetails.getMakeStr())){sb.append("备注:"+orderDetails.getFlavorStr()+" "+orderDetails.getMakeStr()+"<BR>");}//1-单品,2-套餐if(orderDetails.getDishType() == 2){//如果是套餐则需要查询套餐详情QueryWrapper wrapperType = new QueryWrapper();wrapperType.eq("storeId",printer.getStoreId());wrapperType.eq("packageId",orderDetails.getDishId());List<PackageDetail> packageDetails = packageDetailService.list(wrapperType);if(packageDetails.size()>0){for(PackageDetail packageDetail : packageDetails){sb.append(printThreeData("["+packageDetail.getDishName()+"]",packageDetail.getNum()+"*份","")+"<BR>");}}}}sb.append("<BR>");sb.append("------------------------------<BR>");sb.append(""+printTwoData("点单员:", orderInfo.getManagerName()==null?"自配送外卖":orderInfo.getManagerName())+"<BR>");sb.append(""+printTwoData("出菜窗口:",printer.getWindowName()+"")+"<BR>");sb.append(""+printTwoData("整单备注:", orderInfo.getRemark()==null?"":orderInfo.getRemark())+"<BR>");// 通过POST请求,发送打印信息到服务器RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000)// 读取超时.setConnectTimeout(30000)// 连接超时.build();CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpPost post = new HttpPost(ps.getUrl());List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("user", ps.getUser()));String STIME = String.valueOf(System.currentTimeMillis() / 1000);nvps.add(new BasicNameValuePair("stime", STIME));nvps.add(new BasicNameValuePair("sig", signature(ps.getUser(), ps.getUserKey(), STIME)));nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));// 固定值,不需要修改nvps.add(new BasicNameValuePair("sn", printer.getAppId()));nvps.add(new BasicNameValuePair("content", sb.toString()));nvps.add(new BasicNameValuePair("times", "1"));// 打印联数CloseableHttpResponse response = null;String result = null;try {post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));response = httpClient.execute(post);int statecode = response.getStatusLine().getStatusCode();if (statecode == 200) {HttpEntity httpentity = response.getEntity();if (httpentity != null) {// 服务器返回的JSON字符串,建议要当做日志记录起来result = EntityUtils.toString(httpentity);}}} catch (Exception e) {e.printStackTrace();} finally {close(response, post, httpClient);}log.info("调用云打印机后厨打印{}",result);}log.info(printer.getWindowName()+":结算成功,后厨打印结束- - - - - - ");}}}

只需要根据官网介绍,一步一步来就可以了。根据自身个性化需求自行调整。

第10节、飞鹅云打印机对接调用相关推荐

  1. php 飞鹅云打印机_ThinkPHP飞鹅云打印接口

    /** * 飞鹅云打印 */ namespace Common\Util; class Feieyun { public $host; public $port; public $path; publ ...

  2. java对接飞鹅云实现自定义订单自动打印(完整流程)

    记录一下,以为对接好最少要半天,没想到总的下来十几分钟就对接好了 准备: 1:首先你要有一台打印机器,这里就不多说了 2:注册飞鹅云账号,最好是企业认证一下,拿到下方的两个值后面有用 3:绑定打印机, ...

  3. JAVA对接飞鹅订单打印机

    飞鹅官网:登录 由于飞鹅的官网没有完整的代码API,所以我整理了一份,直接照搬,然后把里面的格式改一下,就可以用了. 第一步要先认证:(推荐企业认证,我是个人测试,所以用的个人认证) 第二步   绑定 ...

  4. 非官方云小票机SDK,支持飞鹅云,芯烨云,易联云,快递100,映美云,中午云,佳博云,优声云,365智能云打印等

    云小票机SDK-cloud-print 非官方云小票机SDK,支持飞鹅云,芯烨云,易联云,快递100,映美云,中午云,佳博云,优声云,365智能云打印等 请求日志开启 \openphp\cloudPr ...

  5. php云打印机,云打印机对接说明

    4. 开发对接API接口(方案一:回调方式) 特别声明: 为更好的保护合作伙伴的数据隐私,又能实现完整的订单打印过程,需要商米与合作伙伴共同努力一起实现.以下文档约定了云打印机通讯的两部分接口,一部分 ...

  6. 飞鹅小票打印机嵌入生成指定小程序页面二维码的解决方案 | 扫普通链接二维码打开小程序示例 | 生成正方形小程序码

    部分朋友不需要打印机的业务,则 忽略有关打印机的部分 即可. 其他有关 微信小程序配置的介绍是通用的!通用的! 生成正方形小程序码,请看 标题一. 扫普通链接生成的二维码打开小程序,请看 标题二. 目 ...

  7. 飞猪云打印机——打印样式

    public static string PrintMenu(String deviceSN, OrderPrintDto orderPrintDto){string str;string wayEa ...

  8. 飞鹅打印机怎么样?飞鹅打印机好用吗?飞鹅打印机怎么知道订单是否漏单?

    外卖打印机怎么选?飞鹅打印机好用吗? 飞鹅智能云打印机产品专注于云打印的解决方案和技术服务提供.2019 年飞鹅已经成为国内先进的云打印服务提供商,主要是服务美团.饿了么客户,产品主要优势:自动接单. ...

  9. 看到怒飞垂云的 一节课讲明白所有串口协议-Mavlink/ubx/诺瓦泰/NMEA/自定义协议/变帧长/定帧长 也是很有感触

    看到怒飞垂云的 一节课讲明白所有串口协议-Mavlink/ubx/诺瓦泰/NMEA/自定义协议/变帧长/定帧长 也是很有感触 http://www.nufeichuiyun.com/?page_id= ...

  10. 微信小程序如何对接无线票据热敏云打印机

    动智能设备的出现,已经完全占据了我们的生活,智能化互联网时代的到来,带给我们的便利我想不用说大家都是深有体会,随着小程序的火爆,随之带动着用户对打印的需求,那么,微信小程序是如何对接打印机的呢,这篇文 ...

最新文章

  1. 过滤请求绝技,布隆过滤器与布谷鸟过滤器
  2. HDU 6143 Killer Names (组合数学+DP)
  3. eclipse android maven插件,添加Eclipse“Android Library”项目并通过Maven构建
  4. 常用UI控件之UIControl
  5. PHP 分布式集群中session共享问题以及session有效期的设置
  6. python画互动图_利用Python画出运动图像
  7. 《悟透JavaScript》进展汇报
  8. android 地图定位报错,百度地图定位迷之报错(latitude : 4.9E-324 lontitude : 4.9E-324)
  9. 等保三级核心-物理安全
  10. 通过分享后的百度网盘链接获取外链图片地址
  11. php 月份查询生日_PHP判断日期(生日)格式是否正确合法的方法
  12. LeetCode K站中转内最便宜的航班(回溯法、动态规划)
  13. 台式电脑怎么添加计算机硬盘,如何在台式电脑增加硬盘的安装及设置方法
  14. C#编程,输入里程数和耗油量,计算每升的里程数,程序中使用异常处理器,当输入的里程数或耗油量无法转换成double值时处理FormatException。
  15. 如何申请百度API Key
  16. c语言程序设计猴博士资源,猴博士课堂C语言学习笔记第三弹
  17. 【一生一芯01】预学习-PA1总结
  18. 本次操作由于这台计算机的限制而被取消u盘,u盘显示但打不开提示“本次操作由于这台计算机的限制而被取消请与你的系统管理员联系”...
  19. 一本读懂BERT(实践篇)
  20. 安全测试(四) Wi-Fi安全 渗透测试 网络安全 公共场的免费Wi-Fi真的安全吗?个人信息被监控窃听风险 如: ARP攻击 SSL攻击 DNS安全 加密方式等 枚举实战应用案例 信息窃听获取

热门文章

  1. Pinia的写法探索
  2. 使用keras框架训练神经网络时显卡内存使用很大很大的解决方案
  3. ERROR | Corrupt JPEG data: 111 extraneous bytes before marker 0xd9...
  4. photoshop设计精讲精练 学习笔记(一)
  5. 苹果gamecenter未能连接服务器,win7系统GameCenter无法连接服务器的解决方法
  6. python base64解密
  7. 简单易懂!推荐给自学python的小项目实战!
  8. LeetCode 714. 买卖股票的最佳时机含手续费(动态规划)
  9. 如何在NVivo中使用编码条探索编码?
  10. matplotlib之pyplot模块——向子图添加箭头(arrow())