(php)公众号与服务器之间的沟通处理
声明:这里我用的服务器是新浪SEA(实在没得备案域名啊),你的接口配置已经配置好
一、如果是php版本5以上就一定要用 $postStr=file_get_contents("php://input"); 来接收微信给你的xml消息 ($_post接收不了xml这种消息格式, $GLOBALS['HTTP_RAW_POST_DATA'] 这个虽然可以接收下xml消息,但是对于php高版本已经没用了,况且这个效率没有 file_get_contents("php://input"); 高)
二、用 $arr=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA); 这个函数来解析xml格式的数据(得到一个对象)
三、$msgType=trim($arr->MsgType); 就能得到用户发送的是什么消息过来,然后switch一下进行相应的处理
四、然后用
$res="<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
sprintf($res,$arr->FromUserName,$arr->ToUserName,time(),$content);
组装好了数据以后用这种形式echo出去 (注意空格,微信官方给出的代码,里面有空格 发送到的时候,ToUserName FromUserName的身份一定要弄明白 接收的时候To是你自己,那么发出去,From也是你自己)
五、注意 发送的时候<Content><![CDATA[%s]]></Content>这里面一定要有东西 不然微信报错:无法提供服务,请稍后再试
下面是源码:
<?php
$wechatObj = new wechatCallbackapiTest();
$wechatObj->responseMsg();
class wechatCallbackapiTest
{
//响应接受到微信发来的用户消息
public function responseMsg(){
//接受到的消息
$postStr=file_get_contents("php://input");
if(!empty($postStr)){
//回复的消息
$result='';
//回复用户之前把微信发来的消息写入日志
$handleStr=iconv('utf-8','gb2312','微信进来 '.$postStr);
$this->logger($handleStr);
$arr=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
$msgType=trim($arr->MsgType);
switch ($msgType) {
case 'text':
//处理文本消息
$result=$this->handleText($arr);
break;
case 'image':
break;
case 'location':
break;
case 'link':
break;
case 'video':
break;
}
//回复给用户的消息写入日志
$handleStr1=iconv('utf-8','gb2312',"回复给用户的消息 \n".$result);
$this->logger1($handleStr1);
echo $result;
}else{
// 没有发送消息,官方给出的回复空串
exit;
}
}
//向用户发送消息的格式处理
public function handleRule($arr,$content){
$res="<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
return sprintf($res,$arr->FromUserName,$arr->ToUserName,time(),$content);
}
//处理文本消息
public function handleText($arr){
$keyword=trim($arr->Content);
if(strstr($keyword,'文本')){//有文本关键字
$content="你有点帅哦";
}else{
//一定要给content一个默认,不然报错
$content='你输的什么啊,不认识你';
}
return $this->handleRule($arr,$content);}
//写日志微信进来
public function logger($res){
//写入日志进文件
file_put_contents( "saestor://domain/file/log.txt",date('Y:m:d H:i:s').' '.$res);
}
//写日志回复出去
public function logger1($res){
//写入日志进文件
file_put_contents( "saestor://domain/file/log1.txt",date('Y:m:d H:i:s').' '.$res);
}
}
?>