微信公众号普通消息以及事件消息的接收和反馈

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;
	}

}

这样就可以随意改造我们的返回消息了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smile_qcr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值