这学期其中一个主要的项目就是微信公众平台的消息接口,自从接口放出来第二天就开始根据接口做了一系列的东西,现在这一系列的第一个版本基本稳定下来了,现在这就做一个总结吧。

微信公众平台接口

先看看接口的格式吧。主要就是认证格式,请求格式和应答格式

认证格式
认证信息

如上图,就是在接入微信接口的信息,其中有用的就是 URL 和 Token,认证的方式就是微信服务器 GET 提交以下四个参数到你填写的 URL 上

signature — 微信加密签名;
timestamp — 时间戳;
nonce — 随机数;
echostr — 随机字符串;

其中 signature 是通过 token,timestamp,nonce 这三个参数进行字典排序后连接为一个字符串后 SHA1 加密,开发者也需要通过同样的方法来对 GET 过来的网址进行验证,验证通过了就原样输出 echostr。

请求格式

当公众平台收到来自用户的消息,就会 Post 消息到 上面的 URL 上面,POST 数据的格式根据类型的不同有不同的格式,现在就主要是两种格式:普通文本和地理位置消息。

普通文本的消息格式如下

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1348831860</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[this is a test]]></Content>
</xml>

地理位置消息

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1351776360</CreateTime>
    <MsgType><![CDATA[location]]></MsgType>
    <Location_X>23.134521</Location_X>
    <Location_Y>113.358803</Location_Y>
    <Scale>20</Scale>
    <Label><![CDATA[位置信息]]></Label>
</xml>

上面的结构都是比较清晰的,所以就不再解释了,这两种格式都还是满足需要的。主要是这种格式没办法用 PHP 里面的 $_GET$_POST 来接收,只能照示例中的 $GLOBALS["HTTP_RAW_POST_DATA"];这种接收原始数据。

应答格式

在接收到数据后作相应处理后就应该返回相应的结果了,可以返回纯文本的格式和图文格式,直接根据格式输出到页面上面就行了。

文本格式如下

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[content]]></Content>
    <FuncFlag>0</FuncFlag>
</xml>

其中 FuncFlag 指示的是可以对回复的消息进行星标。

文本格式如下

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <Content><![CDATA[]]></Content>
    <ArticleCount>2</ArticleCount>
    <Articles>
    <item>
    <Title><![CDATA[title1]]></Title>
    <Description><![CDATA[description1]]></Description>
    <PicUrl><![CDATA[picurl]]></PicUrl>
    <Url><![CDATA[url]]></Url>
    </item>
    <item>
    <Title><![CDATA[title]]></Title>
    <Description><![CDATA[description]]></Description>
    <PicUrl><![CDATA[picurl]]></PicUrl>
    <Url><![CDATA[url]]></Url>
    </item>
    </Articles>
    <FuncFlag>1</FuncFlag>
</xml>

图文消息就是比较复杂了,主要就是多了 Article 的一个 List,用来显示图文的列表的,这里列表最多项是 10 项

微信公众平台的接口主要就是实现程序化的对消息进行处理,然后返回,刚拿到接口示例还是有代码的错误的,只有自己根据示例代码更改了一版正确可用的程序。接口类似一个简单的 HTTP 协议,微信用户(客户机)请求服务器(接入的第三方服务器),服务器处理,然后返回给客户,简单,以至于可以说是简陋是因为,一、不支持服务器主动推送消息,当然除过 WebSocket,HTTP 这里也不支持主动推送,但是可以使用脚本来模拟主动推送,但公众平台接口根本就不支持任何方式的主动推送。二、没有现成的类似 Cookie 的客户机标记,存储的东西,所以每次的请求都必须按照新的 Session 来做,虽然说可以通过返回到服务器的用户 ID 来模拟 Session,但毕竟有些复杂了,所以在我们的第一版中并没有加进去。三、不支持 GET,POST 等等参数,所有的请求信息都来源于用户。

代码过程中遇到的问题和心得

这是第一次和别人在同样的方向做合作,之前都是前后分工或者按语言分工的。主要遇到的问题还是耦合的问题,主要是构造了微信类,来对信息进行接收和发送,因为只能发送给接收到的人,所以接收人这些信息基本没有用,都隐藏在类之中,只留有 getMsg() 和 sendMsg() 两个方法和 msgType,fromUser 等属性。还有就是发现自己的思想别人很难理解,同样别人的思想自己也很难理解。

就写这些了,更多的就看官方的文档吧 微信公众平台消息接口使用指南,这个指南中还有示例代码的下载。