热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信公众平台开发(二):交互与接口

1、微信用户、微信服务器和后台服务器的交互例:微信用户向公众号发送一条文本消息,这条消息会首先传给微信服务器,微信服务器处理这条信息并将其以xml数据格式传递给后台服务器,后台服务器接受到

1、微信用户、微信服务器和后台服务器的交互

例:微信用户向公众号发送一条文本消息,这条消息会首先传给微信服务器,微信服务器处理这条信息并将其以xml数据格式传递给后台服务器,后台服务器接受到数据后会对数据进行处理,再响应数据以xml数据格式传递给微信服务器,微信服务器再响应到用户微信界面。
微信用户与微信后台服务器之间的交互过程就是数据传递过程,只不过需要需要通过微信服务器这个中转站。
那么微信服务器这个中转站到底有什么用?
对xml数据进行加工包装后展现在手机屏幕上。我们接受的图文消息,如下:
单图文:
单图文.jpeg
多图文
多图文.jpeg
你会发现微信上几乎所有的图文都是这种格式,板式、大小都是一样,这就是经过微信服务器包装后的结果。
2、交互的数据类型

微信用户可以发送的数据类型
1、文本型(text)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<Content>Content>
xml>";
2、语音(voice)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<Format>Format>
<MsgId>5836982871638042400MsgId>
<MediaId>MediaId>
<Recognition>Recognition>//recognition表示语音识别的结果
xml>
3、图片( img)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<PicUrl>PicUrl>
<MsgId>5836982871638042400MsgId>
<MediaId>MediaId>
xml>
每一条消息传给微信服务器后都会被标记一个MsgId,上传的图片、视频、语音等也会被标记一个mediaId。
4、视频(video)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<MsgId>5836982871638042400MsgId>
<MediaId>MediaId>
<ThumbMediaId>ThumbMediald>;//视频静止时显示那张图片地址
xml>
5、地理位置消息(location)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<MsgId>5836982871638042400MsgId>
<Location_X>22.539968Location_X>
<Location_Y>113.954980Location_Y>
<Scale>16Scale>
<Label>Label>
xml>
6、链接消息(link)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<MsgId>5836982871638042400MsgId>
<Title>Title>
<Description>Description>
<Url>Url>
<MsgId>5839907284805129867MsgId>
xml>
后台服务器响应的消息类型
1、文本型(text)
2、语音(voice)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<MsgId>5836982871638042400MsgId>
<Voice>
<MediaId>MediaId>
Voice>
xml>
3、图片( img)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<MsgId>5836982871638042400MsgId>
<Image>
<MediaId>MediaId>
Image>
xml>
4、视频(video)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<MsgId>5836982871638042400MsgId>
<video>
<MediaId>MediaId>
<ThumbMediaId>ThumbMediald>;//视频静止时显示那张图片地址
video>
xml>
5、音乐(music)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<MsgId>5836982871638042400MsgId>
<Music>
<Title>Title>
<Description>Description>
<MusicUrl>MusicUrl>
<HQMusicUrl>HQMusicUrl>
Music>
xml>
6、图文(news)
<xml>
<ToUserName>ToUserName>
<FromUserName>FromUserName>
<CreateTime>%sCreateTime>
<MsgType>MsgType>
<MsgId>5836982871638042400MsgId>
<Content>Content>
<ArticleCount>%sArticleCount>
<Articles>
<item>
<Title>Title>
<Description>Description>
<PicUrl>PicUrl>
<Url>Url>
item>
<item>
<Title>Title>
<Description>Description>
<PicUrl>PicUrl>
<Url>Url>
item>
Articles>
xml>

上面代码在数据填写方面只做参照。以上代码在需要的时候调用即可,这里只是为大家展现以下数据格式。
CDATA是一个标记,被其标记的文本数据中不会被xml解析器进行解析。一个 CDATA 部件以"

ToUserName  接收方帐号
FromUserName  发送方帐号
CreateTime 发送事件
MsgType  数据类型
Content   文本内容
ArticleCount  图文数量
MsgId  数据id
MediaId  媒介id
Title  标题
Description  描述
MusicUrl   音乐连接地址
HQMusicUrl  高品质音乐连接地址

2、具体的交互步骤即代码

