产品 | 付款日期 | 状态 |
---|---|---|
产品1 | 23/11/2013 | 待发货 |
产品2 | 10/11/2013 | 发货中 |
产品3 | 20/10/2013 | 待确认 |
产品4 | 20/10/2013 | 已退货 |
产品 | 付款日期 | 状态 |
---|---|---|
产品1 | 23/11/2013 | 待发货 |
产品2 | 10/11/2013 | 发货中 |
产品3 | 20/10/2013 | 待确认 |
产品4 | 20/10/2013 | 已退货 |
产品 | 付款日期 | 状态 |
---|---|---|
产品1 | 23/11/2013 | 待发货 |
产品2 | 10/11/2013 | 发货中 |
产品3 | 20/10/2013 | 待确认 |
产品4 | 20/10/2013 | 已退货 |
名称 | 类型 | 是否必须 | 示例值 | 描述 |
---|---|---|---|---|
login_code | String | 是 | admin | 用户名 |
passwd | String | 是 | 12@wqlOOp | 用户密码 |
名称 | 类型 | 示例值 | 描述 |
---|---|---|---|
user_id | String | 89983 | 用户的ID |
access_token | String | 5791C334BB0BBFE022C56CC07E3FB682 | 用户Token,Token是登录时服务器返回的一个字符串,用来校验是否为该用户,具有时效性 |
access_token_expire | String | 7200 | 用户Token失效时间(单位:秒),平台TOKEN默认有效时间为2小时,请在TOKEN将要失效时重新登录获取新的TOKEN。 |
ret_code | String | 见下表 | 状态码(成功或者异常) |
curl -X POST 'http://api.cloudmas.cn/v/1.0/login' \
-H 'Content-Type:application/x-www-form-urlencoded;charset=utf-8' \
-d 'login_code=admin' \
-d 'passwd=123456' \
{
"ovit_mas_ecuser_login_response": {
"access_token": "52fc4824-b6ed-43c6-bda5-ea768ebfe656",
"user_id": "2",
"current_balance": 2.32,
"ret_code": {
"code_value": "SUCCESS",
"code_describle": "登录成功"
},
"access_token_expire": "300"
}
}
状态码 | 名称 | 描述 |
---|---|---|
SUCCESS | 成功 | 发送成功 |
ERROR | 服务器不可用 | 请联系技术支持人员 |
OVER_REQUEST_LIMIT_TIMES | 超速 | 短信通知,使用同一签名、对同一手机号发送短信通知,允许每天50条(自然日) |
ACCOUT_UNUSUAL | 账户异常 | 请联系技术支持人员 |
SEVICE_STOPED | 业务停机 | 请及时充值 |
SIGNATURE_NOT_LEGAL | 签名不合法 | 请输入合法的签名 |
MOBILE_NO_FORMOT_ERROR | 手机号格式错误 | 请输入合法的手机格式 |
OUT_OF_MOBILE_NUMBER | 手机号数据超过200个 | 请限制手机号码数量 |
PARAMTER_ERROR | 参数错误 | 请输入合法参数 |
MESSAGE_TEXT_ILEGAL | 短信内容非法 | 短信内容不应该包含敏感信息 |
EX_CODE_FORMAT_ERROR | 扩展码格式错误 | 请输入合法扩展码 |
ACCOUNT_NOT_EXISTS | 账户不存在 | 请使用正确的账号信息登录 |
TYPE_ERROR | 类型错误 | 发送短信的类型错误,请重新核实 |
名称 | 类型 | 是否必须 | 示例值 | 描述 |
---|---|---|---|---|
user_id | String | 是 | 123456 | 用户的ID |
timestamp | String | 是 | 20170303115701 | 用户发送请求的时间戳,本接口中使用"yyyyMMddHHmmss"格式,时区为GMT+8 |
sign_no | String | 是 | 29345 | 签名编码,是一个随机字符串 |
ext | String | 否 | 1 | 扩展码,用户自定义,用于校验 |
mobiles | String | 是 | ["17298398293","13670000000"] | 请求的手机号码,使用JSONArray的方式设置 |
content | String | 是 | 这是一个短信内容测试 | 短信内容 |
type | String | 是 | 1 | 短信发送的类型(1表示短信验证码,2表示短信通知,3表示运营短信,默认不填为3) |
mac | String | 是 | 5791C334BB0BBFE022C56CC07E3FB682 | 计算方法请参考下方MAC校验算法描述 |
名称 | 类型 | 示例值 | 描述 |
---|---|---|---|
ret_code | String | 见下表 | 状态码(成功或者异常) |
batch_no | String | 20170303144200XXXX999999 | 每次合法发送生成一个唯一批次号 |
为了防止API调用过程中的安全考虑,调用发送API都需要携带MAC校验值,服务端会根据请求参数,对其进行验证,MAC不合法的请求将会被拒绝。MAC校验的过程大体过程如下:
说明:MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
Java签名示例代码
public static String macCa1(Map<String, String> params, String accessToken) throws IOException {
// 第一步:给参数排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
for (String key : keys) {
String value = params.get(key);
// org.apache.commons.lang3.StringUtils
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
query.append(key).append(value);
}
}
// 第三步:使用MD5加密
byte[] bytes;
//accessToken是登录时发送给用户的Token,在这里添加
query.append(accessToken);
bytes = encryptMD5(query.toString());
// 第四步:把二进制转化为大写的十六进制
return byte2hex(bytes);
}
private static byte[] encryptMD5(String inputStr){
byte[] digest = null;
try{
MessageDigest mdi = MessageDigest.getInstance("MD5");
mdi.update(inputStr.getBytes("UTF-8"));
digest = mdi.digest();
} catch (NoSuchAlgorithmException e) {
System.err.println("无此加密方式,加密出错!");
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
System.err.println("不支持的编码方式!");
e.printStackTrace();
}
return digest;
}
private static String byte2hex(byte[] bytes) {
StringBuilder macString = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i]&0xFF);
if (hex.length() == 1) {
macString.append("0");
}
macString.append(hex.toUpperCase());
}
return macString.toString();
}
PHP签名示例代码
<?php
/**
* 发送普通短信
***/
$mobiles = array('13888888888','13666666666')
$accessToken = 'c618e5d1-699e-48b0-bd72-faea0df63d9b';
$arrParams = array(
'user_id'=>'2', // 用户的ID
'timestamp'=>'20170705144000', //用户发送请求的时间戳
'sign_no'=>'3Pu1kEAT', // 签名编码
'ext'=>'1', //扩展码
'mobiles'=>$mobiles, //请求的手机号码
'content'=>'公司春节祝福短信', //短信内容
'type'=>'1' //短信发送的类型
);
macCal($arrParams,$accessToken);
function macCal($arrParams,$accessToken){
$postdata = '';
foreach ($arrParams as $key=>$value){
$postdata.= ($key.$value);
}
$postdata.= $accessToken;
echo $postdata;
md5($postdata)
}
?>
curl -X POST 'http://api.cloudmas.cn/v/1.0/sendSms' \
-H 'Content-Type:application/x-www-form-urlencoded;charset=utf-8' \
-d 'user_id=123456' \
-d 'timestamp=20170303115701' \
-d 'sign_no=29345' \
-d 'ext=1' \
-d 'mobiles=17298398293,13670000000' \
-d 'content=这是一个短信内容测试' \
-d 'priority=3' \
-d 'mac=5791C334BB0BBFE022C56CC07E3FB682' \
{
"ovit_mas_sms_send_response": {
"batch_no": "20170322153331777894342",
"ret_code": {
"mobile_status": "MOBILE_NO_FORMOTN",
"mobile_status_describle": "发送成功,有3个手机号是未知段号",
"mobile_unknown": "1900001235,19000012351,11000012351",
"code_value": "SUCCESS",
"code_describle": "短信正在发送"
},
"account_bal": 2.32
}
}
{
"error_response": {
"code_value": "MAC_",
"code_describle": "MAC错误,请检查MAC计算方法是否正确"
}
}
状态码 | 名称 | 描述 |
---|---|---|
SUCCESS | 成功 | 发送成功 |
ERROR | 服务器不可用 | 请联系技术支持人员 |
OVER_REQUEST_LIMIT_TIMES | 超速 | 短信通知,使用同一签名、对同一手机号发送短信通知,允许每天50条(自然日) |
ACCOUT_UNUSUAL | 账户异常 | 请联系技术支持人员 |
SEVICE_STOPED | 业务停机 | 请及时充值 |
SIGNATURE_NOT_LEGAL | 签名不合法 | 请输入合法的签名 |
MOBILE_NO_FORMOT_ERROR | 手机号格式错误 | 请输入合法的手机格式 |
OUT_OF_MOBILE_NUMBER | 手机号数据超过200个 | 请限制手机号码数量 |
PARAMTER_ERROR | 参数错误 | 请输入合法参数 |
TEMPLATE_PARAMS_ERROR | 模板短信参数错误 | 请检查参数templateName、templateParams、type |
NO_TEMPLATE_CONTENT | 模板内容获取失败 | 根据模板名称获取模板内容失败,请检查模板配置以及用户ECID信息 |
MESSAGE_TEXT_ILEGAL | 短信内容非法 | 短信内容不应该包含敏感信息 |
EX_CODE_FORMAT_ERROR | 扩展码格式错误 | 请输入合法扩展码 |
ACCOUNT_NOT_EXISTS | 账户不存在 | 请使用正确的账号信息登录 |
TYPE_ERROR | 类型错误 | 发送短信的类型错误,请重新核实 |
MAC_INVALID | MAC无效 | 请求合法性校验错误:请检查MAC计算方法是否正确 |
ACCESS_TOKEN_INVALID | access_token失效或不存在 | 请求合法性校验错误:请重新登录获取access_token |
TIMESTAMP_INVALID | timestamp无效 | 请求合法性校验错误:光谷云信服务端允许客户端请求最大时间误差为10分钟,时区为GMT+8 |
名称 | 类型 | 是否必须 | 示例值 | 描述 |
---|---|---|---|---|
user_id | String | 是 | 123456 | 用户的ID |
timestamp | String | 是 | 20170303115701 | 用户发送请求的时间戳,本接口中使用"yyyyMMddHHmmss"格式,时区为GMT+8 |
sign_no | String | 是 | 29345 | 签名编码,是一个随机字符串 |
ext | String | 否 | 1 | 扩展码,用户自定义,用于校验 |
mobiles | String | 是 | ["17298398293","13670000000"] | 请求的手机号码,使用JSONArray的方式设置 |
templateName | String | 是 | 公司春节祝福短信 | 模板短信的名称 |
templateParams | String | 是 | ["张三","100001", "Charles Babbage"] | 模板参数,使用JSONArray的方式设置,支持变量内空格 |
type | String | 是 | 1 | 短信发送的类型(此处模板短信固定为1) |
mac | String | 是 | 5791C334BB0BBFE022C56CC07E3FB682 | 计算方法请参考下方MAC校验算法描述 |
名称 | 类型 | 示例值 | 描述 |
---|---|---|---|
ret_code | String | 见下表 | 状态码(成功或者异常) |
batch_no | String | 20170303144200XXXX999999 | 每次合法发送生成一个唯一批次号 |
为了防止API调用过程中的安全考虑,调用发送API都需要携带MAC校验值,服务端会根据请求参数,对其进行验证,MAC不合法的请求将会被拒绝。MAC校验的过程大体过程如下:
说明:MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
Java签名示例代码
public static String macCa1(Map<String, String> params, String accessToken) throws IOException {
// 第一步:给参数排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
for (String key : keys) {
String value = params.get(key);
// org.apache.commons.lang3.StringUtils
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
query.append(key).append(value);
}
}
// 第三步:使用MD5加密
byte[] bytes;
//accessToken是登录时发送给用户的Token,在这里添加
query.append(accessToken);
bytes = encryptMD5(query.toString());
// 第四步:把二进制转化为大写的十六进制
return byte2hex(bytes);
}
private static byte[] encryptMD5(String inputStr){
byte[] digest = null;
try{
MessageDigest mdi = MessageDigest.getInstance("MD5");
mdi.update(inputStr.getBytes("UTF-8"));
digest = mdi.digest();
} catch (NoSuchAlgorithmException e) {
System.err.println("无此加密方式,加密出错!");
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
System.err.println("不支持的编码方式!");
e.printStackTrace();
}
return digest;
}
private static String byte2hex(byte[] bytes) {
StringBuilder macString = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i]&0xFF);
if (hex.length() == 1) {
macString.append("0");
}
macString.append(hex.toUpperCase());
}
return macString.toString();
}
PHP签名示例代码
<?php
/**
* 发送模板短信
***/
$mobiles = array('13888888888','13666666666')
$accessToken = 'c618e5d1-699e-48b0-bd72-faea0df63d9b';
$arrParams = array(
'user_id'=>'2', // 用户的ID
'timestamp'=>'20170705144000', //用户发送请求的时间戳
'sign_no'=>'3Pu1kEAT', // 签名编码
'ext'=>'1', //扩展码
'mobiles'=>$mobiles, //请求的手机号码
'templateName'=>'公司春节祝福短信', // 模板短信的名称
'templateParams'=>'张三 100001', // 模板参数(多个参数时用空格分隔)
'type'=>'1' //短信发送的类型
);
macCal($arrParams,$accessToken);
function macCal($arrParams,$accessToken){
$postdata = '';
foreach ($arrParams as $key=>$value){
$postdata.= ($key.$value);
}
$postdata.= $accessToken;
echo $postdata;
md5($postdata)
}
?>
curl -X POST 'http://api.cloudmas.cn/v/1.0/sendSms' \
-H 'Content-Type:application/x-www-form-urlencoded;charset=utf-8' \
-d 'user_id=123456' \
-d 'timestamp=20170303115701' \
-d 'sign_no=29345' \
-d 'ext=1' \
-d 'mobiles=17298398293,13670000000' \
-d 'content=这是一个短信内容测试' \
-d 'priority=3' \
-d 'mac=5791C334BB0BBFE022C56CC07E3FB682' \
{
"ovit_mas_sms_send_response": {
"batch_no": "20170322153331777894342",
"ret_code": {
"mobile_status": "MOBILE_NO_FORMOTN",
"mobile_status_describle": "发送成功,有3个手机号是未知段号",
"mobile_unknown": "1900001235,19000012351,11000012351",
"code_value": "SUCCESS",
"code_describle": "短信正在发送"
},
"account_bal": 2.32
}
}
{
"error_response": {
"code_value": "MAC_",
"code_describle": "MAC错误,请检查MAC计算方法是否正确"
}
}
状态码 | 名称 | 描述 |
---|---|---|
SUCCESS | 成功 | 发送成功 |
ERROR | 服务器不可用 | 请联系技术支持人员 |
OVER_REQUEST_LIMIT_TIMES | 超速 | 短信通知,使用同一签名、对同一手机号发送短信通知,允许每天50条(自然日) |
ACCOUT_UNUSUAL | 账户异常 | 请联系技术支持人员 |
SEVICE_STOPED | 业务停机 | 请及时充值 |
SIGNATURE_NOT_LEGAL | 签名不合法 | 请输入合法的签名 |
MOBILE_NO_FORMOT_ERROR | 手机号格式错误 | 请输入合法的手机格式 |
OUT_OF_MOBILE_NUMBER | 手机号数据超过200个 | 请限制手机号码数量 |
PARAMTER_ERROR | 参数错误 | 请输入合法参数 |
TEMPLATE_PARAMS_ERROR | 模板短信参数错误 | 请检查templateName、templateParams、type参数值 |
NO_TEMPLATE_CONTENT | 根据模板名称获取模板内容失败 | 模板内容获取失败,请检查模板名称和用户ECID |
MESSAGE_TEXT_ILEGAL | 短信内容非法 | 短信内容不应该包含敏感信息 |
EX_CODE_FORMAT_ERROR | 扩展码格式错误 | 请输入合法扩展码 |
ACCOUNT_NOT_EXISTS | 账户不存在 | 请使用正确的账号信息登录 |
TYPE_ERROR | 类型错误 | 发送短信的类型错误,请重新核实 |
MAC_INVALID | MAC无效 | 请求合法性校验错误:请检查MAC计算方法是否正确 |
ACCESS_TOKEN_INVALID | access_token失效或不存在 | 请求合法性校验错误:请重新登录获取access_token |
TIMESTAMP_INVALID | timestamp无效 | 请求合法性校验错误:光谷云信服务端允许客户端请求最大时间误差为10分钟,时区为GMT+8 |
名称 | 类型 | 是否必须 | 示例值 | 描述 |
---|---|---|---|---|
user_id | String | 是 | 123456 | 用户的ID |
timestamp | String | 是 | 20170303115701 | 用户发送请求的时间戳,本接口中使用"yyyyMMddHHmmss"格式,时区为GMT+8 |
sign_no | String | 是 | 29345 | 签名编码,是一个随机字符串 |
ext | String | 否 | 1 | 扩展码,用户自定义,用于校验 |
mobiles | String | 是 | 17298398293,13670000000 | 请求的手机号码 |
content | String | 是 | 这是一个短信内容测试 | 短信内容 |
type | String | 是 | 1 | 短信发送的类型(1表示短信验证码,2表示短信通知,3表示运营短信,默认不填为3) |
mac | String | 是 | 5791C334BB0BBFE022C56CC07E3FB682 | 计算方法请参考下方MAC校验算法描述 |
名称 | 类型 | 示例值 | 描述 |
---|---|---|---|
ret_code | String | 见下表 | 状态码(成功或者异常) |
batch_no | String | 20170303144200XXXX999999 | 每次合法发送生成一个唯一批次号 |
为了防止API调用过程中的安全考虑,调用发送API都需要携带MAC校验值,服务端会根据请求参数,对其进行验证,MAC不合法的请求将会被拒绝。MAC校验的过程大体过程如下:
说明:MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
Java签名示例代码
public static String macCa1(Map<String, String> params, String accessToken) throws IOException {
// 第一步:给参数排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
for (String key : keys) {
String value = params.get(key);
// org.apache.commons.lang3.StringUtils
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
query.append(key).append(value);
}
}
// 第三步:使用MD5加密
byte[] bytes;
//accessToken是登录时发送给用户的Token,在这里添加
query.append(accessToken);
bytes = encryptMD5(query.toString());
// 第四步:把二进制转化为大写的十六进制
return byte2hex(bytes);
}
private static byte[] encryptMD5(String inputStr){
byte[] digest = null;
try{
MessageDigest mdi = MessageDigest.getInstance("MD5");
mdi.update(inputStr.getBytes("UTF-8"));
digest = mdi.digest();
} catch (NoSuchAlgorithmException e) {
System.err.println("无此加密方式,加密出错!");
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
System.err.println("不支持的编码方式!");
e.printStackTrace();
}
return digest;
}
private static String byte2hex(byte[] bytes) {
StringBuilder macString = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i]&0xFF);
if (hex.length() == 1) {
macString.append("0");
}
macString.append(hex.toUpperCase());
}
return macString.toString();
}
PHP签名示例代码
<?php
/**
* 发送普通短信
***/
$mobiles = array('13888888888','13666666666')
$accessToken = 'c618e5d1-699e-48b0-bd72-faea0df63d9b';
$arrParams = array(
'user_id'=>'2', // 用户的ID
'timestamp'=>'20170705144000', //用户发送请求的时间戳
'sign_no'=>'3Pu1kEAT', // 签名编码
'ext'=>'1', //扩展码
'mobiles'=>$mobiles, //请求的手机号码
'content'=>'公司春节祝福短信', //短信内容
'type'=>'1' //短信发送的类型
);
macCal($arrParams,$accessToken);
function macCal($arrParams,$accessToken){
$postdata = '';
foreach ($arrParams as $key=>$value){
$postdata.= ($key.$value);
}
$postdata.= $accessToken;
echo $postdata;
md5($postdata)
}
?>
curl -X POST 'http://api.cloudmas.cn/v/1.0/sendSms' \
-H 'Content-Type:application/x-www-form-urlencoded;charset=utf-8' \
-d 'user_id=123456' \
-d 'timestamp=20170303115701' \
-d 'sign_no=29345' \
-d 'ext=1' \
-d 'mobiles=17298398293,13670000000' \
-d 'content=这是一个短信内容测试' \
-d 'priority=3' \
-d 'mac=5791C334BB0BBFE022C56CC07E3FB682' \
{
"ovit_mas_sms_send_response": {
"batch_no": "20170322153331777894342",
"ret_code": {
"mobile_status": "MOBILE_NO_FORMOTN",
"mobile_status_describle": "发送成功,有3个手机号是未知段号",
"mobile_unknown": "1900001235,19000012351,11000012351",
"code_value": "SUCCESS",
"code_describle": "短信正在发送"
},
"account_bal": 2.32
}
}
{
"error_response": {
"code_value": "MAC_",
"code_describle": "MAC错误,请检查MAC计算方法是否正确"
}
}
状态码 | 名称 | 描述 |
---|---|---|
SUCCESS | 成功 | 发送成功 |
ERROR | 服务器不可用 | 请联系技术支持人员 |
OVER_REQUEST_LIMIT_TIMES | 超速 | 短信通知,使用同一签名、对同一手机号发送短信通知,允许每天50条(自然日) |
ACCOUT_UNUSUAL | 账户异常 | 请联系技术支持人员 |
SEVICE_STOPED | 业务停机 | 请及时充值 |
SIGNATURE_NOT_LEGAL | 签名不合法 | 请输入合法的签名 |
MOBILE_NO_FORMOT_ERROR | 手机号格式错误 | 请输入合法的手机格式 |
OUT_OF_MOBILE_NUMBER | 手机号数据超过200个 | 请限制手机号码数量 |
PARAMTER_ERROR | 参数错误 | 请输入合法参数 |
TEMPLATE_PARAMS_ERROR | 模板短信参数错误 | 请检查参数templateName、templateParams、type |
NO_TEMPLATE_CONTENT | 模板内容获取失败 | 根据模板名称获取模板内容失败,请检查模板配置以及用户ECID信息 |
MESSAGE_TEXT_ILEGAL | 短信内容非法 | 短信内容不应该包含敏感信息 |
EX_CODE_FORMAT_ERROR | 扩展码格式错误 | 请输入合法扩展码 |
ACCOUNT_NOT_EXISTS | 账户不存在 | 请使用正确的账号信息登录 |
TYPE_ERROR | 类型错误 | 发送短信的类型错误,请重新核实 |
MAC_INVALID | MAC无效 | 请求合法性校验错误:请检查MAC计算方法是否正确 |
ACCESS_TOKEN_INVALID | access_token失效或不存在 | 请求合法性校验错误:请重新登录获取access_token |
TIMESTAMP_INVALID | timestamp无效 | 请求合法性校验错误:光谷云信服务端允许客户端请求最大时间误差为10分钟,时区为GMT+8 |
名称 | 类型 | 是否必须 | 示例值 | 描述 |
---|---|---|---|---|
user_id | String | 是 | 123456 | 用户的ID |
timestamp | String | 是 | 20170303115701 | 用户发送请求的时间戳,本接口中使用"yyyyMMddHHmmss"格式,时区为GMT+8 |
sign_no | String | 是 | 29345 | 签名编码,是一个随机字符串 |
ext | String | 否 | 1 | 扩展码,用户自定义,用于校验 |
mobiles | String | 是 | 17298398293,13670000000 | 请求的手机号码 |
templateName | String | 是 | 公司春节祝福短信 | 模板短信的名称 |
templateParams | String | 是 | 张三 100001 | 模板参数(多个参数时用空格分隔) |
type | String | 是 | 1 | 短信发送的类型(此处模板短信固定为1) |
mac | String | 是 | 5791C334BB0BBFE022C56CC07E3FB682 | 计算方法请参考下方MAC校验算法描述 |
名称 | 类型 | 示例值 | 描述 |
---|---|---|---|
ret_code | String | 见下表 | 状态码(成功或者异常) |
batch_no | String | 20170303144200XXXX999999 | 每次合法发送生成一个唯一批次号 |
为了防止API调用过程中的安全考虑,调用发送API都需要携带MAC校验值,服务端会根据请求参数,对其进行验证,MAC不合法的请求将会被拒绝。MAC校验的过程大体过程如下:
说明:MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
Java签名示例代码
public static String macCa1(Map<String, String> params, String accessToken) throws IOException {
// 第一步:给参数排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
for (String key : keys) {
String value = params.get(key);
// org.apache.commons.lang3.StringUtils
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
query.append(key).append(value);
}
}
// 第三步:使用MD5加密
byte[] bytes;
//accessToken是登录时发送给用户的Token,在这里添加
query.append(accessToken);
bytes = encryptMD5(query.toString());
// 第四步:把二进制转化为大写的十六进制
return byte2hex(bytes);
}
private static byte[] encryptMD5(String inputStr){
byte[] digest = null;
try{
MessageDigest mdi = MessageDigest.getInstance("MD5");
mdi.update(inputStr.getBytes("UTF-8"));
digest = mdi.digest();
} catch (NoSuchAlgorithmException e) {
System.err.println("无此加密方式,加密出错!");
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
System.err.println("不支持的编码方式!");
e.printStackTrace();
}
return digest;
}
private static String byte2hex(byte[] bytes) {
StringBuilder macString = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i]&0xFF);
if (hex.length() == 1) {
macString.append("0");
}
macString.append(hex.toUpperCase());
}
return macString.toString();
}
PHP签名示例代码
<?php
/**
* 发送模板短信
***/
$mobiles = array('13888888888','13666666666')
$accessToken = 'c618e5d1-699e-48b0-bd72-faea0df63d9b';
$arrParams = array(
'user_id'=>'2', // 用户的ID
'timestamp'=>'20170705144000', //用户发送请求的时间戳
'sign_no'=>'3Pu1kEAT', // 签名编码
'ext'=>'1', //扩展码
'mobiles'=>$mobiles, //请求的手机号码
'templateName'=>'公司春节祝福短信', // 模板短信的名称
'templateParams'=>'张三 100001', // 模板参数(多个参数时用空格分隔)
'type'=>'1' //短信发送的类型
);
macCal($arrParams,$accessToken);
function macCal($arrParams,$accessToken){
$postdata = '';
foreach ($arrParams as $key=>$value){
$postdata.= ($key.$value);
}
$postdata.= $accessToken;
echo $postdata;
md5($postdata)
}
?>
curl -X POST 'http://api.cloudmas.cn/v/1.0/sendSms' \
-H 'Content-Type:application/x-www-form-urlencoded;charset=utf-8' \
-d 'user_id=123456' \
-d 'timestamp=20170303115701' \
-d 'sign_no=29345' \
-d 'ext=1' \
-d 'mobiles=17298398293,13670000000' \
-d 'content=这是一个短信内容测试' \
-d 'priority=3' \
-d 'mac=5791C334BB0BBFE022C56CC07E3FB682' \
{
"ovit_mas_sms_send_response": {
"batch_no": "20170322153331777894342",
"ret_code": {
"mobile_status": "MOBILE_NO_FORMOTN",
"mobile_status_describle": "发送成功,有3个手机号是未知段号",
"mobile_unknown": "1900001235,19000012351,11000012351",
"code_value": "SUCCESS",
"code_describle": "短信正在发送"
},
"account_bal": 2.32
}
}
{
"error_response": {
"code_value": "MAC_",
"code_describle": "MAC错误,请检查MAC计算方法是否正确"
}
}
状态码 | 名称 | 描述 |
---|---|---|
SUCCESS | 成功 | 发送成功 |
ERROR | 服务器不可用 | 请联系技术支持人员 |
OVER_REQUEST_LIMIT_TIMES | 超速 | 短信通知,使用同一签名、对同一手机号发送短信通知,允许每天50条(自然日) |
ACCOUT_UNUSUAL | 账户异常 | 请联系技术支持人员 |
SEVICE_STOPED | 业务停机 | 请及时充值 |
SIGNATURE_NOT_LEGAL | 签名不合法 | 请输入合法的签名 |
MOBILE_NO_FORMOT_ERROR | 手机号格式错误 | 请输入合法的手机格式 |
OUT_OF_MOBILE_NUMBER | 手机号数据超过200个 | 请限制手机号码数量 |
PARAMTER_ERROR | 参数错误 | 请输入合法参数 |
TEMPLATE_PARAMS_ERROR | 模板短信参数错误 | 请检查templateName、templateParams、type参数值 |
NO_TEMPLATE_CONTENT | 根据模板名称获取模板内容失败 | 模板内容获取失败,请检查模板名称和用户ECID |
MESSAGE_TEXT_ILEGAL | 短信内容非法 | 短信内容不应该包含敏感信息 |
EX_CODE_FORMAT_ERROR | 扩展码格式错误 | 请输入合法扩展码 |
ACCOUNT_NOT_EXISTS | 账户不存在 | 请使用正确的账号信息登录 |
TYPE_ERROR | 类型错误 | 发送短信的类型错误,请重新核实 |
MAC_INVALID | MAC无效 | 请求合法性校验错误:请检查MAC计算方法是否正确 |
ACCESS_TOKEN_INVALID | access_token失效或不存在 | 请求合法性校验错误:请重新登录获取access_token |
TIMESTAMP_INVALID | timestamp无效 | 请求合法性校验错误:光谷云信服务端允许客户端请求最大时间误差为10分钟,时区为GMT+8 |
名称 | 类型 | 是否必须 | 示例值 | 描述 |
---|---|---|---|---|
user_id | String | 是 | 123456 | 用户的ID |
timestamp | String | 是 | 20170303115701 | 用户发送请求的时间戳,本接口中使用"yyyyMMddHHmmss"格式,时区为GMT+8 |
batch_no | String | 是 | 20170303144200XXXX999999 | 每次合法发送生成一个唯一批次号 |
mac | String | 是 | 5791C334BB0BBFE022C56CC07E3FB682 | 计算方法请参考下方MAC校验算法描述 |
名称 | 类型 | 示例值 | 描述 |
---|---|---|---|
ret_code | String | 见下表 | 状态码(成功或者异常) |
batch_no | String | 20170303144200XXXX999999 | 每次合法发送生成一个唯一批次号 |
receiveValues | list | 见返回示例 | 返回的值集合 |
为了防止API调用过程中的安全考虑,调用发送API都需要携带MAC校验值,服务端会根据请求参数,对其进行验证,MAC不合法的请求将会被拒绝。MAC校验的过程大体过程如下:
说明:MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
Java签名示例代码
public static String macCal(Map<String, String> params, String accessToken) throws IOException {
// 第一步:给参数排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
for (String key : keys) {
String value = params.get(key);
// org.apache.commons.lang3.StringUtils
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
query.append(key).append(value);
}
}
// 第三步:使用MD5加密
byte[] bytes;
//accessToken是登录时发送给用户的Token,在这里添加
query.append(accessToken);
bytes = encryptMD5(query.toString());
// 第四步:把二进制转化为大写的十六进制
return byte2hex(bytes);
}
private static byte[] encryptMD5(String inputStr){
byte[] digest = null;
try{
MessageDigest mdi = MessageDigest.getInstance("MD5");
mdi.update(inputStr.getBytes("UTF-8"));
digest = mdi.digest();
} catch (NoSuchAlgorithmException e) {
System.err.println("无此加密方式,加密出错!");
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
System.err.println("不支持的编码方式!");
e.printStackTrace();
}
return digest;
}
private static String byte2hex(byte[] bytes) {
StringBuilder macString = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i]&0xFF);
if (hex.length() == 1) {
macString.append("0");
}
macString.append(hex.toUpperCase());
}
return macString.toString();
}
PHP签名示例代码
<?php
/**
* 查询状态报告
***/
$accessToken = 'c618e5d1-699e-48b0-bd72-faea0df63d9b';
$arrParams = array(
'user_id'=>'2', // 用户的ID
'timestamp'=>'20170705144000', //用户发送请求的时间戳
'batch_no'=>'2017070922141400777501381', // 批次号
);
macCal($arrParams,$accessToken);
function macCal($arrParams,$accessToken){
$postdata = '';
foreach ($arrParams as $key=>$value){
$postdata.= ($key.$value);
}
$postdata.= $accessToken;
echo $postdata;
md5($postdata)
}
?>
curl -X POST 'http://api.cloudmas.cn/v/1.0/sendSms' \
-H 'Content-Type:application/x-www-form-urlencoded;charset=utf-8' \
-d 'user_id=123456' \
-d 'timestamp=20170303115701' \
-d 'batch_no=201703031442008652999999' \
-d 'mac=5791C334BB0BBFE022C56CC07E3FB682' \
{
"ovit_mas_sms_query_response": {
"batch_no": "2017041812004800777535212",
"black_mobiles": ["15623629751","15623629752"],
"receiveValues": [
{
"mobile": "15623629758",
"err_code": "0",
"sms_status": "0",
"mobile_recv_time": "2017-04-18 12:01:21"
},
{
"mobile": "18612627358",
"sms_status": "1",
"mobile_recv_time": "2017-04-18 12:05:27"
}
],
"ret_code": {
"code_value": "SUCCESS",
"code_describle": "查询成功"
}
}
}
{
"error_response": {
"code_value": "MAC_INVALID",
"code_describle": "MAC无效,请检查MAC计算方法是否正确"
}
}
状态码 | 名称 | 描述 |
---|---|---|
SUCCESS | 成功 | 发送成功 |
ERROR | 服务器不可用 | 请联系技术支持人员 |
OVER_REQUEST_LIMIT_TIMES | 超速 | 短信通知,使用同一签名、对同一手机号发送短信通知,允许每天50条(自然日) |
ACCOUT_UNUSUAL | 账户异常 | 请联系技术支持人员 |
SEVICE_STOPED | 业务停机 | 请及时充值 |
SIGNATURE_NOT_LEGAL | 签名不合法 | 请输入合法的签名 |
MOBILE_NO_FORMOT_ERROR | 手机号格式错误 | 请输入合法的手机格式 |
OUT_OF_MOBILE_NUMBER | 手机号数据超过200个 | 请限制手机号码数量 |
PARAMTER_ERROR | 参数错误 | 请输入合法参数 |
MESSAGE_TEXT_ILEGAL | 短信内容非法 | 短信内容不应该包含敏感信息 |
EX_CODE_FORMAT_ERROR | 扩展码格式错误 | 请输入合法扩展码 |
ACCOUNT_NOT_EXISTS | 账户不存在 | 请使用正确的账号信息登录 |
TYPE_ERROR | 类型错误 | 发送短信的类型错误,请重新核实 |
MAC_INVALID | MAC无效 | 请求合法性校验错误:请检查MAC计算方法是否正确 |
ACCESS_TOKEN_INVALID | access_token失效或不存在 | 请求合法性校验错误:请重新登录获取access_token |
TIMESTAMP_INVALID | timestamp无效 | 请求合法性校验错误:光谷云信服务端允许客户端请求最大时间误差为10分钟,时区为GMT+8 |