跳到主要内容

如何实现对接飞鹅小票机打印

场景/功能描述

在轻流发起提交数据后,希望可以直接将该条数据打印显示出来。

思路流程

方式一:使用代码块来实现

缺点:需要每次手动点击触发 优点:配置内容较少

逻辑思路:通过使用代码块直接调用飞鹅打印机接口进行打印,并返回操作结果

方式二:通过使用代码块+webhook来进行实现

缺点:配置内容较多 优点:可以实现数据提交即可打印,无需手动触发打印

逻辑思路:通过使用代码块来进行签名以及时间戳的计算,流程中配置webhook来进行接口的调用

配置过程

这里均以方式二来进行配置完成

调用API接口准备工作

这里使用的是飞鹅(中国站)的接口,所以以调用飞鹅为例,其他打印机类接口请自行查找。

飞鹅云后台: https://admin.feieyun.com/

飞鹅接口文档:http://help.feieyun.com/home/doc/zh;nav=1-1

使用接口前先根据使用准备流程申请完成

image.png

【必接】添加打印机(可以通过调用接口去添加)或者在飞鹅管理后台进行人工添加

这里以调用接口来进行添加为例:

接口地址:http://help.feieyun.com/home/doc/zh;nav=1-0

image.png

表单设计

image.png

代码块(可以设置成自动触发)
  • 代码注释:

  • qf_field.{批量添加打印机$$186CB6091$$}:表单批量添加打印机表格字段

  • field_174971929和field_174971930分别为批量添加打印机表格的子字段

  • field_id获取方式https://exiao.yuque.com/rlf3k1/oanb79/ml0u7lgb3wa0vhiz?singleDoc# 《如何在代码块中分辨表格的不同列》

  • user和UKEY需要替换成后台具体值

const crypto = require('crypto');

// 当前时间戳
const stime = Math.floor(Date.now() / 1000).toString();

const table = qf_field.{批量添加打印机$$186CB6091$$};

const newtable = table.map(item => {
const newItem = {
"sn": item.field_174971929,
"key": item.field_174971930
};
return newItem;
});

let printerContent = "";

for (let i = 0; i < newtable.length; i++) {
const { sn, key } = newtable[i];
printerContent += `${sn} # ${key}`;

if (i !== newtable.length - 1) {
printerContent += "\n";
}
}

// 请求参数
const params = {
printerContent: printerContent,
apiname: 'Open_printerAddlist',
user: 'name***ie@163.com',
UKEY: 'eJQj*******HULvb',
stime: stime,
};

// 拼接参数
const message = params.user + params.UKEY + params.stime;

// 创建SHA1哈希对象
const sha1 = crypto.createHash('sha1');

// 对拼接后的字符串进行SHA1加密
const encrypted = sha1.update(message).digest('hex');

// 添加 sign 参数
params.sig = encrypted;

qf_output={params}
代码测试

image.png

解析配置

image.png

字段接收配置

image.png

流程webhook设计

image.png

image.png

发起添加打印机

image.png

小票机打印表单设计

接口地址:http://help.feieyun.com/home/doc/zh;nav=1-1

image.png

image.png

比如这里我需要打印小票的排版为:标题居中放大,然后换行写内容,并且内容居中

所以排版格式为:<CB>标题</CB><BR><C>内容</C>

表单设计

image.png

代码块
  • 代码注释:

  • qf_field.{标题$$18735D670$$}和qf_field.{内容$$18735D671$$}为表单中标题以及内容字段

  • content:将排版格式配置好,之后需要将前面的标题title以及内容cont带入进来

  • sn、user和UKEY需要替换成具体后台的值

const crypto = require('crypto');

// 当前时间戳
const stime = Math.floor(Date.now() / 1000).toString();

// 请求参数
const title=qf_field.{标题$$18735D670$$};
const cont=qf_field.{内容$$18735D671$$};
const params = {
content: `<CB>${title}</CB><BR><C>${cont}</C>`,
sn: '92**7417',
apiname: 'Open_printMsg',
user: 'name***ie@163.com',
UKEY: 'eJQ***7HULvb',
stime: stime,
};

// 拼接参数
const message = params.user + params.UKEY + params.stime;

// 创建SHA1哈希对象
const sha1 = crypto.createHash('sha1');

// 对拼接后的字符串进行SHA1加密
const encrypted = sha1.update(message).digest('hex');

// 添加 sign 参数
params.sig = encrypted;

qf_output={params}
代码测试

image.png

解析配置

image.png

字段接收配置

image.png

流程webhook设计

image.png

image.png

发起数据进行打印

image.png

PS:

使用方式一的话,这里只展示代码块的写法

const crypto = require('crypto');
const axios = require('axios');
const qs = require('qs');
// 当前时间戳
const stime = Math.floor(Date.now() / 1000).toString();

// 请求参数
const bt="标题";
const nr="内容";
const params = {
content: `<CB>${bt}</CB><BR><C>${nr}</C>`,
sn: '922447417',
apiname: 'Open_printMsg',
user: 'na*****63.com',
UKEY: 'eJQ***87HULvb',
stime: stime,
};

// 拼接参数
const message = params.user + params.UKEY + params.stime;

// 创建SHA1哈希对象
const sha1 = crypto.createHash('sha1');

// 对拼接后的字符串进行SHA1加密
const encrypted = sha1.update(message).digest('hex');

// 添加 sign 参数
params.sig = encrypted;

console.log(params); // 输出加密后的签名

//调用接口进行打印操作
let data = qs.stringify(params);

let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'http://api.feieyun.cn/Api/Open/',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data : data
};

axios(config)
.then(function (res) {
const resdata=res.data;
qf_output={'data':res.data}
});