要崩溃了,折腾了一天,还是不能关注回复成功,但是验证是成功的。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');
也没回复!