微信公众号开发之文本消息自动回复,以及系统关注自动回复,php代码

以tshop为例

直接上代码:

企业 cc_wx_sys表为自建,存储系统消息的配置的 

字段: id type key status

<?php
/*** tpshop* ============================================================================* * 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。* 网站地址: http://www.tp-shop.cn* ----------------------------------------------------------------------------* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .* 不允许对程序代码以任何形式任何目的的再发布。* ============================================================================* 微信交互类*/ 
namespace Home\Controller;
use Think\Controller;
class WeixinController extends BaseController {public $client;public $wechat_config;public function _initialize(){parent::_initialize();//获取微信配置信息$this->wechat_config = M('wx_user')->find();        $options = array('token'=>$this->wechat_config['w_token'], //填写你设定的key'encodingaeskey'=>$this->wechat_config['aeskey'], //填写加密用的EncodingAESKey'appid'=>$this->wechat_config['appid'], //填写高级调用功能的app id'appsecret'=>$this->wechat_config['appsecret'], //填写高级调用功能的密钥
                );}public function oauth(){}public function index(){if($this->wechat_config['wait_access'] == 0)        exit($_GET["echostr"]);else        $this->responseMsg();}    public function responseMsg(){//get post data, May be due to the different environments$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//extract post dataif (empty($postStr))                     exit("");/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,the best way is to check the validity of xml by yourself */libxml_disable_entity_loader(true);$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;$time = time();$keyword = trim($postObj->Content);$msgtype = 'text'; //消息类型:文本$textTp1sys = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";$textTpl2sys = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><ArticleCount><![CDATA[%s]]></ArticleCount><Articles><item><Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item>                               </Articles></xml>";//点击菜单拉取消息时的事件推送/** 1、click:点击推事件* 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南)* 并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;*/if($postObj->MsgType == 'event' && $postObj->Event == 'CLICK'){$keyword = trim($postObj->EventKey);}/*系统关注,回复*/if($postObj->MsgType == 'event') {if ($postObj->Event == 'subscribe') { //如果是订阅事件$sys = M('wx_sys')->where("status=1")->find();if($sys) {$keyw=$sys['key'];if($sys['type']==1){$wx_text = M('wx_text')->where("keyword like '%$keyw%'")->find();if ($wx_text) {$contentStr = $wx_text['text'];$resultStr = sprintf($textTp1sys, $fromUsername, $toUsername, $time, $msgtype, $contentStr);echo $resultStr;exit();}}else{$wx_img = M('wx_img')->where("keyword like '%$keyword%'")->find();if($wx_img) {$resultStr = sprintf($textTpl2sys, $fromUsername, $toUsername, $time, 'news', '1', $wx_img['title'], $wx_img['desc'], $wx_img['pic'], $wx_img['url']);exit($resultStr);}}}}}if(empty($keyword))exit("Input something...");// 图文回复$wx_img = M('wx_img')->where("keyword like '%$keyword%'")->find();if($wx_img){$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><ArticleCount><![CDATA[%s]]></ArticleCount><Articles><item><Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item>                               </Articles></xml>";                                        $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,'news','1',$wx_img['title'],$wx_img['desc'], $wx_img['pic'], $wx_img['url']);exit($resultStr);                   }// 文本回复$wx_text = M('wx_text')->where("keyword like '%$keyword%'")->find();if($wx_text){$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";$contentStr = $wx_text['text'];$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);exit($resultStr);}// 其他文本回复                $textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";                    $contentStr = '欢迎来到TPshop商城!';$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);exit($resultStr);                   }    
}

参考:

http://www.jb51.net/article/90019.htm

http://www.tuicool.com/articles/QF3Qjm

 

转载于:https://www.cnblogs.com/xqschool/p/6745113.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java之ThreadLocal简单使用总结

1、介绍ThreadLocal 看安卓源码的时候&#xff0c;在这个类Looper.java &#xff0c;会有这个一句函数 static final ThreadLocal<Looper> sThreadLocal new ThreadLocal<Looper>(); 一开始我不是很懂ThreadLocal.java这个类&#xff0c;简单理解 ThreadLocal 就…

老师计算机传帮带工作总结,传帮带工作总结范文

传帮带工作总结范文一段时间的工作在不知不觉间已经告一段落了&#xff0c;回首这段不平凡的时间&#xff0c;有欢笑&#xff0c;有泪水&#xff0c;有成长&#xff0c;有不足&#xff0c;让我们好好总结下&#xff0c;并记录在工作总结里。那么如何把工作总结写出新花样呢&…

[Usaco2007 Demo][BZOJ1628] City skyline

1628: [Usaco2007 Demo]City skyline Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 320 Solved: 260[Submit][Status][Discuss]Description Input 第一行给出N&#xff0c;W第二行到第N1行:每行给出二个整数x,y&#xff0c;输入的x严格递增&#xff0c;并且第一个x总是1Out…

负载均衡(LB)集群 dr

LB、LVS介绍LB集群是load balance 集群的简写&#xff0c;翻译成中文就是负载均衡集群 LVS是一个实现负载均衡集群的开源软件项目 LVS架构从逻辑上可分为调度层(Director)、server集群层(Real server)和共享存储层LVS可分为三种工作模式: NAT(调度器将请求的目标ip即vip地址改为…

ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本

前言上次&#xff0c;我们讨论了如何通过配置或代码方式修改启动地址&#xff1a;《ASP.NET Core启动地址配置方法及优先级顺序》。不过是基于 .NET 5 版本的。由于 .NET 6 使用了最小 WEB API, 配置方式已经部分发生了变化。设置方法1. applicationUrl 属性launchSettings.jso…

