asp.net微信开发post xml 操作类_ulwx-程序员宅基地

技术标签: asp.net  微信    结构  

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

此操作类集成了微信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>";
    }
}


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/julinncom/article/details/26597485

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签