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 ...
随机推荐
- 计算机电子书 2020 CDNDrive 备份(预览版)
下载方式 pip install CDNDrive # 或 # pip install git+https://github.com/apachecn/CDNDrive cdrive download ...
- chromium .cipd_client 失败的解决办法
gclient config https://chromium.googlesource.com/v8/v8 chromium 代理完美解决办法 #git的代理设置 git config --glob ...
- 使用Maven导入MySQL驱动包遇到的问题
问题描述 今天在使用Maven导入MySQL数据库驱动包依赖后,直接运行项目,出现错误. java.sql.SQLException: No suitable driver found for jdb ...
- @property增强
1.@property增强 自从Xcode 4.x后,@property可以同时生成setter和getter的声明和实现 @interface Person : NSObject { int _ag ...
- push自定义动画
// // ViewController.m // ViewControllerAnimation // // Created by mac on 15/5/26. // Copyright ...
- Git忽略文件.gitignore的使用
本博客旨在自我学习使用,如有任何疑问请及时联系博主 1.WHY? 当你使用git add .的时候有没有遇到把你不想提交的文件也添加到了缓存中去?比如项目的本地配置信息,如果你上传到Git中去其他人p ...
- 32、python并发编程之背景知识
目录: 一 引子 二 为什么要有操作系统 三 什么是操作系统 四 操作系统与普通软件的区别 五 操作系统发展史 六 总结视频链接: 一 引子 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的 ...
- Solution -「Code+#2」「洛谷 P4033」白金元首与独舞
\(\mathcal{Description}\) link. 给定一个 \(n\times m\) 的网格图,一些格子指定了走出该格的方向(上下左右),而有 \(k\) 格可以任意指定走出方 ...
- Solution -「HDU 1788」CRT again
\(\mathcal{Description}\) Link. 解同余方程组: \[x\equiv m_i-a\pmod{m_i} \] 其中 \(i=1,2,\dots,n\). \ ...
- 使用docker部署awx-1.7.1.0(ansible图形化界面)
文章目录 关于环境 下载awx 下载安装所需依赖 安装docker-compose 配置inventory文件 出现的报错 TASK [local_docker : Run migrations in ...