【微信服务号开发】02.文字消息和图文消息自动回复实现
作者:stark wang
上一篇 【微信服务号开发】01.接入指南
https://segmentfault.com/a/11...
接收消息
- 当我们向测试号发送信息的时候,就是微信像这个接口发送一个post请求
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
我们可以使用以下方式来接收post请求
两种方式,如果一种方式失败,不兼容,可以使用另一种方式
// $postStr = file_get_contents('php://input');
$postStr = $GLOBALS['HTTP_RAW_POST_DATA'];
当然 接收的信息是 以xml格式体现,下面会讲到怎么提取。
记录日志
当我们在本地开发测试的时候,想知道我们发送的什么信息,我们可以在本地记录一下
使用 file_put_contents 这个函数写入日志
if (empty($postStr)) {
file_put_contents('wx.log','post数据为空'.FILE_APPEND."\n",FILE_APPEND);
}
file_put_contents('wx.log',$postStr,FILE_APPEND);
当用户发送请求后,会在本地生成 wx.log
1512612101
6496619505755885384
此时是xml格式
我们需要把 xml格式转换成对象
$xml = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
自动回复
https://mp.weixin.qq.com/wiki...
接收普通消息
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
请注意:
1、关于重试的消息排重,推荐使用msgid排重。
2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,
可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
3、如果开发者需要对用户消息在5秒内立即做出回应,即使用“发送消息-被动回复消息”接口向用户被动回复消息时,可以在
公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息和开发者回复的消息都会被加密(但开发者通过客服
接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“发送消息-被动回复消息加解密说明”。
实现向用户自动回复消息
当用户发送消息后,我们接收到消息后,可以根据消息的内容,向用户发送自定义的信息。
必须是xml 格式
文本消息
各消息类型的推送XML数据包结构如下:
1348831860
1234567890123456
代码实现
// 当用户回复一些信息的时候,我们需要向用户回复一些特定的内容
// replyMsg 函数是处理 xml 格式,把需要的数据重新组装
function replyMsg($content){
global $xml;
$str = sprintf('
%d
1234567890123456
',$xml->FromUserName,$xml->ToUserName,time(),$content);
echo $str;
}
if (!empty($xml->Content)) {
replyMsg('hi 你想干嘛?');
}
输出的信息
- 当微信向url请求post 数据,然后返回以下信息,微信接收这些信息后,会处理,给你回复。
1512615523
1234567890123456
回复图文消息
xml 格式
12345678
2
-
-
php代码函数实现
function replyArticle($data){
global $xml;
$article = ''.count($data).' ';
$article .= '';
foreach ($data as $value) {
$article .= sprintf(' ',$value['title']);
$article .= sprintf(' ',$value['desc']);
$article .= sprintf(' ',$value['picurl']);
$article .= sprintf(' ',$value['url']);
}
$article .= ' ';
$str = sprintf('
%d
%s ',$xml->FromUserName,$xml->ToUserName,time(),$article);
file_put_contents('wx.log',$str."\n\n",FILE_APPEND);
echo $str;
}
测试图文消息
// 测试图文消息
if (!empty($xml->Content)) {
$data = [
[
'title' => '安琪拉',
'url' => 'http://stark.wang',
'picurl' => 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1513221767&di=112afbccd30f26c20392a7dfff06926a&imgtype=jpg&er=1&src=http%3A%2F%2Fqtimg.bdstatic.com%2Fhiapk%2Fgame%2F201707%2F04%2F595af6d2285d9.jpg',
'desc' => 'hi 安琪拉!!!'
],
[
'title' => '李白,今朝有酒今朝醉',
'url' => 'http://stark.wang',
'picurl' => 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1512627415601&di=a48be9abc9661620472cf49c9388f221&imgtype=0&src=http%3A%2F%2Fi1.17173cdn.com%2F2fhnvk%2FYWxqaGBf%2Fcms3%2FXivJLTbldqzvDcv.jpg',
'desc' => '今朝有酒今朝醉,李白就是一个诗人'
],
[
'title' => '钟馗',
'url' => 'http://stark.wang',
'picurl' => 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1513222223&di=40ac217b31655f2dee782c8be7c67aa4&imgtype=jpg&er=1&src=http%3A%2F%2Fzhidao.3533.com%2Fuploads%2Fanswer%2F20160324%2F34c6cc35fe42f302e4c96b9984f55c5e.jpg',
'desc' => '哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈'
],
];
replyArticle($data);
}
日志
1512617634
3