批量数据请求接口(新)
接口请求说明
此接口既可接收单条呼叫数据,也可接收批量呼叫数据
接口地址
POST http://dms.icsoc.net/api/v3/data
Header说明
实例 | |
---|---|
Method | post |
Content-Type | application/json |
body参数说明
字段 | 类型 | 是否必填 | 示例值 | 说明 |
---|---|---|---|---|
vccId | Long | 是 | 20024 | 企业ID,系统生成,一个企业ID下可以创建指定个数的项目,创建项目接口中需要此参数 |
proId | Long | 是 | 10613 | 项目id,创建项目后生成唯一的id |
sign | String | 是 | 参见sign签名方式 | 签名后的字符串 |
data | String | 是 | 参见data字段说明 | 加密后的数据(加密方式采用AES CBC key为token,iv为token的前16为,加密方式见“加密说明”) |
sign签名方式
data类型说明
字段类型:
JSONObject(单条请求)
JSONArray(批量请求,最多可以包含100个请求对象)
data字段说明
字段 | 类型 | 是否必填 | 示例值 | 说明 |
---|---|---|---|---|
jobId | String | 否 | 75898002 | 应用方的自定义id,回调时原样返回 |
phoneNum | String | 是 | 18971511111 | 被叫号码 |
callNum | Integer | 否 | 1 | 号码的重呼次数,如callNum=1,那么该号码最多呼叫2次,默认呼叫1次+重呼1次=2次 (注:备份被叫最多重呼10次) |
trunkNum | String | 否 | 01089658000 | 主叫号码 |
callInterval | Integer | 否 | 60 | 最大外呼振铃时长,若设置为60秒,如果被叫60秒不接听即停止呼叫,不影响接通通话,默认为60秒 |
templateInfo | String(JSON格式) | 否 | {"date": "2020年2月29号", "customer_name": "张三"} | IVR模板信息,该信息中包含IVR中自定义字段的值,具体的字段视IVR模板的信息 另可参见TTS语音合成播报说明 |
customParams | String(JSON格式) | 否 | {"group":"1", "key":"aaa"} | 该字段用于传递自定义参数信息,该信息中包含所有自定义字段的值,该字段中的所有字段用于回调时原样返回 |
playParams | String(JSON格式) | 否 | {"playTimes": 3} | 动态播报内容方式及方式设置,详细见“playParams参数说明 |
playParams字段说明
字段 | 类型 | 是否必填 | 示例值 | 说明 |
---|---|---|---|---|
playTimes | Integer | 否 | 1 | 播放次数 |
单条请求数据格式样例:
{
vccId : "",
proId : "",
sign : "",
data : {
jobId : "",
phoneNum : "",
callNum : "",
callInterval : "",
trunkNum : "",
templateInfo : {},
customParams : {}
}
}
批量请求数据格式样例:
{
vccId : "",
proId : "",
sign : "",
data : [
{
jobId : "",
phoneNum : "",
callNum : "",
callInterval : "",
trunkNum : "",
templateInfo : {},
customParams : {}
},
{
jobId : "",
phoneNum : "",
callNum : "",
callInterval : "",
trunkNum : "",
templateInfo : {},
customParams : {}
}
]
}
加密说明
接口返回说明
接口返回结果说明
返回结果为json串:
单条:
{
"code":200,
"msg":"任务接收成功.",
"data":
{
"call_record_id": taskId
}
}
批量:
{
"code": 200,
"msg": "任务接收成功.",
"failedArray": [{
"msg": "号码为空",
"code": 404,
"phoneNum": "",
"jobId":"传递过来的jobId"
}, {
"msg": "号码【911000010】对应的模板为空",
"code": 407,
"phoneNum": "911000010",
"jobId":"传递过来的jobId"
}]
}
failedArray:批量调用中的返回属性,标识批量调用时哪些数据没有校验通过;在所有data数据校验通过的情况下此字段为空;
批量接口不会返回"call_record_id";
code说明如下:
code | 说明 |
---|---|
200 | ok |
400 | 参数为空、vccId参数为空、proId参数为空 |
402 | 签名sign为空 |
403 | 签名错误 |
404 | 号码为空 |
405 | 重呼次数格式不正确,必须为整数 |
406 | 呼叫时长格式不正确,必须为整数 |
407 | 语音模板为空 |
408 | 号码当天请求次数超过设置的最大次数(默认设置为5000次),用于防止单个号码请求次数过多 |
410 | 不是有效固话 |
411 | proId不存在 |
412 | data字段为空 |
413 | 解密失败 |
414 | data解析参数失败(非JSON) |
415 | 批量数据量超过限制(默认100条) |
416 | 该主叫号码已删除或禁用 |
417 | 未开通国际号码外呼业务 |
500 | 接口内部错误 |
回调说明
回调参数
回调签名方式
回调解密验证
回调结果说明
demo案例
java 案例
public static List buildList(List<String> phoneNos){
List<Map> list = new ArrayList<>();
for (String phoneNo : phoneNos){
Map map = new TreeMap();
Map person = new TreeMap();
person.put("chaptername","aa");
person.put("chapternumber","bb");
person.put("classname","cc");
map.put("templateInfo",person);
map.put("phoneNum", phoneNo);
map.put("customParams", JSON.parseObject("{\"callRecordId\":\"868462732\",\"bussinessType\":\"2\",\"envType\":\"0\",\"callAppId\":\"1\"}"));
list.add(map);
}
return list;
}
public static String createParam(List<String> phoneNos) throws Exception {
String vccId = "200024";
String proId = "10256";
String token = "c4bd85d78c04484caeab9144c2e16ea447528eab";
List<Map> list = buildList(phoneNos);
Map<String, Object> data = new TreeMap<>();
data.put("vccId", vccId);
data.put("proId", proId);
String mapStr = "";
if (CollectionUtils.isNotEmpty(list)){
if (list.size() == 1){
mapStr = JSON.toJSONString(list.get(0));
}else {
mapStr = JSON.toJSONString(list);
}
}
//加密
// data.put("data", AESCoder.callBackEncrypt(token, mapStr));
//不加密
data.put("data", mapStr);
String sign = SHACoder.SHA1(mapStr + token);
data.put("sign", sign);
return JSON.toJSONString(data);
}
public static void main(String[] args) throws Exception {
//----------单条调用------------------
// List<String> phoneNos = new ArrayList<>();
// phoneNos.add("189...电话号码");
// HttpUtil.postHttp("http://dms.icsoc.net/api/v3/data", createParam(phoneNos));
//----------单条调用------------------
//----------批量调用----------------------
for (int y=0;y<1;y++){
List<String> phoneNos = new ArrayList<>();
for (int i=0;i<99;i++){
String phone = "911"+String.format("%05d", i)+y;
phoneNos.add(phone);
}
HttpUtil.postHttp("http://dms.icsoc.net/api/v3/data",createParam(phoneNos));
}
//----------批量调用----------------------
}
public class SHACoder {
private final static String KEY_SHA_1 = "SHA-1";
/**
* SHA加密得到字节数组
*
* @param data
* byte[] 待加密数据
* @return byte[]
* @throws NoSuchAlgorithmException
*/
public static byte[] encryptSHA(byte[] data)
throws NoSuchAlgorithmException {
MessageDigest sha = MessageDigest.getInstance(KEY_SHA_1);
sha.update(data);
return sha.digest();
}
/**
* SHA加密后的字节数组再交给BASE64加密得到最终的加密字符串
*
* @param data
* byte[] 待加密数据
* @return String
* @throws NoSuchAlgorithmException
*/
public static String encryptSHAString(byte[] data)
throws NoSuchAlgorithmException {
return BASE64Coder.encodeBase64URLSafeString(SHACoder.encryptSHA(data));
}
private SHACoder() {
}
public static String SHA1(String decript) {
try {
byte messageDigest[] = encryptSHA(decript.getBytes());
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
}