我们在关注微信公众号、点击菜单、回复关键词或者执行程序中的某些事件(比如,订单提交成功等。)的时候,可以看到,有些公众号同时给我们回复了两条或两条以上的消息内容。
内容形式不限于文字,可能是这些消息类型:文本为text,图片为image,语音为voice,视频消息为video,音乐消息为music,图文消息(点击跳转到外链)为news,图文消息(点击跳转到图文消息页面)为mpnews,卡券为wxcard,小程序为miniprogrampage
如果给用户发送的是图片/语音/视频等媒体文件时,需要通过素材上传接口,先上传媒体文件,获取media_id
先看看效果:
下面以ecshop的微信通为例来进行讲解(其它程序也类似):
这里以$keyword == 'debug' 即回复关键字”debug“为例(如果需要在用户关注公众号时回复多条,可以在 $keyword == 'subscribe' 条件中处理),来回复用户 文本+ 图片+ 文本
打开站点根目录下的wechat/callback-ent.php文件,搜索if ($keyword == 'debug')(如果该条件下有内容,先删除),因为需要回复的消息中有一条是图片,这里我们先通过素材上传接口上传需要的图片到微信公众号的素材库中(假设服务器根目录下images/qrcode/shop.png图片已经存在):
上传图片到微信公众号的素材管理库并回复用户该图片:
//从数据库 获取access_token
$ret = $db->getRow("SELECT `access_token` FROM ". $GLOBALS['ecs']->table('weixin_config'));
$access_token = $ret['access_token'];
//通过 上传素材接口 获取media_id(如果已经上传并知道media_id,这段不需要,直接在下面需要media_id的地方写上值即可)
$file_path = dirname(dirname(__FILE__))."/images/qrcode/shop.png";//图片在本地服务器上的路径
$file_data = array('media' => '@'.$file_path);
if(strlen($access_token) >= 64)
{
$imgurl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$access_token."&type=image";
$imgres_json =$this -> https_request($imgurl, $file_data);
$imgjson = json_decode($imgres_json);
}
$media_id = $imgjson->media_id;
//回复用户图片
$imgmsgType = "image";
$imgresultStr = sprintf($imageTpl, $fromUsername, $toUsername, $time, $imgmsgType, $media_id);
echo $imgresultStr;
exit;
//回复用户文本消息示例
/*$msgType = "text";
$contentStr = $media_id."——".$access_token."——".$fromUsername;
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
exit;*/
上面的代码主要演示通过素材上传接口上传图片并获取其media_id,然后回复用户该图片,为了实现回复用户两条或两条以上的消息,下面我们使用客服接口:
为了讲解方便,我们还在if ($keyword == 'debug')条件中写,记下上面得到的media_id值(可以通过回复文本的形式输出查看media_id的值),然后把上面的代码换成下面这样:
//从数据库 获取access_token
$ret = $db->getRow("SELECT `access_token` FROM ". $GLOBALS['ecs']->table('weixin_config'));
$access_token = $ret['access_token'];
//回复第一条 文本
$content1="点击菜单微商城或扫描下方二维码,即可进入商城随心购,更有惊喜等您发现!";
$this->replymsg($fromUsername,$access_token,$content1);
//回复第二条 图片
$mediaid = "Wa1Zo-yWRj-uGKRm-leGMVuYn3Sh3EcNehZPgJPcTR0";
$this->replyimg($fromUsername,$access_token,$mediaid);
//回复第三条 文本
$content2="很高兴能收到您的消息,想了解更多资讯或如需帮助,请添加客服微信";
$this->replymsg($fromUsername,$access_token,$content2);
exit;
在wechat/callback-ent.php文件中添加replymsg、replyimg、https_post函数:
private function replymsg($fromUsername,$access_token,$content){
$data = '{
"touser":"'.$fromUsername.'",
"msgtype":"text",
"text":
{
"content":"'.$content.'"
}
}';
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
$result = $this->https_post($url,$data);
$final = json_decode($result);
return $final;
}
private function replyimg($fromUsername,$access_token,$media_id){
$data = '{
"touser":"'.$fromUsername.'",
"msgtype":"image",
"image":
{
"media_id":"'.$media_id.'"
}
}';
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
$result = $this->https_post($url,$data);
$final = json_decode($result);
return $final;
}
private function https_post($url,$data)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
if (curl_errno($curl)) {
return 'Errno'.curl_error($curl);
}
curl_close($curl);
return $result;
}