asp.net微信开发post xml 操作类

最近在研究学习微信开发,做完之后又重构了一下代码,整理了一微信操作类

此操作类集成了微信XML的解析和回复消息格式化,支持目前微信支持的文本,图文,语音,视频,位置和多图文消息回复格式。

要下载或是方便阅读,或查看本人更多的开源代码,请打开我的GIT连接查看,https://github.com/julinn/LinnStudio

原创内容,如果转载请注明出处,或保留文件头部信息,以便有问题或BUG的时候,方便联系我。谢谢。

----------

using System;
using System.Xml;
using System.Web.Security;

/// <summary>
/// ulwxMsgXML 的摘要说明
/// Author: julinn
/// update: 2014-05-21 14:07:46
/// Webnet: www.liuju.net
/// GitHub: https://github.com/julinn/LinnStudio
/// </summary>
public class ulwxMsgXML
{
	public ulwxMsgXML(string GetPostXmlString)
	{
        iniMsgData(GetPostXmlString);
    }

    #region 消息原型结构定义
    private string _DevpID = "";
    /// <summary>
    /// 公众号ID
    /// </summary>
    public string DevpID { get { return _DevpID; } set { _DevpID = value; } }

    private string _UserID = "";
    /// <summary>
    /// 用户ID
    /// </summary>
    public string UserID { get { return _UserID; } set { _UserID = value; } }

    private string _CreateTime = "";
    /// <summary>  
    /// 创建时间  
    /// </summary>  
    public string CreateTime { get { return _CreateTime; } set { _CreateTime = value; } }

    private string _CreateTimeStr = "";
    /// <summary>  
    /// 创建时间String 格式  
    /// </summary>  
    public string CreateTimeStr { get { return _CreateTimeStr; } set { _CreateTimeStr = value; } }

    private string _MsgType = "";
    /// <summary>
    /// 消息类型
    /// </summary>
    public string MsgType { get { return _MsgType; } set { _MsgType = value; } }
        
    private string _MsgID = "";
    /// <summary>
    /// 消息ID
    /// </summary>
    public string MsgID { get { return _MsgID; } set { _MsgID = value; } }

    private string _MediaId = "";
    /// <summary>
    /// 语音图像视频信息ID
    /// </summary>
    public string MediaId { get { return _MediaId; } set { _MediaId = value; } }

    private string _Content = "";
    /// <summary>
    /// 文本消息内容
    /// </summary>
    public string Content { get { return _Content; } set { _Content = value; } }

    private string _PicUrl = "";
    /// <summary>
    /// 图片URL
    /// </summary>
    public string PicUrl { get { return _PicUrl; } set { _PicUrl = value; } }

    private string _Format = "";
    /// <summary>
    /// 语音格式,如amr,speex等
    /// </summary>
    public string Format { get { return _Format; } set { _Format = value; } }

    private string _ThumbMediaId = "";
    /// <summary>
    /// 视频消息缩略图的媒体id
    /// </summary>
    public string ThumbMediaId { get { return _ThumbMediaId; } set { _ThumbMediaId = value; } }

    private string _Location_X = "";
    /// <summary>
    /// 地理位置_X
    /// </summary>
    public string Location_X { get { return _Location_X; } set { _Location_X = value; } }

    private string _Location_Y = "";
    /// <summary>
    /// 地理位置_Y
    /// </summary>
    public string Location_Y { get { return _Location_Y; } set { _Location_Y = value; } }

    private string _Scale = "";
    /// <summary>
    /// 地图缩放大小
    /// </summary>
    public string Scale { get { return _Scale; } set { _Scale = value; } }

    private string _Label = "";
    /// <summary>
    /// 地理位置信息
    /// </summary>
    public string Label { get { return _Label; } set { _Label = value; } }

    private string _Title = "";
    /// <summary>
    /// 链接消息-消息标题
    /// </summary>
    public string Title { get { return _Title; } set { _Title = value; } }

    private string _Description = "";
    /// <summary>
    /// 链接消息-消息描述
    /// </summary>
    public string Description { get { return _Description; } set { _Description = value; } }

    private string _Url = "";
    /// <summary>
    /// 链接消息-消息链接
    /// </summary>
    public string Url { get { return _Url; } set { _Url = value; } }

    private string _Event = "";
    /// <summary>
    /// 事件类型,subscribe(订阅)、unsubscribe(取消订阅)
    /// </summary>
    public string Event { get { return _Event; } set { _Event = value; } }

    #endregion 

    #region unix时间转换为datetime
    /// <summary>
    /// unix时间转换为datetime
    /// </summary>
    /// <param name="timeStamp"></param>
    /// <returns></returns>
    public static DateTime UnixTimeToTime(string timeStamp)
    {
        DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
        long lTime = long.Parse(timeStamp + "0000000");
        TimeSpan toNow = new TimeSpan(lTime);
        return dtStart.Add(toNow);
    }
    #endregion 

