c#开发微信公众号——关于c#对象与xml的转换
在成为微信公众号开发者以后,整个交互流程:用户->微信服务器->自己的服务器->返回微信服务器->用户;
举个例子:用户在微信公众号里面发了个“您好!”,微信服务器会以特定的xml形式(如下)
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[您好!]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
发送给自己的服务器(在微信公众号后台 开发选项里面 配置的 url服务器地址),自己的服务器接受到此xml消息后根据用户输入的消息不同来做不同的业务逻辑处理,例如:给用户回复个“欢迎!”
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[欢迎!]]></Content>
</xml>
返回给微信服务器,微信服务器根据ToUserName FromUserName返回给用户
特别注意:开发者在给微信服务器返回xml消息时一定要将ToUserName FromUserName与用户发过来的ToUserName FromUserName做个对调,否则回传给微信服务器,微信服务器是识别处理不了的(用户收不到相对应的消息) 那么在两者服务器(微信服务器和自己的服务器)进行通信的时候,对xml的处理就显得尤为重要,这里总共提供两种处理方案,重点在第二种(用c#对象与xml互转换进行)
方案一:直接使用XmlDocument类
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(postStr))); //postStr为微信服务器传过来的xml
XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType");
根据选的节点的 InnerText属性就能获取到此节点的内容值
方案二:先将微信服务器传过来的xml序列化成c#对象(需要自己根据官方文档定义对应的model 实体),开发过程中就直接使用对象的属性来操作对应的xml的节点,然后经过反序列化成xml返回给微信服务器,这样开发起来就回到我们熟悉的开发模式,万物皆对象, 点点就出来;架构更清晰,代码更优雅;对吧
第一步:转xml为对象
//将微信服务器传过来的xml数据 转换成 obj实体
var xmlObj = XmlUtil.XmlToObjectFromStr<xml>(typeof(xml), postStr);
xmlObj.ExchageValue(); //写了个扩展方法对调ToUserName FromUserName

//返回文本消息
// 把需要返回给用户的信息进行设置 TextXml 为自定义的实体(根据官方文档被动回复消息xml)
TextXml txml = new TextXml(xmlObj.ToUserName, xmlObj.FromUserName);
txml.Content.Value = "自定义内容!"; return XmlUtil.ToXml(txml); //将实体 转换为 xml

解释一下:这里将实体属性全部定义为 XMLNode类型的原因是 序列化成xml的时候带上cdata不转义标记
将实体转换为xml方法:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", ""); //去除xmlns:xsd
这两行代码是要去掉 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
否则维系服务器就不会识别处理(亲测)
返回result的时候 正则表达式是将xml的节点 <TextXml>替换成<xml>
这样在我们开发过程中每次只需要创建要回复的消息类型的实体,然后给对应的属性赋值,再经过反序列化xml交给微信服务器就可以了;开发过程简单明了了很多!当然后面还会遇到xml带子节点的情况(跟c#对象相互转换)都是同样的道理。
希望能帮到要用或者即将要用的朋友们!!
c#开发微信公众号——关于c#对象与xml的转换的更多相关文章
- PHP开发微信公众号(一)二维码的获取
要开发微信公众号,首先进行需要注册一个,然后认证.这就不用多说了. 当然如果没有,也可以去申请一个测试号来使用,地址:https://mp.weixin.qq.com/debug/cgi-bin/sa ...
- Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token
获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...
- Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装
在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...
- 小机器人自动回复(python,可扩展开发微信公众号的小机器人)
api来之图灵机器人.我们都知道微信公众号可以有自动回复,我们先用python脚本编写一个简单的自动回复的脚本,利用图灵机器人的api. http://www.tuling123.com/help/h ...
- vue+node.js+webpack开发微信公众号功能填坑——v -for循环
页面整体框架实现,实现小功能,循环出数据,整体代码是上一篇 vue+node.js+webpack开发微信公众号功能填坑--组件按需引入 修改部门代码 app.vue <yd-flexbox&g ...
- vue+node.js+webpack开发微信公众号功能填坑——组件按需引入
初次开发微信公众号,整体框架是经理搭建,小喽喽只是实现部分功能,整体页面效果 整个页面使用两个组件:布局 FlexBox,搜索框 Search,demo文档 http://vue.ydui.org/d ...
- PHP开发微信公众号
PHP开发微信公众号:配置和部署服务器及Token认证 https://zhuanlan.zhihu.com/p/28259840
- 使用vue开发微信公众号下SPA站点的填坑之旅
原文发表于本人博客,点击进入使用vue开发微信公众号下SPA站点的填坑之旅 本文为我创业过程中,开发项目的填坑之旅.作为一个技术宅男,我的项目是做一个微信公众号,前后端全部自己搞定,不浪费国家一分钱^ ...
- Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理
在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...
随机推荐
- 万能的JDBC工具类。通过反射机制直接简单处理数据库操作
package com.YY.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connect ...
- SQL捕捉blocking信息
场景: 客户抱怨数据库慢,但是回去看的时候,可能已经不慢了,为了查出当时到底是什么原因导致数据慢,制作了下面的存储过程,然后每隔3分钟运行一遍,把blocking信息插入一个数据库中. 主要就是查询s ...
- 二、WPF datagrid 行变色
public void Color(){ DataGridRow row1 = (DataGridRow)this.dgSource.ItemContainerGenerator.ContainerF ...
- Intel酷睿前世今生(一)
Intel酷睿系列自诞生起就树立了桌面CPU霸主的地位,酷睿i系列更是无人能敌.它是Intel阻击AMD多核构架的救赎主,也是AMD复兴梦想的收割者.而Intel酷睿系列已经经历几代了,不知还有多少看 ...
- Linux入门-5 用户及权限基础
1. Linux用户基础 用户 相关文件 查看登录的用户 添加用户 修改用户信息 删除用户 组 2. Linux权限机制 权限 UGO 修改文件所属用户和组 修改权限 3. Linux权限扩展 默认权 ...
- 沉淀,再出发:web前端的一些认识
沉淀,再出发:web前端的一些认识 一.前言 作为程序员,我一直认为全栈是一种最基本的能力,没有了这种目标就会发现自己越往后面发展路就越窄,很多自己不了解的东西会阻塞自己去理解整个系统的开发过程和效率 ...
- UNIX crontab自动执行脚本
crontab 是不会加载环境变量的你手动执行可以是因为登录了oracle用户加载了环境变量,你可以在脚本里添加,echo $ORACLE_HOME echo $ORACLE_SID 等等试试,看看 ...
- rpc、socket、tcp/udp简要梳理
RPC:远程过程调用(分布式.微服务间的方法调用) HTTP:无状态,每次请求都要发送一个request,服务器响应之后就断掉(http header中的keep-alive指的是tcp) TCP:面 ...
- WinRAR(5.21)-0day漏洞-始末分析
0x00 前言 上月底,WinRAR 5.21被曝出代码执行漏洞,Vulnerability Lab将此漏洞评为高危级,危险系数定为9(满分为10),与此同时安全研究人员Mohammad Reza E ...
- C语言基础笔试题一
1.下面的代码输出什么?为什么? void foo(void) { unsigned int a = 6; int b = -20; (a+b > 6)?puts(">6&quo ...