MessageSendDemo


概览

  • 支持.Net版本:2.0以上
  • 依赖三方库 Newtonsoft.Json.dll


代码示列

using System;
using System.Text;
using System.Net;
using System.IO;
using System.Collections.Generic;
using System.Web;
using System.Security.Cryptography;
using Newtonsoft.Json;
namespace SUBMAIL
{
 public class MessageSendDemo
 {
  private const string API_MessageSend = "https://api.mysubmail.com/message/send.json";
  private const string API_Timestamp = "https://api.mysubmail.com/service/timestamp.json";

  public void Demo()
  {
   string appid = "your_appid";          
   string appkey = "your_appkey";
   string to = "your_telephone";
   string content = "sms_text";
   string sign_type = "normal";             //加密方式有normal,md5,sha1
   string result = Send(appid, appkey, to, content, sign_type);
   Console.WriteLine(result);

  }

  public String Send(string appid, string appkey, string to, string content, string sign_type)
  {
   Dictionary<string> d = new Dictionary<string>();
   d.Add("appid", appid);
   d.Add("to", to);
   d.Add("content", content);
   //如果不使用加密方式或者signature传normal则signature参数传入appkey的值
   if (sign_type.Equals("md5") || sign_type.Equals("sha1"))
   {
    HttpWebResponse hwp = CreateGetHttpResponse(API_Timestamp);
    string jsonResult = GetResponseString(hwp);
    hwp.Close();
    Dictionary<string> jsonMap = JsonConvert.DeserializeObject<Dictionary>>(jsonResult);
    string timestamp = jsonMap["timestamp"];
    d.Add("sign_type", sign_type);
    d.Add("timestamp", timestamp);
    if (sign_type.Equals("md5"))
    {
     d.Add("signature", GetMD5Signature(FormatRequest(d), appid, appkey));
    }
    else
    {
     d.Add("signature", GetSHA1Signature(FormatRequest(d), appid, appkey));
    }
   }
   else
   {
    d.Add("signature", appkey);
   }
   HttpWebResponse h = CreatePostHttpResponse(API_MessageSend, d);
   string response = GetResponseString(h);
   h.Close();
   return response;
  }


        //http post请求
  public HttpWebResponse CreatePostHttpResponse(string url, Dictionary<string> parameters)
  {
   HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;//创建请求对象
   request.Method = "POST";//请求方式
   request.ContentType = "application/x-www-form-urlencoded";//链接类型
                   //构造查询字符串
   if (!(parameters == null || parameters.Count == 0))
   {
    StringBuilder buffer = new StringBuilder();
    bool first = true;
    foreach (string key in parameters.Keys)
    {

     if (!first)
     {
      buffer.AppendFormat("&{0}={1}", HttpUtility.UrlEncode(key, Encoding.UTF8), HttpUtility.UrlEncode((string)parameters[key], Encoding.UTF8));
     }
     else
     {
      buffer.AppendFormat("{0}={1}", HttpUtility.UrlEncode(key, Encoding.UTF8), HttpUtility.UrlEncode((string)parameters[key], Encoding.UTF8));
      first = false;
     }
    }

    Console.WriteLine("requestParam:" + buffer.ToString());
    byte[] data = Encoding.UTF8.GetBytes(buffer.ToString());
    //写入请求流
    using (Stream stream = request.GetRequestStream())
    {
     stream.Write(data, 0, data.Length);
     stream.Close();
    }
   }
   return request.GetResponse() as HttpWebResponse;
  }


  //获取服务器时间戳
  public HttpWebResponse CreateGetHttpResponse(string url)
  {
   HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;//创建请求对象
   request.Method = "GET";//请求方式 
   request.ContentType = "application/x-www-form-urlencoded";
   return request.GetResponse() as HttpWebResponse;
  }

  public string GetResponseString(HttpWebResponse webresponse)
  {
   using (Stream s = webresponse.GetResponseStream())
   {
    StreamReader reader = new StreamReader(s, Encoding.UTF8);
    return reader.ReadToEnd();
   }
  }


  //加密参数升序
  public string FormatRequest(Dictionary<string> data)
  {
   StringBuilder builder = new StringBuilder();
   if (data.Count > 0)
   {
    List<KeyValuePair>> lst = new List<KeyValuePair>>(data);
    lst.Sort(delegate (KeyValuePair<string> s1, KeyValuePair<string> s2)
        {
         return s1.Key.CompareTo(s2.Key);
        });
    foreach (KeyValuePair<string> kvp in lst)
    {
     if (kvp.Value != null)
     {
      builder.Append(string.Format("{0}={1}&", kvp.Key, kvp.Value));

     }

    }

   }
   string formatData = builder.ToString();
   Console.WriteLine(formatData);
   if (formatData.Length > 0)
   {
    return formatData.Substring(0, formatData.Length - 1);
   }
   return null;
  }

  //获取md5加密后的签名字符串
  private string GetMD5Signature(string data, string appid, string appkey)
  {
   string signStr = string.Format("{0}{1}{2}{3}{4}", appid, appkey, data, appid, appkey);
   MD5 md5 = new MD5CryptoServiceProvider();
   byte[] fromData = Encoding.GetEncoding("utf-8").GetBytes(signStr);
   byte[] targetData = md5.ComputeHash(fromData);
   StringBuilder sBuilder = new StringBuilder();
   for (int i = 0; i < targetData.Length; i++)
   {

    sBuilder.Append(targetData[i].ToString("x2"));
   }
   return sBuilder.ToString();
  }

  //获取sha1加密后的签名字符串
  private string GetSHA1Signature(string data, string appid, string appkey)
  {
   string signStr = string.Format("{0}{1}{2}{3}{4}", appid, appkey, data, appid, appkey);
   SHA1 sha1 = new SHA1CryptoServiceProvider();
   byte[] fromData = Encoding.GetEncoding("utf-8").GetBytes(signStr);
   byte[] targetData = sha1.ComputeHash(fromData);
   StringBuilder sBuilder = new StringBuilder();
   for (int i = 0; i < targetData.Length; i++)
   {
    sBuilder.Append(targetData[i].ToString("x2"));
   }
   return sBuilder.ToString();
  }
 }
}