tp6微信公众号开发者模式基础消息
官方文档
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html
1:结合上篇继续再services目录下的WechatService.php继续封装
https://www.cnblogs.com/xiaoyantongxue/p/15803334.html
<?php namespace app\services; use think\Log; class WechatService
{ protected static $_token_key = 'wxdev:wechat:token'; /*
* 微信公众号获取access_token
* */
public static function getToken()
{
$accessToken = cache(self::$_token_key);
if (!$accessToken) {
$accessTokenUrl = sprintf(config('wechat.access_token_url'), config('wechat.appid'), config('wechat.appsecret'));
$accessTokenArr = json_decode(file_get_contents($accessTokenUrl), true);
if (isset($accessTokenArr['errcode'])) {
// 记录日记
Log::info($accessTokenArr['errmsg']);
return false;
} else {
$accessToken = $accessTokenArr['access_token'];
cache(self::$_token_key, $accessToken, $accessTokenArr['expires_in'] - 200);
}
}
return $accessToken;
} /*
* 基础消息能力-文本消息
* */
public static function testReplay($postObj)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$msgType = $postObj->MsgType;
$keyword = trim((string)$postObj->Content);
$time = time();
if ($keyword == '你好') {
$replyContent = "欢迎来到我的公众号!";
} else {
$replyContent = "厉害了,我的哥!!!!!";
}
$sendXml = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
$sendBackXml = sprintf($sendXml, $fromUsername, $toUsername, $time, $msgType, $replyContent);
return $sendBackXml;
} /*
* 基础消息能力-图片消息
* */
public static function imageReplay($postObj)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time = time();
$replyContent = "图片picUrl:{$postObj->PicUrl},图片的MediaId:{$postObj->MediaId}";
$sendXml = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$sendBackXml = sprintf($sendXml, $fromUsername, $toUsername, $time, 'text', $replyContent);
return $sendBackXml;
} /*
* 掌握基础消息能力-语音消息
* */
public static function voiceReplay($postObj)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time = time();
$replyContent = "语音消息MediaId为:{$postObj->MediaId}'具体内容为:{$postObj->Recognition}";
$sendXml = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$sendBackXml = sprintf($sendXml, $fromUsername, $toUsername, $time, 'text', $replyContent);
return $sendBackXml;
} /*
* 基础消息能力-视频消息
* */
public static function videoReplay($postObj)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time = time();
$replyContent = "视频消息MediaId为:{$postObj->MediaId}'体文件下载接口拉取数据:{$postObj->ThumbMediaId}";
$sendXml = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$sendBackXml = sprintf($sendXml, $fromUsername, $toUsername, $time, 'text', $replyContent);
return $sendBackXml;
} /*
* -地理位置消息
* */
public static function locationReplay($postObj)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time = time();
$replyContent = "经度为:{$postObj->Location_Y}'维度:{$postObj->Location_X},具体地址:{$postObj->Label}";
$sendXml = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$sendBackXml = sprintf($sendXml, $fromUsername, $toUsername, $time, 'text', $replyContent);
return $sendBackXml;
} /*
* -基础消息能力-链接消息
* */
public static function linkReplay($postObj)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time = time();
$replyContent = "消息的标题为:{$postObj->Title},描述:{$postObj->Description}";
$sendXml = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$sendBackXml = sprintf($sendXml, $fromUsername, $toUsername, $time, 'text', $replyContent);
return $sendBackXml;
} }
2:控制器进行调用:

<?php
declare (strict_types=1); namespace app\controller; use app\BaseController;
use app\services\WechatService;
use think\Request; class Wechat extends BaseController
{
/*
* 域名解析首方法
* */
public function valid()
{
//获取随机字符串
$echoStr = input("echostr");
if ($echoStr) {
// 验证接口的有效性,由于接口有效性的验证必定会传递echostr 参数
if ($this->checkSignature()) {
echo $echoStr;
exit;
}
} else {
return $this->responseMsg();
}
} /*
* 解析文本、图片、语音.视频、地理、链接
* */
private function responseMsg()
{
$postStr = file_get_contents('php://input');
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); switch ($postObj->MsgType) {
// 如果发过来的信息是文本,调用WechatService的testReplay方法
case 'text':
$sendBackXml = WechatService::testReplay($postObj); return $sendBackXml; break;
// 如果发过来的信息是图片,调用WechatService的imgReplay方法
case 'image':
$sendBackXml = WechatService::imageReplay($postObj); return $sendBackXml; break;
// 如果发过来的信息是语音,调用WechatService的voiceReplay方法
case 'voice':
$sendBackXml = WechatService::voiceReplay($postObj); return $sendBackXml; break; // 如果发过来的信息是视屏,调用WechatService的videoReplay方法
case 'video':
$sendBackXml = WechatService::videoReplay($postObj); return $sendBackXml; break; // 如果发过来的信息是地理位置消息,调用WechatService的videoReplay方法
case 'location':
$sendBackXml = WechatService::locationReplay($postObj); return $sendBackXml; break;
// 如果发过来的信息是地理位置消息,调用WechatService的videoReplay方法
case 'link':
$sendBackXml = WechatService::linkReplay($postObj); return $sendBackXml; break; } } /*
* 获取token
* */
protected function checkSignature()
{
// 微信加密签名
$signature = input("signature");
$timestamp = input("timestamp");//时间戳
$nonce = input("nonce");//随机数
$token = "yanbing"; //token值,必须和你设置的一样
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
return true;
} else {
return false;
}
} /*
* 获取access_token
* */
public function getToken()
{
$accessToken = WechatService::getToken();
echo $accessToken;
}
}
3:效果图:

