基于 CodeIgniter 的微信公众平台交互 DEMO
本文展示了一个使用 CodeIgniter 框架实现的微信公众平台核心交互逻辑。代码涵盖了获取微信服务器 POST 请求、解析 XML 数据以及针对文本、图片和语音消息的不同处理策略。
结果与目标
本示例旨在提供一个基础的微信开发者后台响应模板。通过部署在类似 SAE(新浪云应用)的环境中,公众号可以接收用户的文本指令、图片及语音消息,并返回对应的文字、图片或默认提示。虽然现代微信开发多采用官方 SDK,但理解底层的 XML 解析与路由分发逻辑仍具有重要意义。
准备条件
- 已安装并配置好
CodeIgniter框架环境。 - 拥有一个已认证的微信公众平台账号,并完成服务器 URL 与 Token 的配置验证。
服务器需支持 PHP 运行,并能正确接收 XML 格式的 POST 请求。
真实操作顺序
第1步:定义 Token 与初始化控制器
首先,定义用于微信服务器验证的 Token。在实际项目中,这通常从配置文件读取。控制器继承自 CI_Controller,确保框架正常加载。
// define your token
define("TOKEN", "109");
class Welcome extends CI_Controller {
public function index() {
// 调用消息响应方法
$this->responseMsg();
}
}
第2步:解析 POST 原始数据
微信服务器发送的消息体并非标准的 $_POST 数组,而是原始 POST 字符串。需要读取 $GLOBALS["HTTP_RAW_POST_DATA"] 并利用 simplexml_load_string 将其转换为对象,以便提取关键属性如 FromUserName、ToUserName 和 MsgType。
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$MsgType = $postObj->MsgType;
$time = time();
}
第3步:根据 MsgType 分发处理逻辑
使用 switch 语句判断消息类型,主要覆盖文本(text)、图片(image)和语音(voice)三种常见情况。
处理文本消息 (Text)
当 MsgType 为 text 时,获取用户发送的内容 Content 并进行关键字匹配:
- 关键字 1:连接数据库查询笑话表(示例中使用了简化的 SQL 查询),随机返回一条笑话内容。
- 关键字 2:直接返回发送者的 OpenID(
fromUsername)。 - 关键字 3:构建 XML 格式的图文消息模板,返回包含标题、描述、图片和链接的条目列表。注意此处应使用
exit而非break以终止后续输出。 - 默认情况:若未识别关键字,回复菜单指引信息。
switch($MsgType){
case('text'):
$keyword = trim($postObj->Content);
$textTpl = "<xml>...</xml>"; // 省略具体XML模板字符串以保持简洁
switch($keyword){
case(1):
$sql = 'SELECT * FROM jokes';
$query = $this->db->query($sql);
$res = $query->result_array();
$num_rows = $query->num_rows();
$key = rand(0, $num_rows - 1);
$contentStr = $res[$key]['content'];
break;
case(2):
$contentStr = 'Your fromUsername is: '.$fromUsername;
break;
case(3):
// 构建图文消息 XML
$newsTpl = "<xml>...</xml>";
$resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time,'news', ...);
echo $resultStr;
exit;
default:
$contentStr = "回复数字选择服务...";
break;
}
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, time, 'text', $contentStr);
break;
// ... 其他类型处理
}
处理图片消息 (Image)
接收用户发送的图片,获取其 MediaId,并构造图片类型的 XML 响应模板进行回传。这表明服务器可以简单地转发或处理接收到的多媒体资源 ID。
case('image'):
$media_id = $postObj->MediaId;
$imgTpl = "<xml>...<Image><MediaId><![CDATA[%s]]></MediaId></Image></xml>";
$resultStr = sprintf($imgTpl, $fromUsername, $toUsername, time, 'image', $media_id);
break;
处理语音消息 (Voice)
对于语音消息,当前示例仅返回固定的测试文本。在实际应用中,此处可对接语音识别 API 将语音转为文字后再进行处理。
case('voice'):
$textTpl = "<xml>...</xml>";
$contentStr = '你说啥?俺听不见...';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, time, 'text', $contentStr);
break;
完成判断
代码成功执行后,当用户在微信公众号中输入数字 1、2 或 3,或通过微信客户端发送图片/语音,服务器将解析请求并按预设逻辑返回相应的 XML 数据包。微信客户端会据此渲染出对应的笑话文本、OpenID 文字、图文卡片或图片。
简要总结
该 CodeIgniter 示例清晰地展示了微信公众号开发的底层数据流转过程:从原始 POST 数据接收,到 XML 解析,再到基于消息类型的逻辑分支处理。尽管其中部分数据库查询和模板拼接方式较为简陋,但它为核心原理提供了直观的实现路径。以上就是基于 CodeIgniter 实现微信公众平台基础交互的详细内容,更多关于 PHP 后端开发与微信接口集成的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













