c#短信发送-使用ASE加密,短信内容使用json传输,响应内容返回json的处理方案

使用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; }
    }
View Code

 3.创建响应内容实体类 

/// <summary>
    /// 接收发送信息
    /// </summary>
    public class MessageResponse
    {
        /// <summary>
        /// 结果代码,0000为全部成功,0001为部分成功,其他为失败,详见下面代码表
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 结果说明
        /// </summary>
        public string Message { 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; }
    }
View Code

 

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;//返回结果
            try
            {
                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();
            }
            catch(Exception e)
            {
                throw e;
            }
            return returncode;
        }

6.调用信息

            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了。然后就可以通过实体类使用数据了。
            MessageResponse reveMess = JsonConvert.DeserializeObject<MessageResponse>(retrunJson);
            if(reveMess!=null)
            {
                Response.Write(reveMess.Message);
            }   

 

posted @ 2020-04-09 20:34  TechSingularity  阅读(339)  评论(0编辑  收藏  举报