PHP 操控微信公众号
<?php
class AutoAction extends CommonAction
{
public function index()
{
$timestamp = $_GET['timestamp'];//timestamp其实就是一个时间戳
$nonce = $_GET['nonce'];//nonce是一个随机参数
$token = "ATA2zJ3969DD99SlJKYJhy22j96GKKlB";//这个token填写你在微信公众平台上写的那个值
$signature = $_GET['signature'];//这个signature其实就是在微信公众平台已经加密好的字符串
$echostr = $_GET['echostr'];
$array = array($timestamp, $nonce, $token);
sort($array);
$tmpstr = implode('', $array);
$tmpstr = sha1($tmpstr);
if ($tmpstr == $signature && $echostr) {
echo $echostr;
exit;
} else {
$this->response_msg();
}
}
private function response_msg()
{
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
$postObj = simplexml_load_string($postArr);
if (strtolower($postObj->MsgType) == 'event') {
//回复用户消息
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
//如果是关注事件(subscribe)
if (strtolower($postObj->Event == 'subscribe')) {
// 是否有推荐人
$referrer = $postObj->EventKey;
// 关注人openid
$openid = $toUser->__toString();
$referrer_str = $referrer->__toString();
if ($referrer_str) {
$referrer_openid = explode('_',$referrer_str)[1];
// 判断关注人是否已关注别人
$wx_recommend = M('wx_recommend');
$exist = $wx_recommend->where(['new_openid'=>$openid])->find();
if (!$exist) { // 有效的用户
// 添加记录
$data = [
'openid' => $referrer_openid,
'new_openid' => $openid,
'add_time'=> time(),
];
$wx_recommend->add($data);
}
}
$arr = array(
array(
'title' => '标题',
'description' => "描述",
'picUrl' => 'xxx.jpg',
'url' => 'xxx.html',
),
);
$this->_send_news($arr,$toUser,$fromUser);
} elseif ($postObj->Event == 'CLICK') {
//------------------- 点击事件 start ------------------------
$event_key = $postObj->EventKey; // 获取key
if($event_key=='V1001_PRESENT'){
$arr = array(
array(
'title' => '标题',
'description' => "描述",
'picUrl' => 'xxx.jpg',
'url' => 'xxx.html',
),
);
$this->_send_news($arr,$toUser,$fromUser);
}
//------------------- 点击事件 end ------------------------
}
}
//回复纯文本或单图文消息
if (($postObj->MsgType) == 'text' && (trim($postObj->Content) == '我要帽子' || trim($postObj->Content) == '帽子')) {
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$arr = array(
array(
'title' => '标题',
'description' => "描述",
'picUrl' => 'xxx.jpg',
'url' => 'xxx.html',
),
);
$this->_send_news($arr,$toUser,$fromUser);
} else if(($postObj->MsgType) == 'text' && (trim($postObj->Content) == '数量' || trim($postObj->Content) == '6')) {
$fromUser = $postObj->ToUserName;//消息从哪里来
$toUser = $postObj->FromUserName;//发送给谁
// 用户openid
$openid = $toUser->__toString();
// 获取推荐数量
$wx_recommend = M('wx_recommend');
$count = $wx_recommend->where(['openid'=>$openid])->count();
$content = "您当前已推荐关注人数为:".$count;
$this->_send_text($content,$toUser,$fromUser);
} else {
$fromUser = $postObj->ToUserName;//消息从哪里来
$toUser = $postObj->FromUserName;//发送给谁
$content = "内容";
$this->_send_text($content,$toUser,$fromUser);
}
}
private function _send_text($content,$toUser,$fromUser) {
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$time = time();
$msgType = 'text';
echo sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
}
private function _send_news($arr,$toUser,$fromUser) {
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>" . count($arr) . "</ArticleCount>
<Articles>";
foreach ($arr as $k => $v) {
$template .= "<item>
<Title><![CDATA[" . $v['title'] . "]]></Title>
<Description><![CDATA[" . $v['description'] . "]]></Description>
<PicUrl><![CDATA[" . $v['picUrl'] . "]]></PicUrl>
<Url><![CDATA[" . $v['url'] . "]]></Url>
</item>";
}
$template .= "</Articles>
</xml> ";
$time = time();
$msgType = "news";
echo sprintf($template, $toUser, $fromUser, $time, $msgType);
}
}
PHP 操控微信公众号的更多相关文章
- 使用flask搭建微信公众号:实现签到功能
终于到了实战阶段.用微信公众号实现一个简单的签到功能. 前情提要: 微信公众号token验证失败 使用flask搭建微信公众号:完成token的验证 使用flask搭建微信公众号:接收与回复消息 程序 ...
- Reinforcement Learning,微信公众号:DRL学习
欢迎大家关注微信公众号:DRL学习,我们一起来学习强化学习和深度强化学习的算法及现状应用问题. 强化学习简单说就是学习如何最大化未来奖励的预期总和,以及agent学会在环境中做出的行动序列,其中随机状 ...
- 微信公众号开发之VS远程调试
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...
- 快递Api接口 & 微信公众号开发流程
之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...
- 微信公众号开发(一)--验证服务器地址的Java实现
现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...
- NodeJs 开发微信公众号(五)真实环境部署
在测试环境下开发完成代表着你离正式上线的目标不远了.接下来本章就主要谈一谈把测试环境的公众号升级为正式的公众号. 服务器和域名 目前为止我们只是在自己的电脑上完成了测试环境.真实的线上环境当然需要自己 ...
- NodeJs 开发微信公众号(四)微信网页授权
微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...
- NodeJs 开发微信公众号(三)微信事件交互
微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...
- 用java开发微信公众号:接收和被动回复普通消息(三)
上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本 ...
随机推荐
- mysql 约束条件 auto_increment 自动增长 创建表时设置自增字段
auto_increment mysql) )auto_increment; Query OK, rows affected (0.01 sec) mysql> show create tabl ...
- django 模板语言之 filter 自定义模板
可以自己写python函数放在模板语言里用 这种方法是django里面的 filter {{ item.event_start|date:"Y-m-d H:i:s"}} {{ bi ...
- 17.出现fatal signal(SIGSEGV),code 1,fault addr 0x0 in tid 29931的问题
原因是: 在onCreate方法里面调一些东西的时候,有时候系统相关的东西还没有初始化完,你的代码就已经执行了,会出现一些问题 解决方法: 增加延时1s /一.第一步初始化,此处用的是demo的ap ...
- Linux使用scp命令实现文件的上传和下载
上传本地/data/project/test.zip 文件至远程服务器192.168.1.2的 /root 目录下,代码如下: scp /home/project/test.zip root@192 ...
- phpcms 添加稿件到栏目 add_content
private $db; private $content_model; public function __construct() { parent::__construct (); $this-& ...
- 机器学习第2周---炼数成金-----线性回归与Logistic
重点归纳 回归分析就是利用样本(已知数据),产生拟合方程,从而(对未知数据)迚行预测用途:预测,判别合理性例子:利用身高预测体重:利用广告费用预测商品销售额:等等.线性回归分析:一元线性:多元线性:广 ...
- Selenium-Grid2 配置RemoteWebDriver
为什么要使用Selenium Grid ? 分布式运行大规模的Test 能够通过一个中央点,很容易的运行不同OS上的不同browser 最小化对Grid的维护时间,并能充分利用虚拟设备 Seleniu ...
- windows安装redis, php5.5
全套安装包地址 http://download.csdn.net/detail/whellote/9572797 解压 redis-2.2.5-win32-win64, 将里面的内容拷贝到j:/r ...
- windows 下安装 rabbitmq报init terminating in do_boot错误
好长时间没有写东西了,记一个安装笔记吧. 目前市面上比较常用的几个消息中间件,rabbitmq算是风评比较好的,所以就拿来安装一下玩玩喽(很有可能也仅限于是安装一下....)安装过程不表,无非是下载E ...
- 深拷贝与浅拷贝js,方法
在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生. 参考 ...