zoukankan      html  css  js  c++  java
  • 使用新浪云(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);

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

     


    
    
     
  • 相关阅读:
    #轻重链剖分,交互#LOJ 6669 Nauuo and Binary Tree
    #贪心#洛谷 6093 [JSOI2015]套娃
    #根号分治,树上倍增#洛谷 3591 [POI2015]ODW
    #KD-Tree,替罪羊树#洛谷 6224 [BJWC2014]数据
    #K-D Tree#洛谷 2093 [国家集训队]JZPFAR
    nim-lang: UUID shellcode execution(过所有杀软)
    nim-lang 免杀测试:回调函数结合隐写术
    Shellcode Injection via Callbacks(nim学习系列)
    Reflective dll injection(nim 学习系列)
    搭建简易的 http server(nim 学习系列)
  • 原文地址:https://www.cnblogs.com/LongMarch/p/5206345.html
Copyright © 2011-2022 走看看