用Sina App Engine SAE开发微信平台 0

用Sina App Engine SAE开发微信平台 0

最近在用SAE开发自己学校社团的微信平台 ,PHP代码写的,由于刚刚接触微信平台 ,如何回复用户的消息就弄了半天,模拟登录什么的现在还没搞出来,只做了最简单的关键字回复和SQL调用

被动回复文本功能

首先总结一下微信的回复功能  微信的官方文档上的介绍

对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。请注意,回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器,只支持认证服务号。

如下是一个特定的XML结构

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

微信平台的回复消息不能简单的通过echo来回复 ,要通过如上所示的特定XML包来进行回复。

如下是一段回复文本的示例代码

public function responseMsg()
    {
		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      	//extract post data
		if (!empty($postStr)){

              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
            	$frommsgType=$postObj->MsgType;
                $keyword = trim($postObj->Content);
                $time = time();
                $textTp = "<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( $postStr ))
                {
              		$msgType = "text";
                    $contentStr=checkType($frommsgType,$postObj);
                    $resultStr=sprintf($textTp, $fromUsername, $toUsername,$time, $msgType, $contentStr);
                    echo $resultStr;            
                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }
    }

这个函数就是微信回复的主体了 首先获取了 $postStr这个字符串  然后调用simplexml_load_string 把XML结构包加载到一个对象里$postObj  这里我们要回复一个消息XML包,内容包括    目的用户名   来源用户名 时间戳 消息类型 内容  FunctionFlag()  暂时不知道这个是干什么的,刚刚尝试了一下去掉也可以发送。

用户名是给每个关注同一平台的用户分配的不同名称,不同于用户的微信号,用户名是用复杂的字母数字组合在一起的(HEX值)  所以这里用户名要靠postObj保存下来,需要注意的是,在回复消息的时候  要用发送来的数据包的 来源用户名 作为ToUserName  把目的用户名  即自己的微信平台用户名作为FromUserName  很好理解 不做解释

这里用了%s来补要输入的文本的位置,只要后面调用sprintf  就会把%s换成相应的文本

$contentStr是内容字串,通过另一个函数生成 然后就填入了要发送的XML包 $resultStr

最后要 echo $resultStr 不然微信端是收不到消息的

在SAE用PHP对MySQL进行操作

SAE提供了默认的几个常量 在连接到数据库的时候需要使用

用户名  : SAE_MYSQL_USER
密  码 : SAE_MYSQL_PASS
主库域名 : SAE_MYSQL_HOST_M
从库域名 : SAE_MYSQL_HOST_S
端  口 : SAE_MYSQL_PORT
数据库名 : SAE_MYSQL_DB

SQL服务器链接的函数是 : mysql_connect(HOST:PORT,USERNAME,PASS); 链接成功会返回一个字符串  否则返回false

检测SQL函数的故障 最好使用 mysql_error()函数,这个函数能清楚的显示出问题所在 ,因此调试SQL的时候可以开一个临时页面来调试 在浏览器上echo错误信息

SQL数据库的链接函数是 mysql_select_db(DATABASE,[可选参数$connstr]);

$connstr是mysql_connect 的返回字串,如果缺省默认为上一次链接返回的字串

注意  mysql_select_db第一个参数是链接的数据库的名称而不是数据表的名称 在SAE中都用SAE提供的常量代替自己输入

SQL调用查询语句的函数是  mysqk_query($QUERYSTR);  $QUERYSTR可以是任意一个语法正确的SQL语句,返回值为一个字串   这里假设为$queryResStr

SQL数据读入数组的函数是 mysql_fetch_data($queryResStr); 这里注意,, 参数是$queryResStr而不是$connstr。  如果遇到了问题就用mysql_error()进行调试就好~ 都可以解决的

下面是一段添加一条记录到数据库的代码

 

function writeToDB($id,$brand,$type)
{
    //$connstr=mysql_connect($db_host.":".$db_port,$db_user,$db_pass);
    $connstr = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
    if(!$connstr) return -1;									//连接错误返回-1
   	$err=mysql_select_db(SAE_MYSQL_DB,$connstr);
    if(!$err) return -2;
    $SQLQUERY="INSERT INTO reservation (ID,brand,type,date,ok)"."VALUES("."'".$id."','".$brand."','".$type."','".date("Y-m-d")."','0')";
    echo $SQLQUERY."<br/>";
    $err=mysql_query($SQLQUERY,$connstr);
    echo mysql_error();
    mysql_close($connstr);
    if(!$err) return 1;
    return 0;

}

 

Leave a Reply

Your email address will not be published. Required fields are marked *

3 × one =

This site uses Akismet to reduce spam. Learn how your comment data is processed.