楼主是根据慕课网视频学习由于框架及PHP版本不一样造成的问题~!
1. $GLOBALS['HTTP_RAW_POST_DATA’]
如果你的PHP版本是7及以上获取xml数据包;则使用file_get_contens("php://input");
2. 如果使用Tp5及以上版本的框架
验证token的时候;$echostr如果不存在会自动报错,不往后继续执行代码;
解决: $echostr = isset($_GET['echostr']) ? $_GET['echostr'] : '';
如果存在使用,否则给个空的字符串保证后续代码继续执行;
下面是我的代码,使用TP5,PHP版本7.1,如果需要赋值代码请注意以下几点:
1. 第二行namespace的路径; 2. class类名需注意是否一样; 3. appid和密码需更改为你自己的;
<?php
namespace app\wechat\controller;
use think\Controller;
use Util\data\Sysdb;
class Index extends Controller
{
// 验证token
public function index(){
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$echostr = isset($_GET['echostr']) ? $_GET['echostr'] : '';
$nonce = $_GET["nonce"];
$token = "xiaocong";
// 形成数组按字典排序
// $array = array();
$array = array($nonce, $timestamp, $token);
sort($array);
// 拼接字符串,进行sha1加密
$str = sha1(implode($array));
if($str == $signature && $echostr){
echo $echostr;
exit;
}else{
$this->reponseMsg();
}
}
// 接收事件推送并回复
public function reponseMsg(){
// 获取到微信推送过来post数据(xml格式)
$postArr = file_get_contents("php://input");
// 处理消息类型,并设置回复类型和内容
$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 = '欢迎关注小葱的微信公众账号';
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
echo $info;
}
}
// 接收文本消息
if(strtolower($postObj->MsgType) == 'text' && trim($postObj->Content) == 'tuwen'){
$arr = array(
array(
'title' => '小猫咪',
'description' => "挺可爱的嘛!",
'PicUrl' => "http://mmbiz.qpic.cn/mmbiz_jpg/YRib4YUtr7kCc25NewwsdlP5nibbmLVicNfdzwrJ6d3T1j8CThykDPE6rvkgO3mWp9DHbZicP4mvQiaeDrq74WG6yRw/0",
'url' => "www.baidu.com"
)
);
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>" . count($arr) . "</ArticleCount>
<Articles>";
foreach($arr as $key => $value){
$template .= "<item>
<Title><![CDATA[".$value['title']."]]></Title>
<Description><![CDATA[".$value['description']."]]></Description>
<PicUrl><![CDATA[".$value['PicUrl']."]]></PicUrl>
<Url><![CDATA[".$value['url']."]]></Url>
</item>";
}
$template .= "</Articles>
</xml>";
$info = sprintf($template, $toUser, $fromUser, $time);
echo $info;
}
}
// 获取access_token
public function getwxaccess_token(){
$appid = "xxxxxxxxxxx";
$secret = "xxxxxxxxxxxx";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
echo $res;
}
}