在上一章图2中,我们为测试号定义了url和token。url就是与微信服务器进行通信的后台服务器地址,而token一个相当于一个令牌。微信服务器与后台服务器进行通信时会出示该令牌,如果后台服务器发现微信服务器与自己携带的令牌相同才会进行通信,不相同则拒绝通信 。这个过程叫做token验证(这个令牌不是token的值)。
上面比较形象的说话,下面我通过代码来解释
例如:url为http://weixinceshi111111.applinzi.com/index2.php
token:weixin
index2.php代码

 // // 响应用户消息 // 微信公众账号响应给用户的不同消息类型 //微信服务器要和后台服务器进行通信首先要进行token验证,微信会通过get方式发送signature(微信加密签名)、nonce(随机数)、timestamp(时间戳)、echostr(随机字符串)。后台服务器获取之后会将timestamp、nonce与自身定义的TOKEN按照一定的顺序拼接成字符串,通过shal加密后获得的结果与signature进行对比,如果相同则把echostr返回给微信服务器。 表示验证成功。 header("content-type:text;charset=utf8"); define("TOKEN", "weixin"); //token验证是通过get传输数据,微信用户发送的数据通过post方式发送。先进行get请求,再进行post请求。 $wechatObj = new wechatCallbackapiTest(); //判断是get请求还是post请求。$_GET['echostr']如果存在,表示是进行token验证的get请求。反之是传输数据的post请求。 if (!isset($_GET['echostr'])) { $wechatObj->responseMsg();//响应数据 }else{ $wechatObj->valid();//响应 } class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; 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){ return true; }else{ return false; } } public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//获取发送过来的数据。 if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', );//把xml字符串载入到一个SimpleXMLelement对象中。simplexml_load_string()是一种xml解析器。 $RX_TYPE = trim($postObj->MsgType);//trim去掉字符串两端kongge。 //用户发送的消息类型判断 switch ($RX_TYPE) { case "text": $result = $this->receiveText($postObj); break; case "image": $result = $this->receiveImage($postObj); break; case "voice": $result = $this->receiveVoice($postObj); break; case "video": $result = $this->receiveVideo($postObj); break; default: $result = "unknow msg type: ".$RX_TYPE; break; } echo $result; }else { echo ""; exit; } } private function receiveText($object) { $keyword = trim($object->Content); if($keyword == "文本"){ //回复文本消息 $content = "这是个文本消息"; $result = $this->transmitText($object, $content); } else if($keyword == "图文" || $keyword == "单图文"){ //回复单图文消息 $content = array(); $content[] = array("Title"=>"单图文标题", "Description"=>"单图文内容", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); $result = $this->transmitNews($object, $content); } else if($keyword == "多图文"){ //回复多图文消息 $content = array(); $content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); $content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); $content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); $result = $this->transmitNews($object, $content); } else if($keyword == "音乐"){ //回复音乐消息 $content = array("Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3", "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3"); $result = $this->transmitMusic($object, $content); } return $result; } private function receiveImage($object) { //回复图片消息  $content = array("MediaId"=>$object->MediaId); $result = $this->transmitImage($object, $content);; return $result; } private function receiveVoice($object) { //回复语音消息  $content = array("MediaId"=>$object->MediaId); $result = $this->transmitVoice($object, $content);; return $result; } private function receiveVideo($object) { //回复视频消息  $content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>""); $result = $this->transmitVideo($object, $content);; return $result; } /* * 回复文本消息,将要回复的xml消息进行包装。 */ private function transmitText($object, $content) { $textTpl = "   %s   "; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);//sprintf()这个函数的作用还是比较有意思的,可以搜索看看。 return $result; } /* * 回复图片消息 */ private function transmitImage($object, $imageArray) { $itemTpl = "  "; $item_str = sprintf($itemTpl, $imageArray['MediaId']); $textTpl = "   %s  $item_str "; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time()); return $result; } /* * 回复语音消息 */ private function transmitVoice($object, $voiceArray) { $itemTpl = "  "; $item_str = sprintf($itemTpl, $voiceArray['MediaId']); $textTpl = "   %s  $item_str "; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time()); return $result; } /* * 回复视频消息 */ private function transmitVideo($object, $videoArray) { $itemTpl = ""; $item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']); $textTpl = "   %s  $item_str "; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time()); return $result; } /* * 回复图文消息 */ private function transmitNews($object, $arr_item) { if(!is_array($arr_item)) return; $itemTpl = "       "; $item_str = ""; foreach ($arr_item as $item) $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']); $newsTpl = "   %s   %s  $item_str "; $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item)); return $result; } /* * 回复音乐消息 */ private function transmitMusic($object, $musicArray) { $itemTpl = "     "; $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']); $textTpl = "   %s  $item_str "; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time()); return $result; } } ?>

3.接口

3.1 接口是什么
接口就相当于一个工具,具备特定的功能。比如你在建造房子的时候需要在墙上钻孔,你就会使用钻机工具来钻孔。从调来工具到钻孔完成,你要完成插电、校准、钻孔等一系列步骤,最终实现你的目标。钻机就是我们的接口,插电、校准、钻孔就是我们调用工具完成目的步骤。
拿微信的创建菜单接口举例。
调用接口的步骤:
1、获得微信菜单接口的连接地址,通过curl函数与这个接口建立对话。
2、把创建菜单数据发送给这个接口。
接口调用完成,这个接口会自动把这些数据进行处理并在微信公众好页面生成菜单。

微信接口的调用方式请看下一章:微信公众平台开发(三):微信高级接口的调用。


推荐阅读
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
author-avatar
个信2602907025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有