CleverCode前一段时间想去接触一下微信开发,申请了一个人订阅号,发现暂不能申请个人认证,而且没有微信接口的很多权限,也没有自定义菜单的权限(开发模式下)。在开发模式下,只能到手公众号里面的回复信息,然后响应。
<?php /** * ApithxlController.php * * 太好笑了接口 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/7/10, by CleverCode, Create * */ define("TOKEN", "CleverCode"); define("HTTP_RAW_POST_DATA_TEST", WEB_ROOT_DIR . '/log/http_raw_post_data_test.txt'); define("HTTP_REQUEST_RESPONSE_LOG", WEB_ROOT_DIR . '/log/http_request_response_log-' . date('Y-m-d') . '.txt'); class ApithxlController extends My_Controller{ public $check_auth = false; public $check_auth_menu = false; /** * 命令接口 * * @return void */ function interfaceAction(){ $ret = $this->_interface(); } /** * 私有命令接口 * * @return string 成功返回'OK',失败返回错误信息 */ private function _interface(){ $request = array(); // 获取参数 $ret = $this->_getRequest($request); if ($ret != 'OK') { return $ret; } // 检查签名 if (!WeiXinCheck::checkSignature($request["signature"], $request["timestamp"], $request["nonce"])) { return 'checkSignature retrun false!'; } // 请求日志 if (!empty($GLOBALS["HTTP_RAW_POST_DATA"])) { logMsg(HTTP_REQUEST_RESPONSE_LOG, 'REQUEST', $GLOBALS["HTTP_RAW_POST_DATA"]); } // 解析文本命令 $cmd = CmdCenter::findCmd($request); $retArray = array(); $retArray['request'] = $request; // 执行命令 switch ($cmd) { // 校验 case 'validate' : $retMessage = InfoCenter::validate($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/validate.html'); break; // 再来一个 case 'getOneAgain' : $retMessage = InfoCenter::getOneAgain($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 查看帮助 case 'readHelp' : $retMessage = InfoCenter::readHelp($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 账户详情 case 'accountDetail' : $retMessage = InfoCenter::accountDetail($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 兑换奖品 case 'exchangePrizesDescribe' : $retMessage = InfoCenter::exchangePrizesDescribe($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 挣取金币 case 'earnCoin' : $retMessage = InfoCenter::earnCoin($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 点赞 case 'dianZan' : $retMessage = InfoCenter::dianZan($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 我讲一个 case 'addJoke' : $retMessage = InfoCenter::addJoke($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 我的笑话 case 'myJoke' : $retMessage = InfoCenter::myJoke($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 金币记录 case 'tradeLog' : $retMessage = InfoCenter::tradeLog($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 兑换奖品 case 'exchangePrizes' : $retMessage = InfoCenter::exchangePrizes($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 给客服留言 case 'giveMessage' : $retMessage = InfoCenter::giveMessage($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 关注 case 'subscribe' : $retMessage = InfoCenter::subscribe($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; // 默认 default : $retMessage = InfoCenter::cmdNotFound($request, &$retArray); if ($retMessage != 'OK') { return; } $this->displayUTF8($retArray, 'thxl/textMsg.html'); break; } } /** * 获取请求参数 * * @param array $request 请求数组 * @return string 成功返回'OK',失败返回错误信息 */ private function _getRequest(&$request){ // 本机平台 if (SYS_RELEASE == 0) { $_GET["signature"] = '5b7b4a7c06b3bc4116a2fcbbbb2c887557cd07a6'; $_GET["timestamp"] = '1436056391'; $_GET["nonce"] = '1929760760'; // $_GET["echostr"] = 'this is from echostr'; $fp = fopen(HTTP_RAW_POST_DATA_TEST, "r"); $GLOBALS["HTTP_RAW_POST_DATA"] = fread($fp, filesize(HTTP_RAW_POST_DATA_TEST)); fclose($fp); } $request['signature'] = $_GET["signature"]; $request['timestamp'] = $_GET["timestamp"]; $request['nonce'] = $_GET["nonce"]; $request['echostr'] = $_GET["echostr"]; if (isset($GLOBALS["HTTP_RAW_POST_DATA"]) && !empty($GLOBALS["HTTP_RAW_POST_DATA"])) { $request['post'] = array(); $request['post']['items'] = XmlCenter::xmlToArray($GLOBALS["HTTP_RAW_POST_DATA"]); if (isset($request['post']['items']['Content'])) { $request['post']['items']['Content'] = iconv('UTF-8', 'GBK', $request['post']['items']['Content']); } $request['post']['string'] = $GLOBALS["HTTP_RAW_POST_DATA"]; // 插入请求日志 UserLog::insertRequestLog($request); } return 'OK'; } }
<xml><ToUserName><![CDATA[gh_5bcc295a14c4]]></ToUserName> <FromUserName><![CDATA[oihwct-iYa_xYXHAR2ZmnAPasEzQ]]></FromUserName> <CreateTime>1436275541</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[9#123456789]]></Content> <MsgId>6168756476849070426</MsgId> </xml>
<?php /** * CmdCenter.php * * 查找cmd * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/7/10, by CleverCode, Create * */ class CmdCenter{ // 命名字典 public static $cmdMap = array( 'validate' => '接口验证', 'subscribe' => '关注', 'readHelp' => '查看帮助', 'getOneAgain' => '发布一个', 'accountDetail' => '账户详情', 'earnCoin' => '挣取金币', 'dianZan' => '点赞', 'exchangePrizesDescribe' => '兑换奖品描述', 'addJoke' => '我讲一个', 'myJoke' => '我的笑话', 'tradeLog' => '交易记录', 'exchangePrizes' => '兑换奖品', 'giveMessage' => '给客服留言' ); // 数字到字符串命令字典 public static $numToCmdStr = array( '0' => 'readHelp', '1' => 'getOneAgain', '2' => 'exchangePrizesDescribe', '3' => 'earnCoin', '4' => 'accountDetail', '5' => 'myJoke', '6' => 'tradeLog', '7' => 'addJoke', '8' => 'dianZan', '9' => 'giveMessage', '100' => 'exchangePrizes' ); /** * 查找命令 * * @param array $request 请求数组 * @return string cmd */ public static function findCmd($request){ // 验证cmd $cmd = self::findValidateCmd($request); if (strlen($cmd) > 0) { return self::checkCmdValid($cmd); } // 查找文本命令 $cmd = self::findTextCmd($request); if (strlen($cmd) > 0) { return self::checkCmdValid($cmd); } // 查找事件命令 $cmd = self::findEventCmd($request); if (strlen($cmd) > 0) { return self::checkCmdValid($cmd); } } /** * 检查命令的有效性 * * @param string $cmd 命令 * @return string 有效返回$cmd,否则为空 */ public static function checkCmdValid($cmd){ if (isset(self::$cmdMap[$cmd])) { return $cmd; } } /** * 验证命令 * * @param array $request 请求数组 * @return string cmd */ public static function findValidateCmd($request){ if (isset($request['echostr']) && strlen($request['echostr']) > 0) { return 'validate'; } } /** * 查找文本命令 * * @param array $request 请求数组 * @return string cmd */ public static function findTextCmd($request){ if (empty($request['post'])) { return; } $msgType = $request['post']['items']['MsgType']; if ($msgType != 'text') { return; } $content = $request['post']['items']['Content']; $cmd = trim($content); $cmd = ltrim($cmd, '【'); $cmd = rtrim($cmd, '】'); if (strpos($cmd, "#") !== false) { $cmd = substr($cmd, 0, strpos($cmd, "#")); } // 大写 $cmd = strtoupper($cmd); if (!is_numeric($cmd)) { return; } if (isset(self::$numToCmdStr[$cmd])) { return self::$numToCmdStr[$cmd]; } } /** * 查找事件命令 * * @param array $request 请求数组 * @return string cmd */ public static function findEventCmd($request){ if (empty($request['post'])) { return; } $msgType = $request['post']['items']['MsgType']; if ($msgType != 'event') { return; } return $request['post']['items']['Event']; } }
命令帮助: ******************** 0.回复0,查看帮助! 1.回复1,再来一个! 2.回复2,兑换奖品! 3.回复3,挣取金币! 4.回复4,账户详情! 5.回复5,我的笑话! 6.回复6,金币记录! 7.回复7#笑话标题#笑 话正文,我讲一个! 8.回复8#笑话编号,点赞 ! 9.回复9#留言内容,给客 服留言! ********************
<?php /** * InfoCenter.php * * 信息中心 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/7/10, by CleverCode, Create * */ class InfoCenter{ //...... /** * 查看帮助 * * @param array $request 请求数组 * @param array $retArray 返回数组(输出参数) * @return string 成功返回'OK',失败返回错误信息 */ public static function readHelp($request, &$retArray){ $postStr = $request['post']['string']; if (empty($postStr)) { return 'empty($postStr)'; } $retArray['data']['fromUsername'] = $request['post']['items']['ToUserName']; $retArray['data']['toUsername'] = $request['post']['items']['FromUserName']; $retArray['data']['createTime'] = time(); $retArray['data']['msgType'] = 'text'; $content = SmartyWork::fetch(array(), 'thxl/readHelpContent.html'); $content = str_replace("\r", '', $content); $retArray['data']['content'] = $content; return 'OK'; } //...... }