一、简介

新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应回复处理。

在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台,通俗一点讲就是该平台的“使用说明书”。

本文将详细讲述对subscribe事件的处理过程,回复相应信息提升交互性。

二、思路分析

微信目前提供了五种消息类型,分别为:

  • 文本消息(text);
  • 图片消息(image);
  • 地理位置消息(location);
  • 链接消息(link);
  • 事件推送(event);

接收到消息后,首先需要对消息类型做出判断,然后再针对不同类型的消息做出处理。在事件推送中,事件类型又分为三种,subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件),还需要再加一次判断;判断为subscribe事件后,根据设定好的欢迎消息,回复给用户。

三、判断消息类型

  1. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  2. $RX_TYPE = trim($postObj->MsgType);
  3.  
  4. switch($RX_TYPE)
  5. {
  6. case "text":
  7. $resultStr = $this->handleText($postObj);
  8. break;
  9. case "event":
  10. $resultStr = $this->handleEvent($postObj);
  11. break;
  12. default:
  13. $resultStr = "Unknow msg type: ".$RX_TYPE;
  14. break;
  15. }

说明:

$RX_TYPE = trim($postObj->MsgType);   得到消息类型;

case "text":
  $resultStr = $this->handleText($postObj);   使用handleText() 函数处理文本消息;

case "event":
  $resultStr = $this->handleEvent($postObj);   使用handleEvent() 函数处理事件推送;

四、判断事件类型

  1. switch ($object->Event)
  2. {
  3. case "subscribe":
  4. $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";
  5. break;
  6. default :
  7. $contentStr = "Unknow Event: ".$object->Event;
  8. break;
  9. }

说明:

如果是subscribe事件,设定回复内容为“感谢您关注【卓锦苏州】...”;

五、完整代码

  1. <?php
  2. /**
  3. * wechat php test
  4. */
  5.  
  6. //define your token
  7. define("TOKEN", "zhuojin");
  8. $wechatObj = new wechatCallbackapiTest();
  9. $wechatObj->responseMsg();
  10. //$wechatObj->valid();
  11.  
  12. class wechatCallbackapiTest
  13. {
  14. /*public function valid()
  15. {
  16. $echoStr = $_GET["echostr"];
  17.  
  18. //valid signature , option
  19. if($this->checkSignature()){
  20. echo $echoStr;
  21. exit;
  22. }
  23. }*/
  24.  
  25. public function responseMsg()
  26. {
  27. //get post data, May be due to the different environments
  28. $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  29.  
  30. //extract post data
  31. if (!empty($postStr)){
  32.  
  33. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  34. $RX_TYPE = trim($postObj->MsgType);
  35.  
  36. switch($RX_TYPE)
  37. {
  38. case "text":
  39. $resultStr = $this->handleText($postObj);
  40. break;
  41. case "event":
  42. $resultStr = $this->handleEvent($postObj);
  43. break;
  44. default:
  45. $resultStr = "Unknow msg type: ".$RX_TYPE;
  46. break;
  47. }
  48. echo $resultStr;
  49. }else {
  50. echo "";
  51. exit;
  52. }
  53. }
  54.  
  55. public function handleText($postObj)
  56. {
  57. $fromUsername = $postObj->FromUserName;
  58. $toUsername = $postObj->ToUserName;
  59. $keyword = trim($postObj->Content);
  60. $time = time();
  61. $textTpl = "<xml>
  62. <ToUserName><![CDATA[%s]]></ToUserName>
  63. <FromUserName><![CDATA[%s]]></FromUserName>
  64. <CreateTime>%s</CreateTime>
  65. <MsgType><![CDATA[%s]]></MsgType>
  66. <Content><![CDATA[%s]]></Content>
  67. <FuncFlag>0</FuncFlag>
  68. </xml>";
  69. if(!empty( $keyword ))
  70. {
  71. $msgType = "text";
  72. $contentStr = "Welcome to wechat world!";
  73. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  74. echo $resultStr;
  75. }else{
  76. echo "Input something...";
  77. }
  78. }
  79.  
  80. public function handleEvent($object)
  81. {
  82. $contentStr = "";
  83. switch ($object->Event)
  84. {
  85. case "subscribe":
  86. $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";
  87. break;
  88. default :
  89. $contentStr = "Unknow Event: ".$object->Event;
  90. break;
  91. }
  92. $resultStr = $this->responseText($object, $contentStr);
  93. return $resultStr;
  94. }
  95.  
  96. public function responseText($object, $content, $flag=0)
  97. {
  98. $textTpl = "<xml>
  99. <ToUserName><![CDATA[%s]]></ToUserName>
  100. <FromUserName><![CDATA[%s]]></FromUserName>
  101. <CreateTime>%s</CreateTime>
  102. <MsgType><![CDATA[text]]></MsgType>
  103. <Content><![CDATA[%s]]></Content>
  104. <FuncFlag>%d</FuncFlag>
  105. </xml>";
  106. $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
  107. return $resultStr;
  108. }
  109.  
  110. private function checkSignature()
  111. {
  112. $signature = $_GET["signature"];
  113. $timestamp = $_GET["timestamp"];
  114. $nonce = $_GET["nonce"];
  115.  
  116. $token = TOKEN;
  117. $tmpArr = array($token, $timestamp, $nonce);
  118. sort($tmpArr);
  119. $tmpStr = implode( $tmpArr );
  120. $tmpStr = sha1( $tmpStr );
  121.  
  122. if( $tmpStr == $signature ){
  123. return true;
  124. }else{
  125. return false;
  126. }
  127. }
  128. }
  129.  
  130. ?>

