要崩溃了,折腾了一天,还是不能关注回复成功,但是验证是成功的。xml 模板中也将所有的空格删除了!以下是完整代码,哪位大神看一下哪里出问题了,谢谢!
public function api()
{
// 获得验证参数
$nonce = $_GET[ 'nonce' ];
$timestamp = $_GET[ 'timestamp' ];
$token = 'wechat';
$echostr = $_GET[ 'echostr' ];
$signature = $_GET[ 'signature' ];
// 形成数组并按字典排序
$array = array();
$array = array( $nonce, $timestamp, $token );
sort( $array );
// 拼接字符串并 sha1 加密,然后校验
$str = sha1( implode( $array ) );
if ( $str == $signature && $echostr ) {
echo $echostr;
exit;
} else {
$this->responseMsg();
}
}
// 接受事件推送并回复
public function responseMsg()
{
// 获取微信推送 post 数据(xml 格式)
$postArr = $GLOBALS["HTTP_RAW_POST_DATA"];
libxml_disable_entity_loader(true);
// 处理消息,并设置回复类型及内容
$postObj = simplexml_load_string($postArr, 'SimpleXMLElement', LIBXML_NOCDATA);
// $postObj->ToUserName = '';
// $postObj->FromUserName = '';
// $postObj->CreateTime = '';
// $postObj->MsgType = '';
// $postObj->Event = '';
// 判断事件推送:订阅
if ( strtolower( $postObj->MsgType == 'event' ) ) {
if ( strtolower ( $postObj->Event == 'subscribe' ) ) {
// 设置回复消息
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$sendTime = time();
$msgType = 'text';
$content = 'hahahahahahah';
$template = '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>';
$msg = sprintf( $template, $toUser, $fromUser, $sendTime, $msgType, $content );
echo $msg;
}
}
}另外,我用的 Laravel 框架!
解决了,找到原因了,只做一次验证就行,没必要做两次验证!
$postArr = $GLOBALS["HTTP_RAW_POST_DATA"];
改为:
$postArr = file_get_contents('php://input');也没回复!