<?php
/**
* wechat php test
*/
//确定下你的token那个地方和微信公众平台的一致。然后URL那个路径是你真正设置验证的这个路径。然后验签那个地方是没有设置才去验签的,!isset()希望能帮到你。望采纳
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if(!isset($_GET['echostr'])){
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
//$wechatObj->valid();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
//响应消息
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);
$RX_TYPE = trim($postObj->MsgType);
//用户发送的消息类型判断
switch ($RX_TYPE){
case "text": //文本消息
$result = $this->receiveText($postObj);
break;
case "image"://图片消息
$result = $this->receiveImage($postObj);
break;
case "voice"://语音消息
$result = $this->receiveVoice($postObj);
break;
case "video"://视频消息
$result = $this->receiveVideo($postObj);
break;
case "location"://位置消息
$result = $this->receiveLocation($postObj);
break;
case "link";//链接消息
$result = $this->receiveLink($postObj);
break;
case "event":// 关注、取消关注事件
$result = $this->receiveEvent($postObj);
break;
default:
$result = "unknow msg type:".$RX_TYPE;
break;
}
echo $result;
}else{
echo "";
exit;
}
}
/**
* 接受文本消息
*/
private function receiveText($object){
$content = "你发送的是文本,内容为:".$object->Content;
$result = $this->transmitText($object, $content);
return $result;
}
/**
* 接受图片消息
*/
private function receiveImage($object){
$content = "你发送的是图片,地址为:".$object->PicUrl;
$result = $this->transmitText($object, $content);
return $result;
}
/**
* 接收语音消息
*/
private function receiveVoice($object){
$content = "你发送的是语音,媒体ID为:".$object->MediaId;
$result = $this->transmitText($object, $content);
return $result;
}
/**
* 接收视频消息
*/
private function receviveVideo($object){
$content = "你发送的是视频,媒体ID为:".$object->MediaId;
$result = $this->transmitText($object, $content);
return $result;
}
/**
* 接收位置消息
*/
private function receiveLocation($object){
$content = "你发送的是位置,维度为:".$object->Location_X.";维度为:".$object->Location_Y."缩放级别为:".$object->scale.";位置为:".$object->Label;
$result = $this->transmitText($object, $content);
return $result;
}
/**
* 接收链接信息
*/
private function receiveLink($object){
$content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url;
$result = $this->transmitText($object, $content);
return $result;
}
/**
* 关注 取消关注事件
*/
private function receiveEvent($object){
$content = "";
switch ($object->Event){
case "subscribe"://关注事件
$content = "欢迎关注(⊙o⊙)哦";
break;
case "unsubscribe"://取消关注
$content = "";
break;
}
$result = $this->transmitText($object, $content);
return $result;
}
/**
* 回复文本消息
*/
private function transmitText($object,$content){
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($textTpl,$object->FromUserName,$object->ToUserName,time(),$content);
return $result;
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}