使用新浪云(SAE)实现基于mySql和微信公众平台的关键字请求响应服务

    本例是作者初次尝试微信公众平台开发之作,实现传统的关键字请求响应功能。即:用户发关键字,公众号通过关键字进行检索, 在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);

除数据库访问部分外,大部分是微信平台规范性代码。该部分代码请引文作了详细解释。实际效果:

 使用新浪云(SAE)实现基于mySql和微信公众平台的关键字请求响应服务