微信开发日记——消息的收发

想着之前的二维码签到,寒假中过年之前学习了下微信的公众平台。在家的心总是静不下来,没有好好总结总结。现在来到学校了,离开学还有一个礼拜的时间,回过头来反思一下。

微信公众平台开发者文档(http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5)是主要的学习资料。当然,首先要注册开发者账号啦,进入管理页关闭编辑模式,选择开发模式。接下来就是服务器配置,URL填写服务器的网址,Token是签名,会和URL文件里的Token相匹对,一致的话才能通过验证,才能添加代码实现下面的功能,检验signature的PHP示例代码可以在接入指南里下载。

下面就是实际的收发消息了,微信的收发是通过XML实现的。当用户发送一段文字给公众账号时,服务器端收到的信息包括发送方的名称FromUserName、接收方的名称ToUserName、发送时间戳CreateTime、消息类型MsgType、消息内容Content以及消息的编号MsgId,返回消息时通过交换FromUserName与ToUserName就可以实现了。

responseMsg()函数通常是用户与公众账号交流的主入口,$postStr = $GLOBALS[“HTTP_RAW_POST_DATA”]总是产生 $HTTP_RAW_POST_DATA 变量包含有原始的 POST 数据,接下来的simplexml_load_string()函数是把XML字符串载入对象中,也就得到了用户的一个对象。

为了方便回复文本消息,写成transmitText()函数,第一个参数时用户对象,第二个是需要回复的文本内容。返回值是通过sprintf()函数合成字符串,这是一个字符串格式化命令,把格式化的数据写入字符串变量中。这样也就组合成一个返回的消息字符串,再echo一下就可以发出去了。

1
2
3
4
5
6
7
8
9
10
11
12
13
private function transmitText($object, $content)
{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>%d</FuncFlag>
</xml>";
$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, time());
return $resultStr;
}

这边可以接入小黄鸡的聊天程序,私有函数如下

1
2
3
4
5
6
7
private function chatWithSimsimi($object)//小黄鸡
{
$keyword = trim($object->Content);
include(’simsimi.php’);
$contentStr = callSimsimi($keyword);
return $contentStr;
}

simsimi.php文件可以再小黄鸡的网站上下载到,就是callSimsimi()函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function callSimsimi($keyword)
{
$params[’key’] = "c7b90c2f-1197-46db-8998-61fb738bb8e1";
$params[’lc’] = "ch";
$params[’ft’] = "1.0";
$params[’text’] = $keyword;
$url = "http://sandbox.api.simsimi.com/request.p?".http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$message = json_decode($output,true);
$result = "";
if ($message[’result’] == 100){
$result = $message[’response’];
}else{
$result = $message[’result’]."-".$message[’msg’];
}
return $result;
}

在该文件里需要填写申请的密钥$params[’key’] ,而且申请只有7天的有效期,上面的那个已经过期了吧,长期的是要付费的。

这样一来一个简单的收发消息就可以实现了,呃,不!这只是简单中的收发文本消息,对于图片、语音、视频、地理位置、链接等通过类似的方法,注意XML中的数据就行了。值得一提的是图文消息,也就是我们通常看到的腾讯新闻推送的类型,指的是图文消息个数,限制为10条以内,有多少个下面的就需要有多少,里包含图文消息的标题,<description>图文消息描述,<picurl> 图片链接,<url> 点击图文消息跳转链接。</url></picurl></description>

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>