PHP微信公众号开发:查询微信精选文章功能实现
本文介绍如何在PHP开发的微信公众号中集成查询微信精选文章的功能。该功能允许用户通过文本交互,根据分类ID或关键词检索微信热门内容,并支持分页浏览,最终返回结构化的图文或文本消息。
准备工作
要实现此功能,需要完成以下前置条件:
- PHP环境:服务器需安装PHP并启用
SimpleXML、CURL扩展。 - BCE API密钥:访问百度开放云平台(BCE),申请微信相关API的
apikey并登录账号。 - 微信公众号后台配置:确保已配置好服务器地址(URL)、Token和EncodingAESKey,且具备处理用户消息的事件处理能力。
核心逻辑与操作流程
第一步:解析用户输入并识别指令
当用户向公众号发送消息时,服务器接收到XML格式的数据。首先需要解析该XML以提取用户内容,并根据关键词前缀判断执行逻辑。
入口为接收到的POST请求数据。代码如下:
if(!empty($postStr)){
//将XML字符串转换为对象
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName; // 发送者ID
$toUsername = $postObj->ToUserName; // 接收者ID(公众号ID)
$keyword = trim($postObj->Content); // 用户发送的具体文字
$time = time(); // 当前时间戳
$msgtype = 'text'; // 默认消息类型
}
第二步:返回文章分类列表
当检测到用户输入包含“文章”二字时,调用API获取所有可用的文章分类ID和名称,并以文本形式回复给用户,便于用户选择。
目的:建立导航菜单。
动作:使用curl发起GET请求。
参数:API地址、Header中的apikey。
$which = mb_substr($keyword, 0, 2, 'UTF-8');
if($which == "文章"){
$ch = curl_init();
$url = 'http://apis.baidu.com/showapi_open_bus/weixin/weixin_article_type';
// 必须设置正确的apikey
$header = array('apikey: 这里填写你的apikey');
curl_setopt($ch, CURLOPT_HTTPHEADER , $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_URL , $url);
$res = curl_exec($ch);
$data = json_decode($res, true);
// 整理分类数据
$articleList = array();
foreach($data['showapi_res_body']['typeList'] as $v){
$articleList[] = $v['id'] . "、" . $v['name'];
}
// 按ID排序以便查找
usort($articleList, function($a, $b) {
return (int)explode("、", $a)[0] - (int)explode("、", $b)[0];
});
$contentStr = implode("\n", $articleList);
// 组装文本回复
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
echo sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
exit();
}
第三步:查询指定分类与关键词的文章
当用户输入格式为“wz[分类ID],[页码],[关键词]”时(例如 wz9,1,科技),系统应返回对应的图文列表。
入口:再次检测 $which 是否为 "wz"。
动作:解析输入参数,构造带参数的API URL,拉取数据并生成图文模板。
elseif($which == "wz"){
// 分割用户输入:wz19,1,篮球 -> [wz19, 1, 篮球]
$params = explode(',', $keyword);
if(count($params) != 3) { echo "格式错误,请输入 wz[分类id],[页码],[关键词]"; exit(); }
$art_id = str_replace('wz', '', $params[0]); // 提取分类ID
$page_id = $params[1]; // 页码
$keyname = $params[2]; // 关键词
$ch = curl_init();
$url = 'http://apis.baidu.com/showapi_open_bus/weixin/weixin_article_list?typeId=' . $art_id . '&page=' . $page_id . '&key=' . urlencode($keyname);
$header = array('apikey: 这里填写你的apikey');
curl_setopt($ch, CURLOPT_HTTPHEADER , $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_URL , $url);
$res = curl_exec($ch);
$data = json_decode($res, true);
// 截取前几篇文章生成图文列表(限制7篇以内)
$newsItems = "";
$count = 0;
if(isset($data['showapi_res_body']['pagebean']['contentlist'])){
foreach($data['showapi_res_body']['pagebean']['contentlist'] as $v){
if($count >= 7) break;
$newsItems .= "<item>
<Title><![CDATA[" . htmlspecialchars($v['title']) . "]]></Title>
<Description><![CDATA[" . htmlspecialchars($v['desc']) . "]]></Description>
<PicUrl><![CDATA[" . htmlspecialchars($v['contentImg']) . "]]></PicUrl>
<Url><![CDATA[" . htmlspecialchars($v['url']) . "]]></Url>
</item>";
$count++;
}
}
// 组装图文消息模板
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>%d</ArticleCount>
<Articles>%s</Articles>
</xml>";
echo sprintf($textTpl, $fromUsername, $toUsername, $time, $count, $newsItems);
exit();
}
注意事项与排错
- API Key有效性:务必在
$header数组中替换为真实的apikey,否则API会返回拒绝访问的错误代码。 - 编码问题:用户输入的中文关键词在拼接URL时需进行
urlencode()处理,防止乱码。 - 安全转义:在生成XML输出时,对标题、描述等用户可控或外部数据字段建议使用
htmlspecialchars()或类似方法进行转义,防范XSS风险。 - 图片显示:若图文消息无法显示图片,通常是因为图片链接非HTTPS或不兼容,请检查API返回的
contentImg字段。
以上就是利用PHP在微信公众号中查询微信精选文章的详细内容,更多关于微信公众号开发、API集成的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