    #region datetime转换为unixtime
    /// <summary>
    /// datetime转换为unixtime
    /// </summary>
    /// <param name="time"></param>
    /// <returns></returns>
    public static int ConvertDateTimeInt(System.DateTime time)
    {
        System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
        return (int)(time - startTime).TotalSeconds;
    }
    #endregion 

    #region 初始化接收到的消息对象各属性值
    /// <summary>
    /// 初始化接收到的消息对象各属性值
    /// </summary>
    /// <param name="GetPostXmlString"></param>
    private void iniMsgData(string GetPostXmlString)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(GetPostXmlString);
        XmlElement root = doc.DocumentElement;
        DevpID = root.SelectSingleNode("ToUserName").InnerText;
        UserID = root.SelectSingleNode("FromUserName").InnerText;
        CreateTime = root.SelectSingleNode("CreateTime").InnerText;
        CreateTimeStr = UnixTimeToTime(CreateTime).ToString();
        MsgType = root.SelectSingleNode("MsgType").InnerText;
        switch (MsgType)
        {
            case "event":
                {
                    Event = root.SelectSingleNode("Event").InnerText;
                    break;
                }
            case "text":
                {
                    Content = root.SelectSingleNode("Content").InnerText;
                    break;
                }
            case "image":
                {
                    PicUrl = root.SelectSingleNode("PicUrl").InnerText;
                    MediaId = root.SelectSingleNode("MediaId").InnerText;
                    break;
                }
            case "voice":
                {
                    MediaId = root.SelectSingleNode("MediaId").InnerText;
                    Format = root.SelectSingleNode("Format").InnerText;
                    break;
                }               
            case "video":
                {
                    MediaId = root.SelectSingleNode("MediaId").InnerText;
                    ThumbMediaId = root.SelectSingleNode("ThumbMediaId").InnerText;
                    break;
                }              
            case "location":
                {
                    Location_X = root.SelectSingleNode("Location_X").InnerText;
                    Location_Y = root.SelectSingleNode("Location_Y").InnerText;
                    Scale = root.SelectSingleNode("Scale").InnerText; ;
                    Label = root.SelectSingleNode("Label").InnerText;
                    break;
                }
            case "link":
                {
                    Title = root.SelectSingleNode("Title").InnerText;
                    Description = root.SelectSingleNode("Description").InnerText;
                    Url = root.SelectSingleNode("Url").InnerText; ;
                    break;
                }
        }
    }
    #endregion 

    #region 验证签名
    /// <summary>
    /// 验证签名
    /// </summary>
    /// <param name="signature">签名字符串</param>
    /// <param name="timestamp">时间戳</param>
    /// <param name="nonce">随机数</param>
    /// <param name="token">Your Token</param>
    /// <returns></returns>
    public static bool CheckSignature(string signature, string timestamp, string nonce, string token)
    {
        string[] ArrTmp = { token, timestamp, nonce };
        Array.Sort(ArrTmp);
        string tmpStr = string.Join("", ArrTmp);
        tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
        tmpStr = tmpStr.ToLower();
        if (tmpStr == signature)
        {
            return true;
        }
        else
            return false;
    }
    #endregion 

    /************************************ 消息回复内容参数格式化 ************************************/
    /// <summary>
    /// 格式化回复消息头
    /// </summary>
    public string GetFormatHead()
    {
        return "<xml>"
                   + "<ToUserName><![CDATA[" + UserID + "]]></ToUserName>"
                   + "<FromUserName><![CDATA[" + DevpID + "]]></FromUserName>"
                   + "<CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";
    }

    /// <summary>
    /// 格式化转接客户服务,暂时不可用
    /// </summary>
    /// <returns></returns>
    public string GetFormatTransferCustomerService()
    {
        
        return "<xml>"
                   + "<ToUserName><![CDATA[" + DevpID + "]]></ToUserName>"
                   + "<FromUserName><![CDATA[" + UserID + "]]></FromUserName>"
                   + "<CreateTime>" + CreateTime + "</CreateTime>"
                   + "<MsgType><![CDATA[transfer_customer_service]]></MsgType>";

     
        /*
        return GetFormatHead()
            + "<MsgType><![CDATA[transfer_customer_service]]></MsgType>";
         */
    }

    /// <summary>
    /// 格式化文本消息
    /// </summary>
    /// <param name="sMsg">回复的消息内容 换行:\n</param>
    /// <returns></returns>
    public string GetFormatText(string sMsg)
    {
        return GetFormatHead()
               + "<MsgType><![CDATA[text]]></MsgType>"
               + "<Content><![CDATA[" + sMsg + "]]></Content>"
               + "</xml>";
    }

    /// <summary>
    /// 格式化图片消息
    /// </summary>
    /// <param name="MediaId">通过上传多媒体文件,得到的id</param>
    /// <returns></returns>
    public string GetFormatImage(string MediaId)
    {
        return GetFormatHead()
               + "<MsgType><![CDATA[image]]></MsgType>"
               + "<Image>"
               + "<MediaId><![CDATA[" + MediaId + "]]></MediaId>"
               + "</Image>"
               + "</xml>";
    }

    /// <summary>
    /// 格式化语音消息
    /// </summary>
    /// <param name="MediaId">通过上传多媒体文件,得到的id</param>
    /// <returns></returns>
    public string GetFormatVoice(string MediaId)
    {
        return GetFormatHead()
               + "<MsgType><![CDATA[voice]]></MsgType>"
               + "<Voice>"
               + "<MediaId><![CDATA[" + MediaId + "]]></MediaId>"
               + "</Voice>"
               + "</xml>";
    }

    /// <summary>
    /// 格式化视频消息
    /// </summary>
    /// <param name="MediaId">通过上传多媒体文件,得到的id</param>
    /// <param name="ThumbMediaId">缩略图的媒体id,通过上传多媒体文件,得到的id</param>
    /// <returns></returns>
    public string GetFormatVideo(string MediaId, string ThumbMediaId)
    {
        return GetFormatHead()
               + "<MsgType><![CDATA[video]]></MsgType>"
               + "<Video>"
               + "<MediaId><![CDATA[" + MediaId + "]]></MediaId>"
               + "<ThumbMediaId><![CDATA[" + ThumbMediaId + "]]></ThumbMediaId>"
               + "</Video>"
               + "</xml>";
    }

    /// <summary>
    /// 格式化音乐消息
    /// </summary>
    /// <param name="Title">音乐标题</param>
    /// <param name="Description">音乐描述</param>
    /// <param name="MusicUrl">音乐链接</param>
    /// <param name="HQMusicUrl">高质量音乐链接,WIFI环境优先使用该链接播放音乐</param>
    /// <param name="ThumbMediaId">缩略图的媒体id,通过上传多媒体文件,得到的id</param>
    /// <returns></returns>
    public string GetFormatMusic(string Title, string Description, string MusicUrl, string HQMusicUrl, string ThumbMediaId)
    {
        return GetFormatHead()
               + "<MsgType><![CDATA[music]]></MsgType>"
               + "<Music>"
               + "<Title><![CDATA[" + Title + "]]></Title>"
               + "<Description><![CDATA[" + Description + "]]></Description>"
               + "<MusicUrl><![CDATA[" + MusicUrl + "]]></MusicUrl>"
               + "<HQMusicUrl><![CDATA[" + HQMusicUrl + "]]></HQMusicUrl>"
               + "<ThumbMediaId><![CDATA[" + ThumbMediaId + "]]></ThumbMediaId>"
               + "</Music>"
               + "</xml>";
    }

    /// <summary>
    /// 格式化单条图文消息
    /// </summary>
    /// <param name="Title">图文消息标题</param>
    /// <param name="Description">图文消息描述</param>
    /// <param name="picUrl">图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200</param>
    /// <param name="Url">点击图文消息跳转链接</param>
    /// <returns></returns>
    public string GetFormatSingleImageText(string Title, string Description, string picUrl, string Url)
    {
        return GetFormatHead()
               + "<MsgType><![CDATA[news]]></MsgType>"
               + "<ArticleCount>1</ArticleCount>"
               + "<Articles>"
               + "<item>"
               + "<Title><![CDATA[" + Title + "]]></Title>"
               + "<Description><![CDATA[" + Description + "]]></Description>"
               + "<PicUrl><![CDATA[" + picUrl + "]]></PicUrl>"
               + "<Url><![CDATA[" + Url + "]]></Url>"
               + "</item>"
               + "</Articles>"
               + "</xml>";
    }

    /// <summary>
    /// 格式化多图文消息单条明细(单独不可直接发送,需要和GetFormatMultiImageText组合使用)
    /// </summary>
    /// <param name="Title">图文消息标题</param>
    /// <param name="Description">图文消息描述</param>
    /// <param name="picUrl">图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200</param>
    /// <param name="Url">点击图文消息跳转链接</param>
    /// <returns></returns>
    public static string GetFormatMultiImageTextItem(string Title, string Description, string picUrl, string Url)
    {
        return "<item>"
               + "<Title><![CDATA[" + Title + "]]></Title>"
               + "<Description><![CDATA[" + Description + "]]></Description>"
               + "<PicUrl><![CDATA[" + picUrl + "]]></PicUrl>"
               + "<Url><![CDATA[" + Url + "]]></Url>"
               + "</item>";
    }

    /// <summary>
    /// 格式化多条图文消息(需要搭配GetFormatMultiImageTextItem来格式化单条记录)
    /// </summary>
    /// <param name="ItemList">消息明细列表,通过 GetFormatMultiImageTextItem 格式化</param>
    /// <param name="Count">消息明细项数量</param>  
    /// <returns></returns>
    public string GetFormatMultiImageText(string ItemList,string Count)
    {
        return GetFormatHead()
               + "<MsgType><![CDATA[news]]></MsgType>"
               + "<ArticleCount>" + Count + "</ArticleCount>"
               + "<Articles>"
               + ItemList
               + "</Articles>"
               + "</xml>";
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值