以tshop为例

直接上代码:

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

字段: id type key status

  1. <?php
  2. /**
  3. * tpshop
  4. * ============================================================================
  5. * * 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
  6. * 网站地址: http://www.tp-shop.cn
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
  9. * 不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * 微信交互类
  12. */
  13. namespace Home\Controller;
  14. use Think\Controller;
  15. class WeixinController extends BaseController {
  16. public $client;
  17. public $wechat_config;
  18. public function _initialize(){
  19. parent::_initialize();
  20. //获取微信配置信息
  21. $this->wechat_config = M('wx_user')->find();
  22. $options = array(
  23. 'token'=>$this->wechat_config['w_token'], //填写你设定的key
  24. 'encodingaeskey'=>$this->wechat_config['aeskey'], //填写加密用的EncodingAESKey
  25. 'appid'=>$this->wechat_config['appid'], //填写高级调用功能的app id
  26. 'appsecret'=>$this->wechat_config['appsecret'], //填写高级调用功能的密钥
  27. );
  28.  
  29. }
  30.  
  31. public function oauth(){
  32.  
  33. }
  34.  
  35. public function index(){
  36. if($this->wechat_config['wait_access'] == 0)
  37. exit($_GET["echostr"]);
  38. else
  39. $this->responseMsg();
  40. }
  41.  
  42. public function responseMsg()
  43. {
  44. //get post data, May be due to the different environments
  45. $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  46. //extract post data
  47. if (empty($postStr))
  48. exit("");
  49.  
  50. /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
  51. the best way is to check the validity of xml by yourself */
  52. libxml_disable_entity_loader(true);
  53. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  54. $fromUsername = $postObj->FromUserName;
  55. $toUsername = $postObj->ToUserName;
  56. $time = time();
  57. $keyword = trim($postObj->Content);
  58. $msgtype = 'text'; //消息类型:文本
  59. $textTp1sys = "<xml>
  60. <ToUserName><![CDATA[%s]]></ToUserName>
  61. <FromUserName><![CDATA[%s]]></FromUserName>
  62. <CreateTime>%s</CreateTime>
  63. <MsgType><![CDATA[%s]]></MsgType>
  64. <Content><![CDATA[%s]]></Content>
  65. </xml>";
  66. $textTpl2sys = "<xml>
  67. <ToUserName><![CDATA[%s]]></ToUserName>
  68. <FromUserName><![CDATA[%s]]></FromUserName>
  69. <CreateTime>%s</CreateTime>
  70. <MsgType><![CDATA[%s]]></MsgType>
  71. <ArticleCount><![CDATA[%s]]></ArticleCount>
  72. <Articles>
  73. <item>
  74. <Title><![CDATA[%s]]></Title>
  75. <Description><![CDATA[%s]]></Description>
  76. <PicUrl><![CDATA[%s]]></PicUrl>
  77. <Url><![CDATA[%s]]></Url>
  78. </item>
  79. </Articles>
  80. </xml>";
  81. //点击菜单拉取消息时的事件推送
  82. /*
  83. * 1、click:点击推事件
  84. * 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南)
  85. * 并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
  86. */
  87. if($postObj->MsgType == 'event' && $postObj->Event == 'CLICK')
  88. {
  89. $keyword = trim($postObj->EventKey);
  90. }
  91.  
  92. /*系统关注,回复*/
  93. if($postObj->MsgType == 'event') {
  94. if ($postObj->Event == 'subscribe') { //如果是订阅事件
  95. $sys = M('wx_sys')->where("status=1")->find();
  96. if($sys) {
  97. $keyw=$sys['key'];
  98. if($sys['type']==1){
  99. $wx_text = M('wx_text')->where("keyword like '%$keyw%'")->find();
  100. if ($wx_text) {
  101. $contentStr = $wx_text['text'];
  102. $resultStr = sprintf($textTp1sys, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
  103. echo $resultStr;
  104. exit();
  105. }
  106. }else{
  107. $wx_img = M('wx_img')->where("keyword like '%$keyword%'")->find();
  108. if($wx_img) {
  109. $resultStr = sprintf($textTpl2sys, $fromUsername, $toUsername, $time, 'news', '1', $wx_img['title'], $wx_img['desc']
  110. , $wx_img['pic'], $wx_img['url']);
  111. exit($resultStr);
  112. }
  113. }
  114. }
  115. }
  116. }
  117. if(empty($keyword))
  118. exit("Input something...");
  119. // 图文回复
  120. $wx_img = M('wx_img')->where("keyword like '%$keyword%'")->find();
  121. if($wx_img)
  122. {
  123. $textTpl = "<xml>
  124. <ToUserName><![CDATA[%s]]></ToUserName>
  125. <FromUserName><![CDATA[%s]]></FromUserName>
  126. <CreateTime>%s</CreateTime>
  127. <MsgType><![CDATA[%s]]></MsgType>
  128. <ArticleCount><![CDATA[%s]]></ArticleCount>
  129. <Articles>
  130. <item>
  131. <Title><![CDATA[%s]]></Title>
  132. <Description><![CDATA[%s]]></Description>
  133. <PicUrl><![CDATA[%s]]></PicUrl>
  134. <Url><![CDATA[%s]]></Url>
  135. </item>
  136. </Articles>
  137. </xml>";
  138. $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,'news','1',$wx_img['title'],$wx_img['desc']
  139. , $wx_img['pic'], $wx_img['url']);
  140. exit($resultStr);
  141. }
  142.  
  143. // 文本回复
  144. $wx_text = M('wx_text')->where("keyword like '%$keyword%'")->find();
  145. if($wx_text)
  146. {
  147. $textTpl = "<xml>
  148. <ToUserName><![CDATA[%s]]></ToUserName>
  149. <FromUserName><![CDATA[%s]]></FromUserName>
  150. <CreateTime>%s</CreateTime>
  151. <MsgType><![CDATA[%s]]></MsgType>
  152. <Content><![CDATA[%s]]></Content>
  153. <FuncFlag>0</FuncFlag>
  154. </xml>";
  155. $contentStr = $wx_text['text'];
  156. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);
  157. exit($resultStr);
  158. }
  159.  
  160. // 其他文本回复
  161. $textTpl = "<xml>
  162. <ToUserName><![CDATA[%s]]></ToUserName>
  163. <FromUserName><![CDATA[%s]]></FromUserName>
  164. <CreateTime>%s</CreateTime>
  165. <MsgType><![CDATA[%s]]></MsgType>
  166. <Content><![CDATA[%s]]></Content>
  167. <FuncFlag>0</FuncFlag>
  168. </xml>";
  169. $contentStr = '欢迎来到TPshop商城!';
  170. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);
  171. exit($resultStr);
  172.  
  173. }
  174. }

