本文分享一个在SAE环境下搭建的微信公众平台开发Demo,使用CodeIgniter框架实现。虽然该Demo功能简单,但展示了微信消息接收、处理及回复的核心流程,适合初学者参考学习。
控制器Welcome继承自CI_Controller,入口方法index()直接调用responseMsg()处理微信消息:
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
define("TOKEN", "109");
class Welcome extends CI_Controller {
public function index() {
$this->responseMsg();
}
public function responseMsg() {
$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();
// 根据消息类型处理
switch($MsgType) {
case 'text':
$keyword = trim($postObj->Content);
// 文本消息回复模板
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</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': // 图文消息示例
$newsTpl = "... 此处省略图文模板XML ...";
$resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, 'news', '百度', '', 'https://www.baidu.com/img/bdlogo.gif', 'https://www.baidu.com', 'Google', '', '', 'https://www.google.com');
echo $resultStr;
exit;
case '4':
$contentStr = "该功能正在开发中,敬请期待...";
break;
default: // 帮助菜单
$contentStr = "回复数字 选择服务\n";
$contentStr .= "1 笑话精选\n";
$contentStr .= "2 获取您的Username...\n";
$contentStr .= "3 图文消息示例\n";
$contentStr .= "4 开发中...\n";
break;
}
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);
break;
case 'image': // 图片消息原样返回
$media_id = $postObj->MediaId;
$imgTpl = "<xml>...</xml>";
$resultStr = sprintf($imgTpl, $fromUsername, $toUsername, $time, 'image', $media_id);
break;
case 'voice': // 语音消息固定回复
$textTpl = "<xml>...</xml>";
$contentStr = '你啥?俺听不见...';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);
break;
default:
$resultStr = "Input something...";
break;
}
echo $resultStr;
} else {
echo "";
exit;
}
}
}
TOKEN,实际部署需在微信公众平台配置一致。simplexml_load_string解析XML,需注意LIBXML_NOCDATA参数保留CDATA内容。MsgType分发。$this->db->query()查询用法。ArticleCount与item数量对应。1. 将代码部署至支持PHP的服务器(SAE、本地Apache/Nginx均可)。
2. 在微信公众平台“基本配置”填写服务器URL和Token。
3. 启用服务器配置后,关注测试号发送数字1-4即可体验对应功能。
可在此基础上集成:用户会话管理、素材管理、模板消息发送、OAuth网页授权等高级接口,构建完整的微信应用。