公众号配置的URL就是你自己服务器上验证TOKEN的方法的地址
比如我验证TOKEN的方法访问地址是/wx_api.php
那我公众号配置的URL就要填/wx_api.php(配置完之后记得点启用哦)
/**
* wechat php test
*/
header('Content-type:text');
//定义TOKEN 与公众号的配置要相同
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {//验证TOKEN
$wechatObj->valid();
}else{//公众号被动回复
$wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$open_id = $postObj->FromUserName;
var_dump($open_id);
$RX_TYPE = trim($postObj->MsgType);
switch($RX_TYPE)//触发事件类型
{
case "text"://用户发送文本事件
$resultStr = $this->handleText($postObj);
break;
case "event"://用户关注/取关等事件
$resultStr = $this->handleEvent($postObj);
break;
default://其他
$resultStr = "Unknow msg type: ".$RX_TYPE;
break;
}
echo $resultStr;
}else {
echo $postStr;
exit;
}
}
public function handleText($postObj)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "
%s
0
";
if(!empty( $keyword ))
{
$msgType = "text";
if($keyword=="你好"){
$contentStr = "你好呀";
}elseif($keyword=="你是猪"){
$contentStr = "你才是猪";
}else{
$contentStr = "感谢您关注【XXX】";
}
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}
public function handleEvent($object)
{
//$arrObj = self::std_class_object_to_array($object);//将对象转化为数组(可不要,就是方便有数据库操作需要数组的操作)
//var_dump($arrObj);
$contentStr = "";
switch ($object->Event)
{
case "subscribe":
$contentStr = "感谢您关注【XXX】";
break;
default :
$contentStr = "Unknow Event: ".$object->Event;
break;
}
$resultStr = $this->responseText($object, $contentStr);
return $resultStr;
}
public function responseText($object, $content, $flag=0)
{
$textTpl = "
%s
%d
";
$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
return $resultStr;
}
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;
}
}
static function std_class_object_to_array($stdclassobject)
{
$_array = is_object($stdclassobject) ? get_object_vars($stdclassobject) : $stdclassobject;
$array = array();
foreach ($_array as $key => $value) {
$value = (is_array($value) || is_object($value)) ? self::std_class_object_to_array($value) : $value;
$array[$key] = $value;
}
return $array;
}
}
?>
如果你验证token的方法地址和公众号回复的方法地址不一样
公众号配置时URL先填验证token的方法地址,验证成功之后把公众号回复的方法代码写到验证token的方法里去,把原验证token方法的代码注释掉
emmmm....对就这样hi hi
然后推荐一个微信公众号开发的免费在线调试工具:
只需要填URL就好了 Token的话最好填weixin
消息类型就根据自己测试需求选,完了之后点击发送消息/验证token就好了,接收消息栏会返回你调试打印的东西和回复的东西