- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章.NET微信公众号开发之公众号消息处理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
一.前言 。
微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们要认真阅读,官方给我们的文档:http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html。首先我们从最基本的文本消息处理开始.
1
2
3
4
5
6
7
|
<
xml
>
<
ToUserName
>
<![CDATA[toUser]]>
</
ToUserName
>
<
FromUserName
>
<![CDATA[fromUser]]>
</
FromUserName
>
<
CreateTime
>12345678</
CreateTime
>
<
MsgType
>
<![CDATA[text]]>
</
MsgType
>
<
Content
>
<![CDATA[你好]]>
</
Content
>
</
xml
>
|
我们可以看到这是消息处理的一个最基本的模式,有发送者,接受者,创建时间,类型,内容等等.
首先我们来创建一个消息处理的类,这个类用来捕获,所有的消息请求,根据不同的消息请求类型来处理不同的消息回复.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
public
class
WeiXinService
{
/// <summary>
/// TOKEN
/// </summary>
private
const
string
TOKEN =
"finder"
;
/// <summary>
/// 签名
/// </summary>
private
const
string
SIGNATURE =
"signature"
;
/// <summary>
/// 时间戳
/// </summary>
private
const
string
TIMESTAMP =
"timestamp"
;
/// <summary>
/// 随机数
/// </summary>
private
const
string
NONCE =
"nonce"
;
/// <summary>
/// 随机字符串
/// </summary>
private
const
string
ECHOSTR =
"echostr"
;
/// <summary>
///
/// </summary>
private
HttpRequest Request {
get
;
set
; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="request"></param>
public
WeiXinService(HttpRequest request)
{
this
.Request = request;
}
/// <summary>
/// 处理请求,产生响应
/// </summary>
/// <returns></returns>
public
string
Response()
{
string
method = Request.HttpMethod.ToUpper();
//验证签名
if
(method ==
"GET"
)
{
if
(CheckSignature())
{
return
Request.QueryString[ECHOSTR];
}
else
{
return
"error"
;
}
}
//处理消息
if
(method ==
"POST"
)
{
return
ResponseMsg();
}
else
{
return
"无法处理"
;
}
}
/// <summary>
/// 处理请求
/// </summary>
/// <returns></returns>
private
string
ResponseMsg()
{
string
requestXml = CommonWeiXin.ReadRequest(
this
.Request);
IHandler handler = HandlerFactory.CreateHandler(requestXml);
if
(handler !=
null
)
{
return
handler.HandleRequest();
}
return
string
.Empty;
}
/// <summary>
/// 检查签名
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
private
bool
CheckSignature()
{
string
signature = Request.QueryString[SIGNATURE];
string
timestamp = Request.QueryString[TIMESTAMP];
string
nonce = Request.QueryString[NONCE];
List<
string
> list =
new
List<
string
>();
list.Add(TOKEN);
list.Add(timestamp);
list.Add(nonce);
//排序
list.Sort();
//拼串
string
input =
string
.Empty;
foreach
(var item
in
list)
{
input += item;
}
//加密
string
new_signature = SecurityUtility.SHA1Encrypt(input);
//验证
if
(new_signature == signature)
{
return
true
;
}
else
{
return
false
;
}
}
}
|
在来看看我们的首先是如何捕获消息的。首页Default.ashx的代码如下 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public
void
ProcessRequest(HttpContext context)
{
context.Response.ContentType =
"text/html"
;
string
postString =
string
.Empty;
if
(HttpContext.Current.Request.HttpMethod.ToUpper() ==
"POST"
)
{
//由微信服务接收请求,具体处理请求
WeiXinService wxService =
new
WeiXinService(context.Request);
string
responseMsg = wxService.Response();
context.Response.Clear();
context.Response.Charset =
"UTF-8"
;
context.Response.Write(responseMsg);
context.Response.End();
}
else
{
string
token =
"wei2414201"
;
if
(
string
.IsNullOrEmpty(token))
{
return
;
}
string
echoString = HttpContext.Current.Request.QueryString[
"echoStr"
];
string
signature = HttpContext.Current.Request.QueryString[
"signature"
];
string
timestamp = HttpContext.Current.Request.QueryString[
"timestamp"
];
string
nonce = HttpContext.Current.Request.QueryString[
"nonce"
];
if
(!
string
.IsNullOrEmpty(echoString))
{
HttpContext.Current.Response.Write(echoString);
HttpContext.Current.Response.End();
}
}
}
|
从上面的代码中我们可以看到WeiXinService.cs类中的消息相应至关重要.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/// <summary>
/// 处理请求
/// </summary>
/// <returns></returns>
private
string
ResponseMsg()
{
string
requestXml = CommonWeiXin.ReadRequest(
this
.Request);
IHandler handler = HandlerFactory.CreateHandler(requestXml);
if
(handler !=
null
)
{
return
handler.HandleRequest();
}
return
string
.Empty;
}
|
IHandler是一个消息处理接口,其下面有EventHandler,TextHandler处理类实现这个接口。代码如下 。
1
2
3
4
5
6
7
8
9
10
11
|
/// <summary>
/// 处理接口
/// </summary>
public
interface
IHandler
{
/// <summary>
/// 处理请求
/// </summary>
/// <returns></returns>
string
HandleRequest();
}
|
EventHandler 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
class
EventHandler : IHandler
{
/// <summary>
/// 请求的xml
/// </summary>
private
string
RequestXml {
get
;
set
; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="requestXml"></param>
public
EventHandler(
string
requestXml)
{
this
.RequestXml = requestXml;
}
/// <summary>
/// 处理请求
/// </summary>
/// <returns></returns>
public
string
HandleRequest()
{
string
response =
string
.Empty;
EventMessage em = EventMessage.LoadFromXml(RequestXml);
if
(em.Event.Equals(
"subscribe"
, StringComparison.OrdinalIgnoreCase))
//用来判断是不是首次关注
{
PicTextMessage tm =
new
PicTextMessage();
//我自己创建的一个图文消息处理类
tm.ToUserName = em.FromUserName;
tm.FromUserName = em.ToUserName;
tm.CreateTime = CommonWeiXin.GetNowTime();
response = tm.GenerateContent();
}
return
response;
}
}
|
TextHandler 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/// <summary>
/// 文本信息处理类
/// </summary>
public
class
TextHandler : IHandler
{
string
openid {
get
;
set
; }
string
access_token {
get
;
set
; }
/// <summary>
/// 请求的XML
/// </summary>
private
string
RequestXml {
get
;
set
; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="requestXml">请求的xml</param>
public
TextHandler(
string
requestXml)
{
this
.RequestXml = requestXml;
}
/// <summary>
/// 处理请求
/// </summary>
/// <returns></returns>
public
string
HandleRequest()
{
string
response =
string
.Empty;
TextMessage tm = TextMessage.LoadFromXml(RequestXml);
string
content = tm.Content.Trim();
if
(
string
.IsNullOrEmpty(content))
{
response =
"您什么都没输入,没法帮您啊。"
;
}
else
{
string
username = System.Configuration.ConfigurationManager.AppSettings[
"weixinid"
].ToString();
AccessToken token = AccessToken.Get(username);
access_token = token.access_token;
openid = tm.FromUserName;
response = HandleOther(content);
}
tm.Content = response;
//进行发送者、接收者转换
string
temp = tm.ToUserName;
tm.ToUserName = tm.FromUserName;
tm.FromUserName = temp;
response = tm.GenerateContent();
return
response;
}
/// <summary>
/// 处理其他消息
/// </summary>
/// <param name="tm"></param>
/// <returns></returns>
private
string
HandleOther(
string
requestContent)
{
string
response =
string
.Empty;
if
(requestContent.Contains(
"你好"
) || requestContent.Contains(
"您好"
))
{
response =
"您也好~"
;
}
else
if
(requestContent.Contains(
"openid"
) || requestContent.Contains(
"id"
) || requestContent.Contains(
"ID"
))
//用来匹配用户输入的关键字
{
response =
"你的Openid: "
+openid;
}
else
if
(requestContent.Contains(
"token"
) || requestContent.Contains(
"access_token"
))
{
response =
"你的access_token: "
+ access_token;
}
else
{
response =
"试试其他关键字吧。"
;
}
return
response;
}
}
|
HandlerFactory 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
/// <summary>
/// 处理器工厂类
/// </summary>
public
class
HandlerFactory
{
/// <summary>
/// 创建处理器
/// </summary>
/// <param name="requestXml">请求的xml</param>
/// <returns>IHandler对象</returns>
public
static
IHandler CreateHandler(
string
requestXml)
{
IHandler handler =
null
;
if
(!
string
.IsNullOrEmpty(requestXml))
{
//解析数据
XmlDocument doc =
new
System.Xml.XmlDocument();
doc.LoadXml(requestXml);
XmlNode node = doc.SelectSingleNode(
"/xml/MsgType"
);
if
(node !=
null
)
{
XmlCDataSection section = node.FirstChild
as
XmlCDataSection;
if
(section !=
null
)
{
string
msgType = section.Value;
switch
(msgType)
{
case
"text"
:
handler =
new
TextHandler(requestXml);
break
;
case
"event"
:
handler =
new
EventHandler(requestXml);
break
;
}
}
}
}
return
handler;
}
}
|
在这里基本的一些类已经完成了,现在我们来完成,关注我们的微信公众号,我们就发送一条图文消息,同时输入我们的一些关键字,返回一些消息,比如输入id返回用户的openid等等.
二.PicTextMessage 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
public
class
PicTextMessage : Message
{
/// <summary>
/// 模板静态字段
/// </summary>
private
static
string
m_Template;
/// <summary>
/// 默认构造函数
/// </summary>
public
PicTextMessage()
{
this
.MsgType =
"news"
;
}
/// <summary>
/// 从xml数据加载文本消息
/// </summary>
/// <param name="xml"></param>
public
static
PicTextMessage LoadFromXml(
string
xml)
{
PicTextMessage tm =
null
;
if
(!
string
.IsNullOrEmpty(xml))
{
XElement element = XElement.Parse(xml);
if
(element !=
null
)
{
tm =
new
PicTextMessage();
tm.FromUserName = element.Element(CommonWeiXin.FROM_USERNAME).Value;
tm.ToUserName = element.Element(CommonWeiXin.TO_USERNAME).Value;
tm.CreateTime = element.Element(CommonWeiXin.CREATE_TIME).Value;
}
}
return
tm;
}
/// <summary>
/// 模板
/// </summary>
public
override
string
Template
{
get
{
if
(
string
.IsNullOrEmpty(m_Template))
{
LoadTemplate();
}
return
m_Template;
}
}
/// <summary>
/// 生成内容
/// </summary>
/// <returns></returns>
public
override
string
GenerateContent()
{
this
.CreateTime = CommonWeiXin.GetNowTime();
string
str=
string
.Format(
this
.Template,
this
.ToUserName,
this
.FromUserName,
this
.CreateTime);
return
str;
}
/// <summary>
/// 加载模板
/// </summary>
private
static
void
LoadTemplate()
{
m_Template=
@"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[有位停车欢迎你!]]></Title>
<Description><![CDATA[如有问题请致电400-6238-136或直接在微信留言,我们将第一时间为您服务!]]></Description>
<PicUrl><![CDATA[http://www.baidu.com/youwei.jpg]]></PicUrl>
<Url><![CDATA[http://www.baidu.com]]></Url>
</item>
</Articles>
</xml> "
;
}
}
|
最后我们的效果如下所示; 。
以上所述就是本文的全部内容了,希望大家能够喜欢 。
最后此篇关于.NET微信公众号开发之公众号消息处理的文章就讲到这里了,如果你想了解更多关于.NET微信公众号开发之公众号消息处理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当有人使用微信(微信)分享我的一款游戏(用 JavaScript 制作)时,我正在使用 WeixinJSBridge 修改分享参数。 下面的代码位于一个很大的 JavaScript 文件(超过 250
我转微信了padplus来自wechaty-puppet-puppeteer的傀儡并发现它比 wechaty-puppet-puppeteer 更频繁地停止.即,wechaty-puppet-pupp
微信小程序一出,立马炸开了锅,都去搭建自己的开发环境,我这里也来尝尝先,之前发了一篇文章,有人问demo怎么导入? demo源代码(来自网络) 百度: https://pan.baidu.com
微信小程序可谓是今天最火的一个名词了,一经出现真是轰炸了整个开发人员,当然很多app开发人员有了一个担心,微信小程序的到来会不会给移动端app带来一个寒冬,身为一个android开发者我是不相信的,
memcache缓存存储用户信息7000秒 ? 1
微信开发生成带参数的二维码的讲解 在微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数的二维码”,通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微信公众号上
某日,一同学给小的发了 Github 源码,说是可以轻松查到删除自己的微信好友,于是就开始了作死之路。 Github 源码请看:0x5e/wechat-deleted-friends 前言
近段时间山西的连续降雨,不少的城市都出现了洪灾,救灾物资匮乏,不少明星及爱心人士都纷纷向山西捐款,那么目前来说山西捐款的通道有哪些呢?在支付宝,微信上如何给山西捐款呢?下面就和小编一起来看看山西捐款
一.集成支付宝支付 支付宝集成官方教程 https://docs.open.alipay.com/204/105295/ 支付宝集成官方demo https://docs.o
一.越来越多的app增加第三方的功能,可能app有不同的页面但调用相同的支付方式,例如界面如下: 这两个页面都会使用第三方支付支付:(微信,支付宝,银联)如果在每一个页面都直接调用第三方支付的
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我安装了一个虚假的位置应用程序并将我的位置设置为不同的位置。然后打开谷歌地图和微信应用, Google map 将我的位置显示为我设置的(假的) 微信应用忽略虚假位置并检测真实位置(如何?) 然后我想
前言 支付分APP支付、H5支付、扫码支付等。app支付一般在app中使用,并且需要集成相应的支付SDK,H5支付多用于网页。如果你的APP不想集成支付SDK,又想实现支付功能,你可以在项目中使用
最近一直在调用微信的api,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走。 1、申请app_id 2、填写包名3、 获取程序签
和平精英QQ/微信 每日登陆抽奖1~188Q币 活动两个QQ和微信都可以 每天登陆游戏并且玩一局 然后可以去活动界面抽奖Q币 QQ端(需玩一局):http://t.cn/Ai1Jn7Tz
目前,当我使用带有 Link 插件的 TinyMce4.5.1 时。即使我将属性 link_list 设置为 false,我也找不到隐藏默认 URL 选项(#top、#bottom)的方法。除了破
实际上,我正在尝试使用微信为我的 Web 应用程序设置 OAuth 登录。所以,我在微信上创建了一个帐户,并使用了一个测试帐户来无限访问。 因此,在测试帐户配置中,我已成功验证来自微信的 token
不管是腾讯还是新浪,查看他们的API,PHP都是有完整的接口,但对C#支持似乎都不是那么完善,都没有,腾讯是完全没有,新浪是提供第三方的,而且后期还不一定升级,NND,用第三方的动辄就一个类库,各种
和平精英QQ/微信 每日登陆抽奖1~188Q币/现金红包 活动两个QQ和微信都可以 QQ的登录游戏和分享好友即可获得三次抽奖次数 微信登录游戏就可以抽奖 如果没有反应就分享链接出去从分享的链接进
我想做什么 我正在尝试将我自己的基于 WebGL 的引擎移植到微信小游戏环境,目前只是尝试让 WebGL 上下文被粉红色清除: 有什么问题 我已经按照腾讯提供的示例以及 ThreeJS 示例来设置游戏
我是一名优秀的程序员,十分优秀!