一、功能说明
该接口文档适用于:调用账号下的批量模板,在自有系统或网页中,批量生成不同内容的子码。
对接后,可在自有系统里,批量生成二维码。无需导出数据在我们平台再导入数据生码。例如可对接产品、资产等管理系统,当有新增数据时,可根据规则自动拼接,在系统里批量生成对应产品、资产二维码。
生成的码与系统后台的信息关联,当后台对信息进行修改时,扫码的内容会自动更新。可以通过扫码快速获取最新的资产信息,无需手动更新或重新生码。
二、接口调用说明
URL
https://open-api.cli.im/cli-open-platform-service/v1/dynamicQrcode/dynamicSingleCreate
HTTP请求方式
POST
数据协议
application/json
请求参数
参数名称 | 是否必须 | 类型 | 说明 |
template_num | 是 | string | 批量模板编号,例如M10 |
api_key | 是 | string | 用户api key |
sign | 是 | string | 签名,生成方式见加签方式 |
values | 否 | string | 模板字段值数组,不支持音频、视频字段,字段没有值传入空字符串。对于不同字段格式,传入参数说明如下 |
可变内容类型传入说明:
类型 | 传入参数 |
单行文本、多行文本、数字 | 传入内容字符串,如:"消防栓" |
日期 | 传入日期,如:"2022-10-23" |
单选项 | 传入选中项数,如:1,说明选中第一项 |
多选项 | 传入选中项数,英文逗号分隔,如:"1,2",说明选中第一项,第二项 |
定位 | 传入json数据格式,如不需要导航功能,传入地址即可,如:"{"address":"浙江省 |
图片、文件 | 传入公网可访问静态资源地址,如:"https://cli-api.oss-cn-hangzhou-internal.aliy |
返回参数
参数名称 | 类型 | 说明 |
code | int | 状态码,0-成功 |
message | string | 返回信息 |
data | json | 图片参数,详解如下 |
date:
参数名称 | 类型 | 说明 |
web_ur | string | 码内容 |
qrstyle_url | string | 二维码图片地址,保留一天有效 |
加签方式
1、将请求参数按照键的字典序排列,然后用 & 拼接成字符串,例如使用以下请求参数:
{ "template_num":"M8", "api_key":"CLb87ea759f877622c", "values":["消防栓","A23154","宁波市","张成杰","13023214212","资产运营 部","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg"] }
排序拼接后字符串为:
api_key=CLb87ea759f877622c&template_num=M8&values=["消防栓","A23154","宁波市","张成 杰","13023214212","资产运营部","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg"]
拼接系统提供的用户api secret到上述字符串最后,假设secret为ddb42b7299b90cb5e0fd6c41e154c15d,得到如下字符串:
api_key=CLb87ea759f877622c&template_num=M8&values=["消防栓","A23154","宁波市","张成 杰","13023214212","资产运营部","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg"]ddb42b7299b90cb5e0fd6c41e154c15d
将以上字符串进行md5加密,全部取小写,得到签名sign:
a6bb0eb47c5bdd67bdfccbf0a0aec903
将得到签名sign放入原请求参数体中,如下所示:
{ "template_num":"M8", "api_key":"CLb87ea759f877622c", "values":["消防栓","A23154","宁波市","张成杰","13023214212","资产运营 部","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg"], "sign":"a6bb0eb47c5bdd67bdfccbf0a0aec903" }
请求参数示例
{ "template_num":"M8",
"api_key":"CLb87ea759f877622c",
"values":["消防栓","A23154","宁波市","张成杰","13023214212","资产运营 部","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg"],
"sign":"a6bb0eb47c5bdd67bdfccbf0a0aec903" }
返回示例
{ "data": {
"web_url": "http://qr61.cn/og9o2j/qYu20pX",
"qrstyle_url": "https://ncstatic.clewm.net/free/2023/1108/15/myzxdwuonl2keoqjj4yo5yy3h3heacvx.png" },
"code": 0,
"message": "操作成功" }
错误码
错误码 | 错误码取值 | 解决方案 |
200 | 成功 | 成功 |
400 | 请求的数据格式不符! | 请检查参数正确性 |
40000 | 系统繁忙,请稍后再试 | 系统可能维护升级中,等待后续功能恢复 |
40001 | 参数错误 | 检查传递参数是否按照文档规范 |
40004 | 签名错误 | 请检查签名方式 |
三、调用代码示例
活码批量模板页选择一个模板,如果没有模板,也可以先创建一个模板。 创建批量模板
在草料工作台,批量模板列表下,找到需要调用的模板,以M8模板为准:
在模板详情页开通活码API,即可获取到APIkey和API_secret。还可设置调用范围,可选择公开或者指定IP域名可调用。
进入模板修改页可以看到M8模板有8个可变字段,第7个为图片字段,第8个为文件字段,以下为示例代码:
package org.cli.platform.service.util;
import com.alibaba.fastjson.JSON;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class CliApiV1Demo {
public static void main(String[] args) throws IOException { String secret = "ddb42b7299b90cb5e0fd6c41e154c15d";
Map<String,Object> params = new HashMap<>(); params.put("api_key", "CLb87ea759f877622c"); params.put("template_num", "M8");
params.put("values", new String[]{"消防栓","A23154","宁波市","张成 杰","13023214212","资产运营部","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg","https://cli-api.oss-cn-hangzhou- internal.aliyuncs.com/example/2023/1108/15/44/i9528fa4d7ba3-60fa-4ea2-b467- 60fbb0c44621_source.jpg"});
String data = JSON.parseObject(JSON.toJSONString(params)).entrySet().stream().sorted(Map.Entry. comparingByKey()).map(entry -> entry.getKey() + "=" + entry.getValue()).collect(Collectors.joining("&"));
data += secret; String sign = DigestUtils.md5Hex(data); params.put("sign", sign);
//生成url请求
URL url = new URL("https://open-api.cli.im/cli-open-platform- service/v1/dynamicQrcode/dynamicSingleCreate"); HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "keep-Alive");
connection.setRequestProperty("Content-Type", "application/json");
connection.connect(); OutputStream out = connection.getOutputStream(); out.write(JSON.toJSONString(params).getBytes(StandardCharsets.UTF_8));
out.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
StringBuilder content = new StringBuilder(); String line; while (null != (line = br.readLine())) { content.append(line);
}
System.out.println(content);
}
}