不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼。于是今天兴致来潮,想做一个试试。
首先找到了开发者文档,看了看,蛮简单的。(公众号早已申请,有兴趣可以关注看看:zyjsoft)
第一步(提供接口,供微信调用,由于是HTTP请求,于是我用MVC模式做了一个简单的接口):
//认证接口
public ActionResult WeiXin(string signature, string timestamp, string nonce, string echostr)
{
//暂不验证
return Content(echostr);
}
//接收/回复 消息接口
[HttpPost]
public ActionResult WeiXin()
{
//xxxx
}
从文档中看出,认证时使用GET方式请求接口地址,发送消息时使用POST方式请求接口地址,因此写了以上两个Action来处理
接口地址为:http://182.92.104.112/wx/open/weixin
暂时未认证,大家可以试着玩玩~~~
第二步 接收和响应消息
接下来看怎么接收和响应数据:
从官方文档抄来:
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。各消息类型的推送XML数据包结构如下 ===文本消息(接收) <xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应
===文本消息(响应)
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
看上去也是蛮简单的,就是按照指定XML格式解析、构成就OK了。
代码很快就写完了(具体实现代码就不贴上来了,主要就是实现POST的那个Action,也比较简单),开始测试:
Test-1:失败(响应空字符串,原因:未取到参数,因为取Xml的数据包是通过Request.InputStream来取的,而并非Forms)…… 改……
Test-2:失败(响应正确,微信客户端可无法接收到消息。原因:可能字段顺序与官方不相同)……改……
Test-3:失败(响应正确,微信客户端仍无法接收到消息。原因:可能是返回MIME类型需要text/xml和Encoding需要UTF8)……改……
Test-4:失败(响应正确、顺序正确、Encoding正确、MIDE类型正确,可就是收不到消息)……没改的了,能改的都改了,就是不出来
表示测试一次非常麻烦啊:编译=>发布=>再测试
以下是官方在线测试工具响应结果:
每个字符都对了,跟官方例子完全一致,就是不知道哪里出问题了,网上的资料都是说要么少几个字符、要么格式不对什么的。
最后找了很久……了很久……很久……久…… 仔细叮着那几句简单的代码看,最后终于在代码中找到了个巨坑:
发现这个巨坑后我怀疑跟什么字段顺序、IMIE类型没有丝毫关系,之前改的都是做无用功罢了
为了让大家能搜索到这个问题,将这个巨坑放在下一篇文章讲解……
|