使用ASE加密,短信内容使用json传输,响应内容返回json,进行处理。
1.引用
using System.Text; using System.Security.Cryptography; using System.Net; using System.IO; using Newtonsoft.Json; using System.Collections.Generic;
2.创建短信内容实体类
/// <summary> /// 发送信息的实体类 /// </summary> public class MessageInfo { /// <summary> /// 发送电话 /// </summary> public List<string> mobiles { get; set; } /// <summary> /// 发送内容 /// </summary> public string smscontent { get; set; } /// <summary> /// 扩展码 /// </summary> public string extendedcode { get; set; } /// <summary> /// 发送时间 /// </summary> public string sendtime { get; set; } }
3.创建响应内容实体类
/// <summary> /// 接收发送信息 /// </summary> public class RecevieMessage { /// <summary> /// 结果代码,0000为全部成功,0001为部分成功,其他为失败,详见下面代码表 /// </summary> public string code { get; set; } /// <summary> /// 结果说明 /// </summary> public string massage { get; set; } /// <summary> /// 消息ID,后续状态报告的返回以消息ID与手机号码作为依据,消息ID与手机号码确定唯一短信发送 /// </summary> public string sms_id { get; set; } /// <summary> /// 接收到的号码总数 /// </summary> public string total_number { get; set; } /// <summary> /// 成功处理的号码数量 /// </summary> public string success_number { get; set; } /// <summary> /// 无法处理的号码数量 /// </summary> public string fail_number { get; set; } /// <summary> /// 无法处理的号码以及原因集合 /// </summary> public List<string> fail_mobiles { get; set; } }
4.使用用户密钥针对当前系统时间(yyyyMMddHHmmssSSS)进行AES加密签名,短信平台会校验此时间,如果签名时间小于或者大于系统时间10分钟以上,则拒绝此请求
/// <summary> /// 获取签名 ///使用用户密钥针对当前系统时间(yyyyMMddHHmmssSSS)进行AES加密签名,短信平台会校验此时间, ///如果签名时间小于或者大于系统时间10分钟以上,则拒绝此请求 /// </summary> /// <returns></returns> public string GetSign() { String date = DateTime.Now.ToString("yyyyMMddHHmmssfff");//获取当前时间 byte[] keyArray = UTF8Encoding.UTF8.GetBytes("");//秘钥 byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(date); //加密,需要引用System.Security.Cryptography RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); String sign = ""; for (int ip = 0; ip < resultArray.Length; ip++) { int int32 = Convert.ToInt32(resultArray[ip]); string hexStr = Convert.ToString(int32, 16); if (hexStr.Length == 1) { hexStr = '0' + hexStr; } sign = sign + hexStr; } return sign; }
5.发送信息
/// <summary> /// 发送信息 /// </summary> /// <param name="content"></param> /// <returns></returns> public string SendSmsInfo(string content) { string Key = "";//公钥 string sign = GetSign();//获取签名 string PostUrl = "http.......?public_key=" + Key + "&sign=" + sign + "&sms_data=" + content; string returncode = string.Empty;//返回结果 HttpWebRequest wRequest = (HttpWebRequest)WebRequest.Create(PostUrl);//创建请求 wRequest.Method = "Post"; wRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; HttpWebResponse wResponse = (HttpWebResponse)wRequest.GetResponse(); Stream stream = wResponse.GetResponseStream(); if (wResponse.StatusCode == HttpStatusCode.OK) { StreamReader reader = new StreamReader(wResponse.GetResponseStream(), Encoding.UTF8); returncode = reader.ReadToEnd();//返回结果 } stream.Close(); wResponse.Close(); return returncode; }
6.调用信息
protected void Page_Load(object sender, EventArgs e) { MessageInfo message = new MessageInfo();//创建发送实体类 List<string> mobilelist = new List<string>(); mobilelist.Add("189****6530"); message.mobiles = mobilelist; message.smscontent = "信息内容"; message.extendedcode = null; message.sendtime = null; //把我们初始化好的对象传入即可,引用Newtonsoft.Json string json = JsonConvert.SerializeObject(message); string RetrunJson= SendSmsInfo(json); // 这个需要引入Newtonsoft.Json这个DLL并using //传入我们的实体类还有需要解析的JSON字符串这样就OK了。然后就可以通过实体类使用数据了。 RecevieMessage reveMess = JsonConvert.DeserializeObject<RecevieMessage>(RetrunJson); Response.Write(reveMess.massage);//展示返回结果 }