前言 |
如题,我们在使用像中国移动等公众号时,可以通过输入一些文本内容来查询我们需要的信息,实现我们“提问”,公众号自动“回答”,将微信公众号接入我们自己的网站,通过微信将消息转发给用户。
准备 |
在上篇文章-【微信开发】开启开发者模式中,我们已经使用开发者模式绑定了我们自己的服务,完成了开发者身份的验证,这次需要添加的是对用户信息处理的方法。
微信进行开发者身份验证是会向填写的服务器发送一个get请求,而用户发送的消息则是向服务器发送一个post请求,也就是说如何使用同一个服务器地址,同时可以响应不同类型的请求。
[HttpGet]
[ActionName("Index")]
public ActionResult Get()
{}
[HttpPost]
[ActionName("Index")]
public ActionResult Post()
{}
通过注解的方式,实现了不同的请求方式跳转到不同的方法,访问的却是同一个地址:http://localhost:7388/WeiChatTest/Index
开发 |
微信公众平台发给开发者后台的是XML格式的数据,如粉丝向公众号发送“Hello”,开发者后台接收到的是:
<xml>
<ToUserName><![CDATA[公众号]]></ToUserName>
<FromUserName><![CDATA[粉丝号]]></FromUserName>
<CreateTime>1460537339</CreateTime>//时间戳,发送时间
<MsgType><![CDATA[text]]></MsgType>//消息类型
<Content><![CDATA[Hello]]></Content>//消息内容
<MsgId>6272960105994287618</MsgId>//消息ID,为了标识消息,微信后台系统自动产生
</xml>
同样的,开发者后台返回的消息,也要符合上面的XML数据格式。微信支持除文本外,如图片、语音、视频等消息类型,为了便于上手,这次只使用文本消息类型来说明,基本的代码如下所示:
public ActionResult Post()
{
//接收数据
System.IO.StreamReader reader = new System.IO.StreamReader(Request.InputStream);
String xmlData = reader.ReadToEnd();
XElement xdoc = XElement.Parse(xmlData);
//解析XML
var toUserName = xdoc.Element("ToUserName").Value;
var fromUserName = xdoc.Element("FromUserName").Value;
var createTime = xdoc.Element("CreateTime").Value;
var msgtype = xdoc.Element("MsgType").Value;
var content = xdoc.Element("Content").Value;
DateTime datatime = DateTime.Now;
int datetime = 1460541339;
//回复内容
StringBuilder resxml = new StringBuilder(
string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>", fromUserName, toUserName, datetime));
resxml.AppendFormat("<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{0}]]></Content><FuncFlag>0</FuncFlag></xml>", content);
string msg = resxml.ToString();
return Content(msg);
}
测试 |
在使用公众号进行真实环境测试之前,可以借助微信平台提供的接口测试工具来进行测试。
- 测试结果如下图所示,返回了一条XML格式的数据,请求成功。
- 关注微信公众号,发送消息。