信鸽推送 C#版SDK

  信鸽官方sdk没提供C#版的DEMO,考虑到应该有其他.NET的也会用到信鸽,下面是我在使用信鸽过程中写的demo。有什么不对的地方,欢迎各位大牛指导。
  使用过程中主要是有2个问题:
  1.参数组装,本demo使用Dictionary进行组装和排序;
  2.生成 sign(签名)

  下文贴出单个设备推送的代码(忽略大多数辅组实体的代码,下面会贴上源代码)
  1.Android 消息实体类 Message
  

  
public class Message
{
    public Message()
    {
        this.title = "";
        this.content = "";
        this.sendTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        this.accept_time = new List<TimeInterval>();
        this.multiPkg = 0;
        this.raw = "";
        this.loopInterval = -1;
        this.loopTimes = -1;
        this.action = new ClickAction();
        this.style = new Style(0);
        this.type = Message.TYPE_MESSAGE;
    }
    public bool isValid()
    {
        if (!string.IsNullOrWhiteSpace(raw))
        {
            return true;
        }
        if (type < TYPE_NOTIFICATION || type > TYPE_MESSAGE)
            return false;
        if (multiPkg < 0 || multiPkg > 1)
            return false;
        if (type == TYPE_NOTIFICATION)
        {
            if (!style.isValid()) return false;
            if (!action.isValid()) return false;
        }
        if (expireTime < 0 || expireTime > 3 * 24 * 60 * 60)
            return false;
        try
        {
            DateTime.Parse(sendTime);
        }
        catch (Exception e)
        {
            return false;
        }
        foreach (var item in accept_time)
        {
            if (!item.isValid()) return false;
        }
        if (loopInterval > 0 && loopTimes > 0
                && ((loopTimes - 1) * loopInterval + 1) > 15)
        {
            return false;
        }

        return true;
    }
    public string ToJosnByType()
    {
        if (type == TYPE_MESSAGE)
        {
            var obj = new { title = title, content = content, accept_time = accept_time.ToJson() };
            return obj.ToJson();
        }
        return this.ToJson();
    }
    /// <summary>
    /// 1:通知
    /// </summary>
    public static readonly int TYPE_NOTIFICATION = 1;
    /// <summary>
    /// 2:透传消息
    /// </summary>
    public static readonly int TYPE_MESSAGE = 2;
    public String title;
    public String content;
    public int expireTime;
    public String sendTime;
    private List<TimeInterval> accept_time;
    public int type;
    public int multiPkg;
    private Style style;
    private ClickAction action;
    /// <summary>
    /// 自定义参数,所有的系统app操作参数放这里
    /// </summary>
    public string custom_content;
    public String raw;
    public int loopInterval;
    public int loopTimes;
}
View Code

  2.组装参数函数

  
/// <summary>
/// Android单个设备 推送信息
/// </summary>
/// <param name="deviceToken">针对某一设备推送,token是设备的唯一识别 ID</param>
/// <param name="message"></param>
/// <returns></returns>
public string pushSingleDevice(String deviceToken, Message message)
{
    if (!ValidateMessageType(message))
    {
        return "";
    }
    if (!message.isValid())
    {
        return "";
    }
    Dictionary<String, Object> dic = new Dictionary<String, Object>();
    dic.Add("access_id", this.m_accessId);
    dic.Add("expire_time", message.expireTime);
    dic.Add("send_time", message.sendTime);
    dic.Add("multi_pkg", message.multiPkg);
    dic.Add("device_token", deviceToken);
    dic.Add("message_type", message.type);
    dic.Add("message", message.ToJson());
    dic.Add("timestamp", DateTime.Now.DateTimeToUTCTicks());

    return CallRestful(XinGeAPIUrl.RESTAPI_PUSHSINGLEDEVICE, dic);
}
View Code

  3.生成签名

  
