PHP微信公众号开发:查询微信精选文章功能实现

山海之间
山海之间
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍如何在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();
}

注意事项与排错

  1. API Key有效性:务必在 $header 数组中替换为真实的 apikey,否则API会返回拒绝访问的错误代码。
  2. 编码问题:用户输入的中文关键词在拼接URL时需进行 urlencode() 处理,防止乱码。
  3. 安全转义:在生成XML输出时,对标题、描述等用户可控或外部数据字段建议使用 htmlspecialchars() 或类似方法进行转义,防范XSS风险。
  4. 图片显示:若图文消息无法显示图片,通常是因为图片链接非HTTPS或不兼容,请检查API返回的 contentImg 字段。

以上就是利用PHP在微信公众号中查询微信精选文章的详细内容,更多关于微信公众号开发、API集成的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表