• 信鸽推送 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需要区分开发和正式环境

  • 相关阅读:
    阿里巴巴Java编码规范插件安装使用指南
    jhipster安装_Windows
    Linux 基本命令
    HTTPie命令介绍
    MySQL卸载
    Windows Phone8.1系统新特性
    SQL 游标知识整理
    浅析C#代理
    javascript 实现ajax
    jquery 之load post get
  • 原文地址:https://www.cnblogs.com/Jimmy-pan/p/5784988.html
Copyright © 2020-2023  润新知