<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller{
public function __construct(){
}
public function index(){
//1.将timestamp,nonce,token 按字典序排序
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$token = 'weixin';
$signature = $_GET['signature'];
$echostr = $_GET['echostr'];
$array = array( $timestamp,$nonce,$token );
sort( $array );
//2.将排序后的三个参数拼接之后sha1加密
$tmpstr = sha1( implode($array) );
//1.将加密后的字符串与signature对比,判断该请求是否来自微信
if( $tmpstr == $signature && $echostr){
//第一次接入微信API的时候进行验证
echo $echostr;
exit;
}else{
$this->responseMsg();
}
}
//接受事件推送并回复
public function responseMsg(){
//1.获取到微信推送过来的poat数据(xml格式)
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
//2.处理消息类型,并设置回复类型和内容
$postObj = simplexml_load_string($postArr);
//判断推动的数据包是不是订阅事件
if(strtolower($postObj->MsgType) == 'event'){
//如果是关注事件 subscribe 事件
if(strtolower($postObj->Event) == 'subscribe'){
//回复用户消息
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$msgType = 'text';
$content = '欢迎关注我们';
$tamplate = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$info = sprintf($tamplate,$fromUser,$toUser,$time,$msgType,$content);
echo $info;
}
}
if(strtolower($postObj->MsgType) == 'text'){
if($postObj->Content == 'you'){
$tamplate = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$fromUser = $postObj->ToUserName;
$toUser = $postObj->FromUserName;
$time = time();
$content = '这个网站很不错';
$msgType = 'text';
echo sprintf($tamplate,$toUser,$fromUser,$time,$msgType,$content);
}
}
}
}
一样的,代码百分之百没错,但就是不回复
求解,token已经验证成功,关注后还是没有回复成功,代码都确保一致了
//$postArr = $GLOBALS['HTTP_RAW_POST_DATA']; 这个有点问题,获取不到数据 用下面这个吧
$postArr = file_get_contents('php://input');
我用TP5按代码写还是获取不到回复消息
关注之后不回复,可能是你代码中的$info=sprintf()中的参数跟$tamplate中的<xml>中的代码没有对应上,要先写$toUser,再写$fromUser
服务器地址这块要加上,,才能提交成功