1:我们看微信公众号开发文档上
上面说微信服务器会发消息发送到我们的服务器上面去,所以我们需要改造一下我们方法
<?php
namespace app\wxauth\controller;
use think\Controller;
use think\Request;
class WxauthController extends Controller {
// 外部接口, 测试
public function wxauth(Request $request) {
if ($request->isPost()) {
//因为很多都设置了register_globals禁止,不能用$GLOBALS["HTTP_RAW_POST_DATA"] 改用file_get_contents("php://input")即可
$postStr = file_get_contents("php://input");
if (!empty($postStr)) {
//用SimpleXML解析POST过来的XML数据
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
// $fromUsername = $postObj->FromUserName; //获取发送方帐号(OpenID)
// $toUsername = $postObj->ToUserName; //获取接收方账号
// $keyword = trim($postObj->Content); //获取消息内容
// $masType = $postObj->MsgType; //获取消息类型,可以作分类判断
// $time = time(); //获取当前时间戳
$resultStr = $this->handleEvent($postObj);
echo $resultStr;
} else {
echo "";
exit;
}
} else {
function checkSignature() {
$token = 'qcr';
//先获取到这三个参数
$signature = input('signature');
$nonce = input('nonce');
$timestamp = input('timestamp');
// 把这三个参数存到一个数组里面
$tmpArr = array($timestamp, $nonce, $token);
// 进行字典排序
sort($tmpArr);
// 把数组中的元素合并成字符串,impode()函数是用来将一个数组合并成字符串的
$tmpStr = implode($tmpArr);
// sha1加密,调用sha1函数
$tmpStr = sha1($tmpStr);
// 判断加密后的字符串是否和signature相等
if ($tmpStr == $signature) {
return true;
}
return false;
}
// 如果相等,验证成功就返回echostr
if (checkSignature()) {
// 返回echostr
$echostr = input('echostr');
if ($echostr) {
echo $echostr;
exit;
}
}
}
}
//处理消息
public function handleEvent($object) {
$contentStr = "";
$masType = $object->MsgType;
if ($masType == 'text') {
$contentStr = '您发送的是' . trim($object->Content);
} elseif ($masType == 'image') {
//图片消息
$contentStr = '您发送的是' . trim($object->MediaId);
} elseif ($masType == 'voice') {
//语音消息
} elseif ($masType == 'video') {
//视频消息
} elseif ($masType == 'location') {
//位置消息
} elseif ($masType == 'link') {
//链接消息
} elseif ($masType == 'event') {
if ($object->Event == 'subscribe') {
$contentStr = "感谢您关注【微卖】" . "\n" . "我们为您提供全国各地的生活指南,做最好的外卖微信平台。" . "\n" . "目前平台功能如下:" . "\n" . "【1】 查天气,如输入:本地天气" . "\n" . "【2】 查公交,如输入:本地公交178" . "\n" . "【3】 翻译,如输入:翻译I love you" . "\n" . "【4】 本地信息查询,如输入:" . "\n" . "更多内容,敬请期待...";
} elseif ($object->Event == 'CLICK') {
$EventKey = $object->EventKey; //菜单的自定义的key值,可以根据此值判断用户点击了什么内容,从而推送不同信息
if ($EventKey == 'V1001_GOOD1') {
$contentStr = '你点击了';
} else {
$contentStr = '未知点击事件' . $EventKey;
}
} else {
$contentStr = "未知事件" . $object->Event;
}
}
$resultStr = $this->responseText($object, $contentStr);
return $resultStr;
}
//返回消息
public function responseText($object, $content, $flag = 0) {
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>%d</FuncFlag>
</xml>";
$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
return $resultStr;
}
}
这样就可以随意改造我们的返回消息了