using System.Text; using Newtonsoft.Json.Linq; using System.Security.Cryptography; namespace SmsDemo { /// /// 短信网关接口(JSON)请求demo示例(c#) /// // 使用接口网关地址替换 http://sms.ue35.net/sms // 短信批量发送接口 // http://sms.ue35.net/sms/api/sendMessageMass // 短信一对一发送接口 // http://sms.ue35.net/sms/api/sendMessageOne // 回执状态获取接口 // http://sms.ue35.net/sms/api/getReport // 上行回复获取接口 // http://sms.ue35.net/sms/api/getUpstream // 查询余额接口 // http://sms.ue35.net/sms/api/getBalance // 提交短信模板接口 // http://sms.ue35.net/sms/api/createTemplate // 查询短信模板接口 // http://sms.ue35.net/sms/api/queryTemplates // 报备签名接口 // http://sms.ue35.net/sms/api/addSignature // 查询签名接口 // http://sms.ue35.net/sms/api/querySignature public class SmsDemo { /// 测试 public static void Main(string[] args) { string userName = "xxx";// 帐号用户名 string password = "xxx";// 帐号接口密码,跟登录密码不一样 string address = "http://sms.ue35.net/sms";// 接口网关地址 ,例如:http://127.0.0.1:8001/sms sendMessageMass(userName, password, address);//群发短信 // sendMessageOne(userName, password, address);//一对一短信 // getReport(userName, password, address);//获取回执 // getUpstream(userName, password, address);//获取上行 // getBalance(userName, password, address);//余额 // createTemplate(userName, password, address);//提交短信模板 // queryTemplates(userName, password, address);//查询短信模板 // addSignature(userName, password, address);//报备签名 // querySignature(userName, password, address);//查询签名 } /// /// 帐号认证信息 /// public static JObject getSign(string userName, string password) { // 时间戳,北京时间五分钟内有效 TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); long timestamp = (long)ts.TotalMilliseconds; //sign鉴权 MD5Crypto(userName + timestamp + MD5Crypto(password)) string sign = MD5Crypto(userName + timestamp + MD5Crypto(password)); JObject jsons = new JObject(); jsons.Add("userName", userName); jsons.Add("timestamp", timestamp); jsons.Add("sign", sign); return jsons; } /// /// 短信批量发送接口 /// /// 用户名 /// 密码 /// IP和端口 public static void sendMessageMass(string userName, string password, string address) { string url = "http://address:port/sms/api/sendMessageMass"; url = url.Replace("http://address:port/sms", address); //短信内容 string content = "【小小科技】您的验证码是123456"; //发送手机号码,最大数量不得超过 10000 个号码,系统将自动去除重复号码 List phones = new List { "18278810211", "18278810212", "18278810213" }; //每次发送10000个号码 int size = 10000; int length = phones.Count; int index = length / size; int r = length % size; if (r > 0) { index++; } List phoneList = new List(); for (int i = 0; i < index; i++) { if (r > 0 && i == index - 1) { phoneList = phones.GetRange(i * size, r); } else { phoneList = phones.GetRange(i * size, size); } JObject jsons = new JObject(); jsons.Add("content", content); jsons.Add("phoneList", JArray.FromObject(phoneList)); jsons.Merge(getSign(userName, password));// 帐号认证信息,五分钟内有效,防止过期 postUrl(url, jsons); } } /// /// 短信一对一发送接口 /// /// 用户名 /// 密码 /// IP和端口 public static void sendMessageOne(string userName, string password, string address) { string url = "http://address:port/sms/api/sendMessageOne"; url = url.Replace("http://address:port/sms", address); // 数组形式,每个 JSON 对象包含短信内容和号码数据,最大 1000 个号码。 int size = 1000; JArray messageList = new JArray(); string content = "【一一科技】您的验证码是{%变量%}"; string[,] list = new string[,] { { "18278810214", "123456" }, { "18278810215", "486512" }, { "18278810216", "889945" } }; for (int i = 0; i < list.GetLength(0); i++) { JObject msg = new JObject(); msg.Add("phone", list[i, 0]); msg.Add("content", content.Replace("{%变量%}", list[i, 1])); messageList.Add(msg); if (i > 0 && (i + 1) % size == 0) { JObject jsons = new JObject(); jsons.Add("messageList", messageList); jsons.Merge(getSign(userName, password));// 帐号认证信息,五分钟内有效,防止过期 postUrl(url, jsons); messageList = new JArray(); } } if (messageList.Count > 0) { JObject jsons = new JObject(); jsons.Add("messageList", messageList); jsons.Merge(getSign(userName, password));// 帐号认证信息,五分钟内有效,防止过期 postUrl(url, jsons); } } /// /// 回执状态获取接口 /// /// 用户名 /// 密码 /// IP和端口 public static void getReport(string userName, string password, string address) { string url = "http://address:port/sms/api/getReport"; url = url.Replace("http://address:port/sms", address); JObject jsons = getSign(userName, password); postUrl(url, jsons); } /// /// 上行回复获取接口 /// /// 用户名 /// 密码 /// IP和端口 public static void getUpstream(string userName, string password, string address) { string url = "http://address:port/sms/api/getUpstream"; url = url.Replace("http://address:port/sms", address); JObject jsons = getSign(userName, password); postUrl(url, jsons); } /// /// 查询余额接口 /// /// 用户名 /// 密码 /// IP和端口 public static void getBalance(string userName, string password, string address) { string url = "http://address:port/sms/api/getBalance"; url = url.Replace("http://address:port/sms", address); JObject jsons = getSign(userName, password); postUrl(url, jsons); } /// /// 提交短信模板接口 /// /// 用户名 /// 密码 /// IP和端口 public static void createTemplate(string userName, string password, string address) { string url = "http://address:port/sms/api/createTemplate"; url = url.Replace("http://address:port/sms", address); //变量部分统一用 {%变量%} string content = "【校园科技】验证码{%变量%}"; JObject jsons = new JObject(); jsons.Add("content", content); jsons.Merge(getSign(userName, password));// 帐号认证信息,五分钟内有效,防止过期 postUrl(url, jsons); } /// /// 查询短信模板接口 /// /// 用户名 /// 密码 /// IP和端口 public static void queryTemplates(string userName, string password, string address) { string url = "http://address:port/sms/api/queryTemplates"; url = url.Replace("http://address:port/sms", address); JObject jsons = getSign(userName, password); postUrl(url, jsons); } /// /// 报备签名接口 /// /// 用户名 /// 密码 /// IP和端口 public static void addSignature(string userName, string password, string address) { string url = "http://address:port/sms/api/addSignature"; url = url.Replace("http://address:port/sms", address); JArray signatureList = new JArray(); signatureList.Add("【小哈科技】"); signatureList.Add("【小小科技】"); JObject jsons = new JObject(); jsons.Add("signatureList", signatureList); jsons.Merge(getSign(userName, password));// 帐号认证信息,五分钟内有效,防止过期 postUrl(url, jsons); } /// /// 查询签名接口 /// /// 用户名 /// 密码 /// IP和端口 public static void querySignature(string userName, string password, string address) { string url = "http://address:port/sms/api/querySignature"; url = url.Replace("http://address:port/sms", address); JObject jsons = getSign(userName, password); postUrl(url, jsons); } // md5加密 public static string MD5Crypto(string key) { var sb = new StringBuilder(); var md5 = MD5.Create(); byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(key)); for (int i = 0; i < hashBytes.Length; i++) sb.Append(hashBytes[i].ToString("x2")); return sb.ToString(); } // POST请求方式,JSON格式数据 public static string postUrl(string url, JObject data) { var result = ""; try { string postData = data.ToString(); var httpClient = new HttpClient(); var timeout = TimeSpan.FromSeconds(10); var cont = new StringContent(postData, Encoding.UTF8, "application/json"); Console.WriteLine($"{cont.Headers}请求地址: {url}\n请求参数:\n{postData}"); var response = httpClient.PostAsync(url, cont).Result; result = response.Content.ReadAsStringAsync().Result; Console.WriteLine($"请求结果: {result}\n\n"); } catch (Exception ex) { Console.WriteLine($"Error occurred: {ex.Message}"); } return result; } } }