php保存附件到指定服务器,如何在PHP中将电子邮件附件保存到服务器?

两天的大部分时间里,我一直在与PHP的电子邮件阅读功能作斗争.我正在编写一个脚本来读取邮箱中的电子邮件并将所有附件保存到服务器上.如果你曾经做过类似的事情,你可能会理解我的痛苦:PHP在电子邮件方面表现不佳!我已连接到POP3服务器,我可以迭代文件.这是代码的大致轮廓:if (!…

Java基础- super 和 this 解析

1. superkeyword表示超&#xff08;父&#xff09;类的意思。this变量代表对象本身。 2. super訪问父类被子类隐藏的变量或覆盖的方法。当前类假设是从超类继承而来的&#xff0c;当调用super.XX()就是调用基类版本号的XX&#xff08;&#xff09;方法。当中超类是近期的父类。…

Android之Handler和Loooper源码分析

1、handler在主线程和子线程互相通信&#xff08;子线程和子线程的通信&#xff09;简单使用 我们使用handler&#xff0c;可以实现主线程和子线程之间的相互通信&#xff0c;然后子线程和子线程之间的通信&#xff0c;如果不清楚&#xff0c;基本用法请先参考我的这篇博客 An…

VS2010 安装问题积累

vs2010 SP1安装不成功 日志文件里显示&#xff1a;error 1719 windows installer service could not be accessed 解决方法&#xff1a;Start, then Run, then type regedit Go to HKEY_LOCAL_MACHINE\SYSTEM\CURRENT CONTROL SET\SERVICES\MSIserver\WOW64 …

unix环境高级编程基础知识之第二篇(3)

看了unix环境高级编程第三章&#xff0c;把代码也都自己敲了一遍&#xff0c;另主要讲解了一些IO函数&#xff0c;read/write/fseek/fcntl&#xff1b;这里主要是c函数&#xff0c;比较容易&#xff0c;看多了就熟悉了。对fcntl函数讲解比较到位&#xff0c;它可以得到和改变打…

Avalonia跨平台入门第七篇之RadioButton的模板

前面其实已经玩耍过单选按钮,只不过一直好意思分享出来;今天终于可以正大光明的分享出来了,直接看效果吧:第一次使用然后的傻傻的版本(根据单选按钮的选中状态来切换二个图片);真的好Low:样式写法和WPF没太大区别:类似WPF中的触发器,使用了附加属性:前台具体使用方式:最终简单的…

svn之bash: syntax error near unexpected token `(‘ 解决办法

1、问题 svn update *****/网易(杭州)网络有限公司SSL-20170623001 出现这个错误 bash: syntax error near unexpected token ( 2、解决办法 改成下面的就行 把svn update *****/网易’(‘杭州’)‘网络有限公司SSL-20170623001

Angular 4.x 事件管理器及自定义EventManagerPlugin

在 Angular 中如何为同一个表达式绑定多个事件呢&#xff1f;如果我们这样做可能会是这样的&#xff1a; <div><button (click, mouseover)"onClick()">Click me</button> </div>复制代码在继续分析绑定多个事件之前&#xff0c;我们先来分析…

dell服务器报内存配置不正确,DELL 服务器系统提示错误解决的若干办法

《DELL 服务器系统提示错误解决的若干办法》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《DELL 服务器系统提示错误解决的若干办法(9页珍藏版)》请在人人文库网上搜索。1、DELL 服务器有时会若硬件的改动&#xff0c;在开机以后会提示错误信息。信息一般会提示在显示…

JSP PO VO BO DTO POJO DAO解释

PO &#xff1a;persistent object持久对象 1 &#xff0e;有时也被称为Data对象&#xff0c;对应数据库中的entity&#xff0c;可以简单认为一个PO对应数据库中的一条记录。2 &#xff0e;在hibernate持久化框架中与insert/delet操作密切相关。 3 &#xff0e;PO中不应该包含任…

java之RSA和Base64加密帮助类

1、RSAUtils.java类 package com.sangfor.vpn.client.service.utils; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigIn…

更强的压缩比!PostgreSQL开始支持Zstd

文 | 局长出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;PostgreSQL 现已通过其 TOAST 存储技术提供压缩支持&#xff0c;并且在过去的一年里构建了 LZ4 压缩支持——用于压缩 WAL、备份压缩以及其他用途&#xff0c;现在 PostgreSQL 开发者正准备通过 …

最近面试遇到的技术问题

京东性能组 1. oracle awr2. mysql 慢查询3. redis详细架构、如何插入数据4. jmeter使用及集群搭建5. nginx使用及tomcat集成 6. 数据库及sql优化的方案 7. 写存储过程 8. linux使用9. shell10. java e代驾 1. 接口测试方法2. sockets连接建立方法3. http三次握手过程 京东金融…

小程序和app用什么样的服务器,小程序和APP的本质区别是什么?哪个更值得开发?...

从微信小程序和用户见面到现在&#xff0c;这个功能已经越来越完善了&#xff0c;经过更彻底的挖掘&#xff0c;商业价值被挖掘出来了&#xff01;小程序和app有什么区别呢&#xff1f;为什么广州会更受欢迎呢&#xff1f;两者的区别首先&#xff0c;两者的区别在于&#xff0c…

jbpm6.5 环境搭建(三) 数据库 切换

2019独角兽企业重金招聘Python工程师标准>>> 经过一晚上的折腾&#xff0c;终于搞定&#xff0c;成功切换Mysql 步骤一&#xff1a; 安装mysql 数据库 创建数据库 名字为jbpm 设置用户名密码 我本地默认使用 root 步骤二&#xff1a; ** 修改配置文件 ** F:\jb…