参考:

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

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

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

  1. .net微信公众号开发——消息与事件

    作者:王先荣    本文介绍如何处理微信公众号开发中的消息与事件,包括:(1)消息(事件)概况:(2)验证消息的真实性:(3)解析消息:(4)被动回复消息:(5)发送其他消息.    开源项目地址:h ...

  2. 微信公众号开发之网页中及时获取当前用户Openid及注意事项

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...

  3. 微信公众号开发及时获取当前用户Openid及注意事项

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...

  4. 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转

    线程安全使用(四)   这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...

  5. [.NET] 使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复

    使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复 目录 一.前提 二.基本配置信息简析 三.配置服务器地址(URL) 四.请求处理 一.前提 先申请微信公众号的授权,找到或配置 ...

  6. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  7. C#微信公众号开发系列教程四(接收普通消息)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  8. .net微信公众号开发——群发消息

    作者:王先荣    本文将介绍微信公众号开发中用于群发消息的类MassMessage,包括:(1)MassMessage类:(2)群发:(3)删除:(4)预览:(5)查询发送状态:(6)接收推送群发结 ...

  9. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

随机推荐

  1. CAD从二制流数据中加载图形(com接口)

    主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...

  2. odoo 权限杂记

    最近做一个任务督办模块,涉及到一些权限问题,折磨了几天,终于是解决了. 任务表中关联了hr_employee,分别有默认字段创建人,Many2one的发布人.监督人和Many2many类型的主责人,这 ...

  3. 【[Offer收割]编程练习赛12 B】一面砖墙

    [题目链接]:http://hihocoder.com/problemset/problem/1494 [题意] [题解] 显然只要记住每一行的各个砖头的间隔处的坐标有多少个就好了: ->也就对 ...

  4. Codeforces 263C. Appleman and Toastman

    C. Appleman and Toastman time limit per test  2 seconds memory limit per test  256 megabytes input  ...

  5. fzu 2124

    #include<stdio.h> #include<queue> #include<math.h> #include<algorithm> #incl ...

  6. 实现selenium+Chrome爬取时不加载图片——配置

    # -*- coding:utf-8 -*- from selenium import webdriver ''' 设置页面不加载图片,这样可以加快页面的渲染,减少爬虫的等待时间,提升爬取效率 固定配 ...

  7. hdu_1040_As Easy As A+B_201308191751

    As Easy As A+B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  8. SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器

    目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...

  9. 实战体验几种MySQLCluster方案

    来源:keepLearning的专栏      http://www.2cto.com/database/201504/387166.html 1.背景 MySQL的cluster方案有很多官方和第三 ...

  10. CF #330 D2 E

    相当于给你一些点,要你最多删除不超过k,使得能使用一个边长为整数的长方形,与XY轴平行,使长方形的面积最小. 上课时拿笔来画画,然后忽然思路就开了,要是比赛也这样就好了~~先按X,Y分别排序,由于K较 ...