📖文档介绍

🔖本协议基于HTTP服务,使用POST请求方式,
请求为表单数据格式( a=1&b=2&c=3 ),应答为JSON格式数据( {"a":"1","b":"2","c":"3"} )。
字段命名方式:驼峰法。
统一请求和响应编码:UTF-8
接口地址为:网关地址(https://xxx.xxx)加详细调用地址(/xx/xx)
时间戳与当前时间不得少于5秒
sign参数计算规则:多个指定参数值组合成字符串后计算MD5 32位小写结果
假设要求:MD5(userId + content + timestamp + MD5(password))
参数:userId(帐号ID)=test
password(帐号密码)=123
content=测试内容
timestamp=1596254400000
计算:MD5(password)=202cb962ac59075b964b07152d234b70
组合字符串:test测试内容1596254400000202cb962ac59075b964b07152d234b70
sign结果:MD5(组合字符串)=92f4abe1a56cac716bc790c93149a3ae

注意:md5计算结果皆为小写

👬短信批量发送

调用地址

地址:/sms/api_v1.php?mod=sendMessageGroup

参数名

类型

必填

说明

userId

String

账号ID

phone

String

接收短信的手机号,每个手机号使用,分隔 (英文逗号)

tempId

String

短信模板ID

signName

String

短信签名ID

timeStamp

Long

10位时间戳

varParam

String

变量参数,短信模板变量对应的实际值(JSON格式)。传入实际值需经过base64编码。支持传入多个参数,示例:{"name":"张三","number":"1390000****"} base64编码后:eyJuYW1lIjoi1cXI/SIsIm51bWJlciI6IjEzOTAwMDAqKioqIn0=

sign

String

签名,用于校验权限。计算方式:md5(userId+md5(passWord)+tempId+signName+timeStamp+source_id)

注意:md5计算结果皆为小写

source_id

int

渠道ID,填写渠道后会自动使用快要到期的套餐进行发送。不填写渠道ID则会自动使用短信签名ID所属渠道

正常返回信息

{
    "code":1,            //API状态码
    "msg":"处理成功",     //返回提示
    "smsCount":1,        //返回消耗短信条数
    "messageLogId":1070  //返回短信日志ID
}

异常返回信息

{
    "code":-1,           //API状态码
    "msg":"sign鉴权失败", //返回提示
}

实例代码

PHP实例代码作者:小杜同学

<?php
$userId=''; //用户ID
$password=''; //用户密码
$phone=''; //要发送的手机号,多个手机号使用英文逗号分隔
$signName=''; //签名ID
$tempId=''; //模板ID
$varParam=json_encode(array('code'=>'123456')); //模板变量参数
$varParam=base64_encode($varParam); //将json转换为base64编码
$source_id=''; //渠道ID
$time=time(); //时间戳
$sign=md5($userId.md5($password).$tempId.$signName.$time.$source_id); //计算签名
$data="userId={$userId}&phone={$phone}&tempId={$tempId}&signName={$signName}&timeStamp={$time}&varParam={$varParam}&sign={$sign}&source_id={$source_id}"; //拼接待提交数据
$res=curl_request('https://xxx'.'/sms/api_v1.php?mod=sendMessageGroup',$data); //发送请求
die($res); //返回请求返回的数据

/**
 * 使用CURL进行HTTP请求
 * 参数1:访问的URL,
 * 参数2:post数据(不填则为GET),
 * 参数3:提交的$cookies,
 * 参数4:是否返回$cookies
 */
function curl_request($url, $post = '', $cookie = '', $returnCookie = 0, $httpHeader=[]){
    $curl = curl_init();
    
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
    // curl_setopt($curl, CURLOPT_REFERER, "http://XXX");
    
    if ($post) {
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
    }
    if ($cookie) {
        curl_setopt($curl, CURLOPT_COOKIE, $cookie);
    }
    curl_setopt($curl, CURLOPT_HTTPHEADER, $httpHeader);
    curl_setopt($curl, CURLOPT_HEADER, $returnCookie);
    curl_setopt($curl, CURLOPT_TIMEOUT, 60);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    $data = curl_exec($curl);
    if (curl_errno($curl)) {
        return '';
    }
    curl_close($curl);
    if ($returnCookie) {
        list($header, $body) = explode("\r\n\r\n", $data, 2);
        preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);
        $info['cookie'] = substr($matches[1][0], 1);
        $info['content'] = $body;
        return $info;
    } else {
        return $data;
    }
}