tp6微信公众号开发者模式基础消息的更多相关文章
- tp6微信公众号开发者模式token认证
微信公众号开发完整教程(一) PHP7.0版本,TP5.0框架 技术标签: 微信公众号开发 因为工作的需要,这一两年对微信公众号和小程序,项目制作的比较多.所以我才打算写一篇全面的 ...
- tp6微信公众号开发者模式自定义菜单
1,参考上篇博客,获取access_token https://www.cnblogs.com/xiaoyantongxue/p/15803334.html 2:控制器写以下代码 /* * 获取普通a ...
- tp6微信公众号开发者模式获取access_token
1:config 文件下新建一个文件wechat.php,将个人id和秘钥写入配置文件 网址: https://developers.weixin.qq.com/doc/offiaccount/Bas ...
- php 开启微信公众号开发者模式
php 开启微信公众号开发者模式<pre><?php/** * wechat php test */header('Content-type:text');//define your ...
- 微信公众号开发者模式自定义菜单 node
纯属分享 var config = require('./admin/wx/config/config'); var API = require('wechat-api'); var api = ne ...
- 微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription is canceled hint:解决办法【已解决】
微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription ...
- PHP开发微信公众号(二)消息接受与推送
上一篇文章我们知道怎么获取二维码,这样别人就可以扫描二维码来关注我们,但是别人关注后,发送消息,我们怎么进行相关处理? 这里我们就来学习下怎么处理处理这些消息,以及推送消息. 学习之前首先你需要有一个 ...
- Java微信公众号开发----关键字自动回复消息
在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点: 1. url 仍然不变,还是开发配置里的url 2. 微信采用 xml 格式传输数据 3.微信服务器传给我们的参数主要有 ...
- 解决升级PHP7后 微信公众号收不到消息
服务器配置Linux+Nginx+PHP5.5+mysql index方法配置微信的关注回复.菜单事件.多客服.自动回复等 public function actionIndex() { if (is ...
随机推荐
- js判断变量是否为空字符串、null、undefined
let _isEmpty = (input) => { return input + '' === 'null' || input + '' === 'undefined' || input.t ...
- Java线程--CompletionService使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871911.html Java线程--CompletionService使用 public ...
- 用python的turtle作图(一)静态图
最近,花了点时间,用python画图. 主要包括三部分,简单的静态图形,复杂的组合图形,图形动画. (一)画静态图形 长方形, 圆, 三角形, 平行四边形, 五角星 (二)图形的组合 笑脸, 国旗, ...
- Mybatis结果映射器resultMap的基本用法
<mapper namespace="全局唯一的名称空间"> <resultMap id="本namespace下唯一" type=" ...
- InfluxDB 2.x Open Source Time Series Database
1. 说明 目前,大家普遍还在采用 InfluxDB 1.x 的版本,官方2.x的版本已经发布一段时间了, 其主推flux语言且自带前端炫酷图表. 2. 官方网站 https://www.influx ...
- Redis学习详解(一):Redis持久化机制之RDB
Redis的持久化机制有两种:RDB持久化和AOF持久化.因为Redis是一个内存数据库,如果没有合适的持久化机制,那么一旦服务器进程退出,服务器中的数据库状态也会消失.本章介绍RDB持久化机制. R ...
- netty系列之:Bootstrap,ServerBootstrap和netty中的实现
目录 简介 Bootstrap和ServerBootstrap的联系 AbstractBootstrap Bootstrap和ServerBootstrap 总结 简介 虽然netty很强大,但是使用 ...
- 天啦,从Mongo到ClickHouse我到底经历了什么?
前言: 在实现前端监控系统的最初,使用了 Mongo 作为日志数据存储库.文档型存储,在日志字段扩展和收缩上都能非常方便.天生的 JSON 格式和 NodeJs 配合也非常贴合.就这样度过了几个月的蜜 ...
- Spring MVC 是什么? 核心总结
SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰 ...
- java实现 TCP通信
//服务端import com.hl.bluetooth.util.CRC16; import com.hl.bluetooth.util.FrameCheckFailedException; imp ...