六、关注

请关注 卓锦苏州 微信公众帐号,卓锦苏州 基于BAE 平台开发,针对于主流的微信功能进行开发测试。

您可以关注 卓锦苏州 公众帐号进行功能测试,以及获取新的应用开发。

1. 登录微信客户端,通讯录 -> 添加朋友 -> 查找公众号 -> zhuojinsz,查找并关注。

2. 扫描二维码:

卓锦苏州 功能列表。


David Camp

我们永远相信,分享是一种美德 | We Believe, Great People Share Knowledge...

微信公众平台开发(三) 订阅事件(subscribe)处理的更多相关文章

  1. Java微信公众平台开发(三)--接收消息的分类及实体的创建

    转自:http://www.cuiyongzhi.com/post/41.html 前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端post的消息类型,这里我们将建立消息实 ...

  2. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证

    要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...

  4. David Camp 微信公众平台开发官方内容拓展版---PHP版本

    微信公众平台开发(一) 配置接口 微信公众平台开发(二) 微信公众平台示例代码分析 微信公众平台开发(三) 订阅事件(subscribe)处理 微信公众平台开发(四) 简单回复功能开发 微信公众平台开 ...

  5. 【微信Java开发 --2】接入微信公众平台开发,配置自己的服务器,验证过程

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑好我们就开始:1.填写好我们的URL和Token[此处是已经通过验证的] ...

  6. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

  7. 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理

    温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...

  8. 转:C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...

  9. 基于PHP的微信公众平台开发(TOKEN验证,消息回复)

    微信公众平台开发 实现步骤: 第一步:填写服务器配置 登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL).Token和EncodingAE ...

  10. PHP实现微信公众平台开发 全套视频资源下载

    好久没有在博客园更新东西了,今天给大家分享一份比较不错的视频学习资源吧. 主要是关于PHP实现微信公众平台开发,  不知道大家对于微信平台的开发有多少了解,那么今天就从基础开始吧,资源目录如下(PS ...

随机推荐

  1. 线程Thread的基础知识学习

    一.线程的基本概念 1.线程是一个程序内部的顺序控制流. 2.Java的线程是通过java.lang.Thread类来实现的. 3.VM启动时会有一个由主方法{public static void m ...

  2. puporwindow

    //Java代码private void showPopupWindow(View view) { // 一个自定义的布局,作为显示的内容 View contentView = LayoutInfla ...

  3. 移动 Web 开发必备!时尚的 Off Canvas 导航

    这里向大家分享一组创新的 Off Canvas 导航效果.Off Canvas 导航在一些移动应用程序中被广泛使用.当你点击汉堡按钮(一般是三条横线组成)时,在左侧或者右侧拉出一个菜单,这样可以充分利 ...

  4. JavaScript实现HTML5烟花特效

    烟花效果如下(请使用支持HTML5的浏览器查看):点击这里查看效果:http://keleyi.com/keleyi/phtml/html5/14.htm 源代码如下: ;}</style> ...

  5. visual studio 查找/替换对话框

    工具--选项--环境--查找和替换 如下设置: 则会在查找.替换到最后时会弹出提示,比如“查找到达了搜索的起点”,如下图: 原文:http://keleyi.com/a/bjac/27iswh0p.h ...

  6. BP人工神经网络原理(转载)

  7. Android悬浮窗实现 使用WindowManager

    Android悬浮窗实现 使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得  ...

  8. 操作系统开发系列—解释typedef void (*int_handler) ();

    于是我换了一个思路来理解这个typedef 我们首先看常规的变量定义: int INT//定义了一个名为INT的int型变量. char *c//定义了一个名为c的char型指针变量 void(*Fu ...

  9. Android studio修改Logcat颜色

    Android studio默认的Logcat配色不利于阅读,我们可以修改自定义自己的颜色配置

  10. Android 显示意图激活另外一个Actitity

    1.跳转到一个新的Actitity 新建项目, 新建一个java类OtherScreenActivity 继承自 Activity类 package com.wuyudong.twoactivity; ...