?>

C#实例代码作者:彭大摩

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

class Program
{
    static async Task Main(string[] args)
    {
        string userId = ""; // 用户ID
        string password = ""; // 用户密码
        string phone = ""; // 要发送的手机号,多个手机号使用英文逗号分隔
        string signName = ""; // 签名ID
        string tempId = ""; // 模板ID
        string sourceId = ""; // 渠道ID
        // 创建模板变量参数对象
        var templateParams = new TemplateParams
        {
            Code = "123456"
        };

        string varParam = SerializeAndBase64Encode(templateParams);

        
        long timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); // 时间戳
        string sign = CalculateMD5Hash(userId + CalculateMD5Hash(password).ToLower() + tempId + signName + timestamp + sourceId); // 计算签名

        string apiUrl = "https://xxx/sms/api_v1.php?mod=sendMessageGroup";
        string postData = $"userId={userId}&phone={phone}&tempId={tempId}&signName={signName}&timeStamp={timestamp}&varParam={varParam}&sign={sign.ToLower()}&source_id={sourceId}";

        using (HttpClient httpClient = new HttpClient())
        {
            var content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded");
            HttpResponseMessage response = await httpClient.PostAsync(apiUrl, content);

            if (response.IsSuccessStatusCode)
            {
                string responseContent = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseContent);
            }
            else
            {
                Console.WriteLine($"HTTP Error: {response.StatusCode}");
            }
        }
    }

    static string CalculateMD5Hash(string input)
    {
        using (var md5 = System.Security.Cryptography.MD5.Create())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);
            byte[] hashBytes = md5.ComputeHash(inputBytes);
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < hashBytes.Length; i++)
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }

            return sb.ToString();
        }
    }

    static string SerializeAndBase64Encode(object obj)
    {
        string json = JsonConvert.SerializeObject(obj);
        byte[] bytes = Encoding.UTF8.GetBytes(json);
        return Convert.ToBase64String(bytes);
    }
}

class TemplateParams
{
    [JsonProperty("code")]
    public string Code { get; set; }
}

更多实例代码等待添加

API状态码

code

说明

1

处理成功

-1

sign鉴权失败

-2

无可用套餐(次数用尽)

-3

渠道信息不存在

-4

对接模块不存在

-5

用户身份不存在

-6

用户身份无接口对接权限

-7

超出接口群发最多数

-8

超出网页群发最多数

-9

用户未实名

-10

用户已被封禁

-11

时间戳异常

-12

短信模板不存在

-13

短信模板中变量未被全部替换

-14

短信签名不存在

-15

短信签名暂未审核通过

-16

短信模板暂未审核通过

-17

收信手机号不能为空

-18

IP未加入白名单

⭐获取账户信息

调用地址

地址:/sms/api_v1.php?mod=getUserInfo

参数名

类型

必填

说明

userId

String

账号ID

pass

String

密码

正常返回信息

{
    "code":1,                    //API状态码
    "msg":"处理成功",             //返回提示
    "data":{
        "money":"0.00",      //余额
        "addtime":"1684046219",  //注册时间
        "endtime":"1693547371",  //登录时间
        "rna":"1",               //1=已实名。0=未实名
        "ipWhiteList":"127.0.0.1"//IP白名单,每个IP使用\n分隔
    }
}

异常返回信息

{
    "code":-1,           //API状态码
    "msg":"身份错误",     //返回提示
}

💡获取所有套餐信息

调用地址

地址:/sms/api_v1.php?mod=getPackOrderList

参数名

类型

必填

说明

userId

String

账号ID

pass

String

密码

正常返回信息

{
    "code":1,                    //API状态码
    "msg":"处理成功",             //返回提示
    "data":[
        {
            "id":"1",                     //用户套餐ID
            "order_num":"2023061700001",  //订单号
            "name":"通知短信体验包",        //套餐名称
            "expire_time":"1718529186",   //到期时间戳
            "source_id":"1"               //渠道ID
            "num":"100"                   //剩余短信条数
            "uid":"1"                     //账号ID
            "state":"1"                   //套餐状态,1=正常,0=不可用
            "packId":"1"                  //购买时套餐源ID
        }
    ]
}

异常返回信息

{
    "code":-1,           //API状态码
    "msg":"身份错误",     //返回提示
}