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 ...
随机推荐
- Java--这张线程瓜图保熟,不进来看看?这瓜要是不熟它就Dead掉了
先来看一下线程这张图线程的几种运行状态之间运行流程: 看不懂没关系,慢慢来学习,往下学习来继续了解一下~ 什么是线程? 线程是进程的一部分,是程序执行中的一条执行路线: 进程就是指程序在其自身地址空间 ...
- AQS源码一窥-JUC系列
AQS源码一窥 考虑到AQS的代码量较大,涉及信息量也较多,计划是先使用较常用的ReentrantLock使用代码对AQS源码进行一个分析,一窥内部实现,然后再全面分析完AQS,最后把以它为基础的同步 ...
- ssh中“Host key verification failed.“的解决方案
SSH连接的时候Host key verification failed. ➜ ~ ssh root@192.168.1.88 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- #pragma mark指令
1.#pragma mark指令的使用 功能:简单来说就是对代码的分组,方便代码查找和导航用的 它们告诉Xcode编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开.一些类(尤其是一些控制器 ...
- Python概述 —变量及运算符
Python概述-变量及运算符 1.变量的构成 2.变量的类型 3.内存模型 4.变量命名规则 5. 算数与逻辑运算符 6.位运算符 #变量的构成 变量名:方便查找 变量值:实际要存储的内容 变量类型 ...
- Java中Arrays数组工具类的使用全解
本文几乎涵盖了所有的Arrays工具类(基于Java 11)的方法以及使用用例,一站式带你了解Arrays类的用法,希望对大家有帮助. 码字不易,三连支持一下吧 Arrays数组工具类 方法一览表 快 ...
- 在这个插件帮助下,终于用上免费的Https协议外链的图床了
前天,强哥发了一篇推文,讲述了应该如何免费且快速的生成自己的博客网站: 期间也有提到一点就是我们在写博客的时候,因为使用的是Markdown格式的文件,而如果想要Markdown格式的文件在图片上传 ...
- opencv笔记--meanshift&camshift
meanshift 被应用于 object track 中,其主要思想如下: 如下图所示,对该点集应用 meanshift 算法可以定位到点集最稠密位置,而点集最稠密位置即为我们需要跟踪的物体位置. ...
- Solution -「51nod 1355」斐波那契的最小公倍数
\(\mathcal{Description}\) Link. 令 \(f\) 为 \(\text{Fibonacci}\) 数列,给定 \(\{a_n\}\),求: \[\operatorn ...
- java中abstract关键字(抽象类)
需求 当父类某个方法,需要声明,但是又不确定如何实现时,可以用抽象方法,那么这个类就是抽象类 例如:父类是一个动物类,父类里面有很多方法,其中有一个方法是吃食物,但是不知道吃什么,需要子类继承的时候重 ...