/// <summary>
/// 生成 sign(签名)
/// </summary>
/// <param name="method"></param>
/// <param name="url"></param>
/// <param name="dic"></param>
/// <returns></returns>
protected String GenerateSign(String method, String url, Dictionary<String, Object> dic)
{
    var str = method;
    Uri address = new Uri(url);
    str += address.Host;
    str += address.AbsolutePath;
    var dic2 = dic.OrderBy(d => d.Key);
    foreach (var item in dic2)
    {
        str += (item.Key + "=" + (item.Value == null ? "" : item.Value.ToString()));
    }
    str += this.m_secretKey;
    var s_byte = Encoding.UTF8.GetBytes(str);
    MD5 md5Hasher = MD5.Create();
    byte[] data = md5Hasher.ComputeHash(s_byte);
    StringBuilder sBuilder = new StringBuilder();
    for (int i = 0; i < data.Length; i++)
    {
        sBuilder.Append(data[i].ToString("x2"));
    }
    return sBuilder.ToString();
}
View Code

  4.生成请求的地址和调用请求

  
/// <summary>
/// 生成请求的地址和调用请求
/// </summary>
/// <param name="url"></param>
/// <param name="dic"></param>
/// <returns></returns>
protected string CallRestful(String url, Dictionary<String, Object> dic)
{
    String sign = GenerateSign("POST", url, dic);
    if (string.IsNullOrWhiteSpace(sign))
    {
        return (new { ret_code = -1, err_msg = "generateSign error" }).ToJson();
    }
    dic.Add("sign", sign);
    try
    {
        var param = "";
        foreach (var item in dic)
        {
            var key = item.Key;
            var value = HttpUtility.UrlEncode(item.Value == null ? "" : item.Value.ToString(), Encoding.UTF8);
            param = string.IsNullOrWhiteSpace(param) ? string.Format("{0}={1}", key, value) : string.Format("{0}&{1}={2}", param, key, value);
        }
        return Request(url, "POST", param);

    }
    catch (Exception e)
    {

        return e.Message;
    }
}
View Code

  5.辅助校验方法

  
protected bool ValidateMessageType(Message message)
{
    if (this.m_accessId < XinGeAPIUrl.IOS_MIN_ID)
        return true;
    else
        return false;
}
View Code

  6.Http请求

  
public string Request(string _address, string method = "GET", string jsonData = null, int timeOut = 5)
{
    string resultJson = string.Empty;
    if (string.IsNullOrEmpty(_address))
        return resultJson;
    try
    {
        Uri address = new Uri(_address);

        // 创建网络请求  
        HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
        //System.Net.ServicePointManager.DefaultConnectionLimit = 50; 
        // 构建Head
        request.Method = method;
        request.KeepAlive = false;
        Encoding myEncoding = Encoding.GetEncoding("utf-8");
        if (!string.IsNullOrWhiteSpace(jsonData))
        {
            byte[] bytes = Encoding.UTF8.GetBytes(jsonData);
            using (Stream reqStream = request.GetRequestStream())
            {
                reqStream.Write(bytes, 0, bytes.Length);
                reqStream.Close();
            }
        }
        request.Timeout = timeOut * 1000;
        request.ContentType = "application/x-www-form-urlencoded";
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            StreamReader reader = new StreamReader(response.GetResponseStream());
            string responseStr = reader.ReadToEnd();
            if (responseStr != null && responseStr.Length > 0)
            {
                resultJson = responseStr;
            }
        }
    }
    catch (Exception ex)
    {
        resultJson = ex.Message;
    }
    return resultJson;
}
View Code

  7.发送一个推送

  
public bool pushSingleDevice(String deviceToken, string account, string title, string content, Dictionary<string, object> custom, out string returnStr)
{
    content = content.Replace("
", "").Replace("
", "");
    
    Message android = new Message();
    android.title = title;
    android.content = content;
    android.custom_content = custom.ToJson();
    returnStr = pushSingleDevice(deviceToken, android);
    return true;
}
View Code

  源码下载

  注意:IOS需要区分开发和正式环境

原文地址:https://www.cnblogs.com/Jimmy-pan/p/5784988.html