1、注意事项
- 号码格式:国家代码+正确的手机号码。例如中国:8617321342252
- 国际接口支持国际国内发送,默认关闭,需要发国内权限找对应商务申请开通,号码加中国代码:+86,发往大陆的短信内容一定要加签名、内容一定要报备。发送国外无需报备,签名不限制。签名最好以【253 云通讯】为格式例子。
- 发国外营销短信最好用英文或者当地语言,需要中文发送的话请联系商务确认你要发送的国家运营商是否支持中文。
- 短信收到慢,或者收不到请联系对应商务或者客服,一般是号码格式错误,内容触发审核,或者国内号码黑名单。
2、接口加签方式
- 将请求头参数名 nonce 及所有请求体参数名(key)以 ASCII 码表顺序升序排列;
- 排序后把参数值非空的参数名(key)参数值(value)依次进行字符串拼接,拼接处不包含其他字符;
- 拼接成包含 kv 的长串后,在该长串的尾部拼接账号的 password,得到签名字符串的组装;
- 最后对签名字符串,使用 MD5 算法加密后,得到 MD5 加密密文后转为小写,即为请求头 sign 值
2.1加签代码示例
package com.angi;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.DigestUtils;
import java.util.Map;
import java.util.TreeMap;
/**
-
参数进行加签验签
*/
public class SignUtil {
private static final String SIGN = "sign";
/**
- 发送加签
*/
public static String sendSign(String password, TreeMap<String, String> paramMap) {
paramMap.remove(SIGN);
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
if (StringUtils.isNotBlank(entry.getValue())) {
sb.append(entry.getKey());
sb.append(entry.getValue());
}
}
return DigestUtils.md5DigestAsHex((sb.toString() + password).getBytes()).toLowerCase();
}
/**
- 发送验签
*/
public static boolean verifySendSign(String password, TreeMap<String, String> paramMap) {
String sign = paramMap.remove(SIGN);
String computed = sendSign(password, paramMap);
return StringUtils.equals(sign, computed);
}
public static void main(String[] args) {
/*发送加签验签/
String password = "4Z7bMS1eLI6895";
TreeMap<String, String> paramMap = new TreeMap<>();
paramMap.put("nonce", "222222");
paramMap.put("account", "IM6742671");
paramMap.put("mobile", "8618916198813");
paramMap.put("msg", "test 666661 ");
System.out.println(JSONObject.toJSONString(paramMap));
String sign = sendSign(password, paramMap);
System.out.println(sign);
TreeMap<String, String> newParamMap = new TreeMap<>(paramMap);
newParamMap.put(SIGN, sign);
boolean validate = verifySendSign(password, newParamMap);
System.out.println(validate);
}
}
2.2DEMO文件
3、发送短信接口
3.1协议说明
3.2请求头
名称 | 类型 | 是否必填 | 示例 | 说明 |
---|
sign | string | 是 | 1234abcd7890qwer | 签名,请参照加签方式生成签名 |
nonce | string | 是 | 1653043349000 | 时间戳 |
3.3请求体
名称 | 类型 | 是否必填 | 示例 | 说明 |
---|
account | string | 是 | I6000000 | API 账号,字母I开头,登录云通讯获取 |
mobile | string | 是 | 8615800000000 | 手机号码,格式(区号+手机号码),例如:8615800000000,其中 86 为中国的区号, 区号前不使用 00 开头,15800000000 为接收短信的真实手机号码。5-20 位 |
msg | string | 是 | 【253】Your verification code is:2530 | 短信内容。长度不能超过 2000 个字符 |
senderId | string | 否 | SENDER0 | 用户收到短信之后显示的发件人,国内不支持自定义,国外支持,但是需要提前和运营商沟通注册,具体请与 TIG 对接人员确定 |
templateId | string | 否 | 1019599473 | 短信模板ID,登录后台模板报备界面查看。 |
uid | string | 否 | 123456 | 客户自定义批次号,64 字以内 |
tdFlag | int | 否 | 1 | 退订开启标识,1 开启;0 或 null 关闭 |
3.4响应
名称 | 类型 | 示例 | 说明 |
---|
code | string | 0 | 状态码: 0-成功,非 0 标识失败 |
message | string | 提交成功 | 状态码说明 |
data | string | null | 消息体 |
返回示例-成功
{
"code": "0",
"message": "提交成功",
"data": {
"messageId": "162575412960104448"
}
}
注:code 为响应状态码,可参照提交响应状态码对比
4、接口响应码
状态码 | 描述 |
---|
0 | 提交成功 |
101 | 账号不存在 |
102 | 密码错误 |
103 | 拉取条数格式错误 |
104 | 拉取条数不在范围内 |
105 | 批次编号大于128位 |
106 | 短信内容长度错误(>3000) |
108 | 手机号码格式错误(>20或<5) |
109 | 手机号码个数错误 |
110 | 余额不足 |
112 | 产品配置错误 |
114 | 请求ip和绑定ip不一致 |
115 | 没有开通国内短信权限 |
116 | 账号已删除或禁用 |
117 | 接入号长度超过20位 |
119 | 账号不在当前节点 |
123 | 短信内容不能为空 |
124 | 简介或验证码不能为空 |
125 | 特定客户手机号码同一天不能超过十次 |
126 | 定时短信发送时间不能为空 |
126 | 定时短信发送时间错误 |
128 | 账号长度错误(>50或<=0) |
129 | 产品价格配置错误 |
130 | 未知异常 |
131 | 超过日发送上限 |
132 | 超过月发送上限 |
133 | 超过发送上限 |
134 | 超过反投诉限制 |
135 | 变量数量不符 |
135 | 短信内容不匹配 |
5、状态报告状态码
状态码 | 描述 |
---|
DELIVRD | 短信发送成功 |
UNKNOWN | 未知短信状态 |
REJECTD | 短信被短信中心拒绝 |
MBBLACK | 目的号码是黑名单号码 |
SM11 | 网关验证号码格式错误 |
SM12 | 我方验证号码格式错误 |
其他 | 网关内部状态 |
6、计费规则说明
1.国际短信不支持 emoji 表情
2.编辑器中空格都会以”."表示,如出现不带”.”的空格则说明有隐藏代码,会导致 1 条短信算成 2 条的风险请留意。
3.国际号码必须添加对应国家的区域号,例如中国号码 86138****1234,86 为中国区号。
4.发送中国号码殷时,短信内容必须以[签名]开头,然名内容为: 公司或品牌名称,字数要求 2-80 个字符,运营商规定必填。
5.发送中国号码段时,内容合法,不能发送房产、发票、移民等国家法律法规严格禁止的内容。
6.超链接地址请写在短信内容中,便于核实,部分安卓系统存在超链接识别问题,需在超链接前后添加空
格。
7.短信中含非英文字符按中文计费。
没有更多了