本例是作者初次尝试微信公众平台开发之作,实现传统的关键字请求响应功能。即:用户发关键字,公众号通过关键字进行检索, 在mysql数据库中读取与关键字相关的信息,并返回给用户。本例在微信订阅号(开发者模式)上实现,目的是学习微信公众平台开发、验证SAE的功能,并研究SAE+微信公众平台的实用性及应用场景。因仅是进行技术学习的示例子,所以忽略公众号在非开发者模式下可以简单实现该功能的事实。
感谢方倍公作室的教程,让我一开始就站上一个高度:微信公众平台开发入门教程
应用比较简单,直接上代码了:
<?php define("TOKEN", "gettime"); //"gettime",公众号开发者模式需要的TOKEN $wechatObj = new wechatCallbackapiTest(); if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); } class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ header('content-type:text'); echo $echoStr; exit; } } private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } private function getNote($noteID){ $mysql_server_name="SAE_MYSQL_HOST_M"; //数据库服务器名称 $mysql_server_port="SAE_MYSQL_PORT"; $mysql_username="SAE_MYSQL_USER"; // 连接数据库用户名 $mysql_password="SAE_MYSQL_PASS"; // 连接数据库密码 $mysql_database="SAE_MYSQL_DB"; $strReturn = "default"; // 连接到数据库 //$conn=mysql_connect($mysql_server_name.":".$mysql_server_port, $mysql_username,$mysql_password); $conn = mysql_connect(SAE_MYSQL_HOST_M.":".SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); /* if($conn){ $strReturn = "connected"; } else{ $strReturn = "not connected"; } */ // 从表中提取信息的sql语句 $strsql=sprintf("SELECT concat(note_name,':',note_info) FROM `note_info` where note_id=%s",$noteID); // 执行sql查询 $result=mysql_db_query(SAE_MYSQL_DB, $strsql, $conn); //mysql_select_db(SAE_MYSQL_DB,$conn); //$result=mysql_query($strsql, $conn); // 获取查询结果 if($result){ $row = mysql_fetch_row($result); if($row){ $strReturn = $row[0]; } else{ $strReturn = sprintf("keyword<%s>not found",$noteID); } } else{ $strReturn = "result empty"; } // 释放资源 mysql_free_result($result); // 关闭连接 mysql_close($conn); return $strReturn; } 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; $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; if(!empty($keyword)) { // $msgType = "text"; $contentStr = $this->getNote($keyword); //$contentStr = $keyword; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } else{ echo "error!"; exit; } }else{ echo ""; exit; } } } ?>
代码核心功能是访问SAE的MySql服务。本例采用共享型数据库。通过关键字noteID检索表note_info。SQL语句展示的表名和字段:
$strsql=sprintf("SELECT concat(note_name,':',note_info) FROM `note_info` where note_id=%s",$noteID);
其中连接数据库部分花了大量时间,原因是对mysq、SAE的使用都不熟悉。注意下面两行代码,到现在还不大明白为什么注释掉的那一行不行。
//$conn=mysql_connect($mysql_server_name.":".$mysql_server_port, $mysql_username,$mysql_password);
$conn = mysql_connect(SAE_MYSQL_HOST_M.":".SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
除数据库访问部分外,大部分是微信平台规范性代码。该部分代码请引文作了详细解释。实际效果: