微信公众号接口开发–回复消息

作为一个微信公众号,与用户的交互能力是十分重要的,比如根据用户发送的消息和推送事件被动的回复用户消息(文字,图片,视频,图文等等),现在我就测试了几个接口来实现这些功能:

1. 验证开发者和获取用户消息

<?php
/*** wechat php test*///define your token
define("TOKEN", "wechat");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
$wechatObj->responseMsg();class wechatCallbackapiTest
{public function valid(){$echoStr = $_GET["echostr"];//valid signature , optionif($this->checkSignature()){echo $echoStr;exit;}}public function responseMsg(){//get post data, May be due to the different environments$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//extract post dataif (!empty($postStr)){$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;$keyword = trim($postObj->Content);$time = time();$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";          if(!empty( $keyword )){$msgType = "text";$contentStr = "Welcome to wechat world!";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;}else{echo "Input something...";}}else {echo "";exit;}}private function checkSignature(){$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"]; $token = TOKEN;$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr == $signature ){// header('content-type:text');return true;}else{return false;}}
}
?>

在此解释一下这里面两个方法的作用:

  1. checkSignature():验证请求信息是否来自微信服务器。
    开发者在接口配置里填写了url信息,那么在开发者提交信息后,微信服务器会发送get请求到该url上,get请求携带了4个参数(signature,timestamp,nonce,echostr),checkSignature方法对请求参数进行加密校验,流程如下:
    1)将token、timestamp、nonce三个参数进行字典序排序
    2)将三个参数字符串拼接成一个字符串进行sha1加密
    3)开发者获得加密后的字符串可与signature对比,相等就证明该请求来源于微信服务器,原样返回echostr参数内容,成为开发者成功,否者接入失败。

  2. responseMsg():接收用户发送的消息或事件推送,并解析包含的数据,自定义回复消息。
    通过全局变量$GLOBALS[“HTTP_RAW_POST_DATA”]获取post请求的内容(XML字符串),接着使用simplexml_load_string将其转换为对象,可获取fromUsername ,toUsername ,Content,Event等属性值,通过判断event类型和筛选消息内容进行回复。将回复消息的数据使用sprintf封装到回复消息的XML字符串里,返回给微信服务器,由微信服务器解析展示到客户端。

注意:验证方法只有在验证开发者的时候需要调用,一旦验证成功后不再需要,请注释掉!!!

2. 首次关注回复

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$ev=$postObj->Event;//获取事件类型
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
if($ev=='subscribe'){// 用户首次关注,自动回复欢迎语$msgType="text";$contentStr="欢迎您的关注,只为给您更好的服务";$resultStr=sprintf($textTpl,$fromUsername,$toUsername,$time,$contentStr);echo $resultStr;
}

3. 点击菜单拉取消息时的事件推送

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$ev=$postObj->Event;//获取事件类型
$keyword = trim($postObj->Content);
$time = time();
if($ev=='CLICK'){$evKey=$postObj->EventKey;if($evKey=='send_text'){//事件KEY值,与自定义菜单接口中KEY值对应$msgType="text";$contentStr="你点击了Click类型的菜单";$resultStr=sprintf($textTpl,$fromUsername,$toUsername,$time,$contentStr);echo $resultStr;}
}

3. 关键字回复

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
if (!empty($keyword)) {$pattern = '/.*(随机)|(random).*/';preg_match($pattern,$keyword,$match);if($match){$msgType = "text";$contentStr = mt_rand(0,100);$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);echo $resultStr;
}

我这里是使用正则匹配是否含有关键字,$match被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。没匹配到则为空数组。

还有其他类型的消息回复,大致流程是差不多的,只是消息的XML模板有一点区别,在这里就不演示了。希望初学者能从中有所收获!!!

微信公众号接口开发--回复消息相关推荐

  1. java开发微信公众号接受并回复消息[工程代码+图片全解]

    写这篇博客时犹豫了好久,因为步骤太多了,上班了也没时间,但是我依然记得当时实现公众号自动回复时的场景,找个案例好 难,也没有一个完整的案例,想了想还是写出来吧,希望能让实现这功能的人少走弯路. 微信公 ...

  2. php微信调用天气api,微信公众号接口开发--snoweek测试

    注意: 前期的准备工作,我是参照的微信公众平台开发入门教程,我自己认为讲解的还是很详细的. 对于将要使用的天气接口,我是在聚合数据里找的. 完整的代码,可以前往我的github中,weixin_kai ...

  3. 微信公众号接口开发----退款

    微信公众号开发---退款   微信接口文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 1.先上官方文档说明 注意点: ...

  4. 微信公众号Java开发记录(二)接收、回复消息

    文章目录 一.接受消息 将xml数据包解析成Map BaseMessage TextMessage 二.回复消息 将Map转化成xml数据包 一.接受消息 用户向公众号发送的消息是通过我们的那个路径的 ...

  5. Java开发微信公众号之被动回复用户消息-回复图片消息

    一.前言 hello小伙伴们,大家好,做微信开发两年了,最近看到微信方面的文章阅读量和关注量上升的比较快速,激发了我满满的动力啊,所以就滋生了一个想法,从头开始整理一下微信公众号开发,写一个简易的教程 ...

  6. Java架构学习(五十一)微信公众号开发混合开发技术流程微信推送原理外网映射工具使用微信公众号接口认证代码获取微信客户端信息解决微信消息幂等问题

    一.微信公众号项目 SOA架构:面向接口开发,也就是相当于把传统的那种ssh项目的业务逻辑层抽取出来 做成接口. SSH架构与分布式架构的区别 SSH架构是整个项目的任何模块都在一个项目里面 分布式架 ...

  7. 微信公众号开发 - 配置表设计以及接入公众号接口开发

    微信公众号开发文章目录 1.微信公众号开发 - 环境搭建 2.微信公众号开发 - 配置表设计以及接入公众号接口开发 3.微信公众号开发 - token获取(保证同一时间段内只请求一次) 4.微信公众号 ...

  8. 公众号php怎么限制回复次数,刚刚上线!打破微信公众号48小时回复粉丝消息限制!...

    原标题:刚刚上线!打破微信公众号48小时回复粉丝消息限制! 众所周知微信公众号一直以来和粉丝的关系是比较封闭的,除了订阅号每日一次的推送,服务号每月四次的推送外,公众号很难主动联系粉丝. 如果粉丝没有 ...

  9. springmvc开发微信公众号接口 微信公众号测试账号配置接口Token验证

    转:springmvc开发微信公众号接口 微信公众号测试账号配置接口Token验证 开发前必读以及准备工作: 1.微信公众平台开发是指为微信公众号进行业务开发,为移动应用.PC端网站.公众号第三方平台 ...

  10. asp论坛回复功能怎么实现_微信公众号整合群发图文消息功能怎么实现?

    对于微信公众号整合区分图文消息功能的实现,微号帮平台提供了服务号每月400次群发功能实现,公众平台提供了接口编程开发实现功能,均能达到微信公众号群发图文消息的功能效果,实现订阅号每天群发1次消息,服务 ...

最新文章

  1. 概率图模型PGM——D map, I map, perfect map
  2. SOA标准之----SCA架构思想
  3. 32位微型计算机quot;中的32指的是,《计算机应用基础作业一).doc
  4. mysql 聚簇索引和非聚簇索引_聚簇索引和非聚簇索引
  5. Python使用@property方法改变方法为参数
  6. 计算机与在勘察地质中的应用,地质勘察中计算机信息技术的应用
  7. 成为Oracle 10g DBA之路
  8. GDI与DirectX对比
  9. Protel DXP 2004 SP3_SP4 注册机
  10. 中链云矿主办Web3.0 中国财富峰会
  11. [网络]网速很快但是访问网页很慢的两种解决办法
  12. 九爷带你 查看linux所有正在运行的进程
  13. Excel图标也可以变脸
  14. 用python绘制树和深林
  15. 如何理解和如何选择PDA数据采集器
  16. Glove 细节介绍
  17. 《狂人日记》(书感)
  18. 电影《满城尽带黄金甲》周杰伦接受了新浪娱乐独家对话
  19. launcher3 修改文件夹图标九宫格显示
  20. 简单Thinkphp5.1如何使用Topsdk\Topapi

热门文章

  1. 中奖名单模板_获奖名单公布模板速来选择
  2. 【业务知识】金融、银行业务知识点(转载)
  3. Android之 APP创建或删除快捷方式
  4. C语言 修改JPEG图片属性
  5. vue 使用animate动画
  6. m3u8流媒体下载 swift
  7. 怎样用html制作歌词字幕,pr歌词字幕制作方法
  8. SpringBoot切面Aop的demo简单讲解
  9. html背景图片自动铺满屏幕,【CSS背景图片页面自适应充满屏幕】
  10. Mysql复制表结构与表数据