赵工的个人空间


专业技术部分转网页计算转业余爱好部分


  网站建设

首页 > 专业技术 > 网站建设 > 微信公众平台编程
微信公众平台编程

1.微信公众平台:

这是在微信基础上新增的功能模块,可以通过这一平台实现与特定群体之间进行文字、图片、语音等沟通互动。微信公众账号有多种使用方法,如群发消息、通过自动回复与用户互动、通过API扩充功能等。

2.申请微信公众平台账号:

个人微信公众账号需要有邮箱账号、个人身份证信息、手机号码,设置账号名称。公众账号注册必须在电脑中进行,输入网址http://mp.weixin.qq.com/,需要5个步骤,按提示操作。祖册完成后要经过审核,然后申请认证。
微信公众账号分为服务号和订阅号,服务号可以使用自定义菜单,一个月只能群发一条消息,群发消息会显示在用户的聊天列表中;订阅号每天都可以发送一条消息,群发消息出现在订阅号文件夹中。

3.公众平台使用:

登录公众平台,左侧有功能菜单,其中提供了功能、小程序、管理、推广、统计、设置、开发等功能菜单。其中,功能和管理提供了自动回复设置、自定义菜单设置、消息管理等功能,供用户手动操作来使用公众平台与用户交互。
而通过开发菜单中的功能,可以通过编程实现公众平台的二次开发。申请开发者账号后,可以获取AppID和AppSecret,然后通过配置公众平台服务器就可以使用编程方式实现公众平台功能。
要进行微信公众平台的二次开发,必须要有一台公众账号服务器,服务器要有公网IP,并可以使用80端口,可以通过租用网站虚拟空间来低成本实现。微信公众平台开发类似于网站的开发,可以使用网站后端的开发技术来实现,比如ASP、PHP、JSP等。

4.Token验证:

要进行微信公众账号的二次开发,要首先登录到微信网站的账号,并进行相应的配置。在其中URL中填入公众账号服务器的网址,而Token则是一个自定义令牌字符串,用于两端进行身份验证,保证安全性。
微信服务器发送数据给公众账号服务器时会带上4个参数:signature、timestamp、nonce、echostr,其中timestamp是时间戳,nonce是一个随机数,echostr是随机字符串,signature是对timestamp、nonce和Token进行SHA1加密后的字符串。signature、timestamp、nonce参数是通过GET请求传送的。
公众账号服务器收到timestamp、nonce和signature后,同样对nonce、timestamp和Token使用SHA1加密算法,得到自己的签名,如果自己的签名和请求中的signature一样,说明请求来自于微信服务器。

5.XML封装信息:

微信用XML封装信息。用户发给微信公众账号的数据或公众账号发送给用户的数据大部分是通过XML进行封装的。封装的数据通常包括收发双方的账号、发送信息的类型、文本信息内容等。

1)XML概念:

XML是Extensible Markup Language的缩写,即可扩展标记语言。XML实际上是Web上表示结构化信息的一种标准文本格式,可以用来标记数据、定义数据类型,可以使用自定义标记,非常适合Web传输。

2)XML文档结构:

在XML文档中必须包含一个根元素,该根元素是所有其他元素的父元素,而所有元素都可以拥有子元素,这样XML文档中的元素就形成了一颗文档树,这棵树从根部开始,并扩展到树的最底端。在XML文档中,所有元素均可拥有文本内容和属性。

3)XML语法:

XML元素是指从开始标记直到结束标记的部分,元素可包括其他元素、文本或者二者的混合物。XML元素必须遵从的命名规则有:名称可以含字母、数字以及其他字符;名称不能以数字或者标点开始;名称不能以字符xml、XML、Xml开始;名称不能包含空格;可使用任何名称,没有保留的字词。
推荐的命名习惯:名称要具有描述性,容易看懂表示的数据;名称应当比较简短;避免使用“-”,某些软件可能会认为是需要提取第一个单词;避免使用点“.”,很多面向对象的程序会认为是对象的属性;避免使用冒号“:”,会被转换为命名空间来使用;非英语的字符也是合法的XML元素名,但某些软件可能不支持这些字符,将会出现意料不到的问题。
元素必须有关闭标记,标记对大小写敏感。XML元素间的嵌套层次必须正确,XML的属性值必须加引号。

4)文本内容规则:

在XML中,一些字符拥有特殊含义,如“<”和“>”,如果在XML文档的文本内容中用到就会发生错误,这时需要使用转义字符,“<”使用“<”,“>”使用“>”,其他还有“&”使用“&”,单引号使用“'”,双引号使用“"”。转义字符都为小写字符。
但某些文本中会包含大量特殊字符,逐个转义比较麻烦,这时可以定义为CDATA区段。CDATA区段中的所有内容都会被XML解析器忽略,区段由“<![CDATA[”开始,由“]]>”结束。当然,CDATA部分的内容不能包含字符串“]]>”。

6.JSON封装信息:

JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换格式,比XML更小、更快、更容易解析。JSON就是JavaScript中的对象和数组。微信公众号对自定义菜单项就是采用JSON 格式封装的,还有一些返回消息也采用JSON格式封装。

1)JSON对象:

JSON的数据结构为{key:value,key:value,...}的键值对结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,这个属性值的类型可以是数字、字符串、数组、对象几种。
数组在JS中是中括号“[]”括起来的内容,其中元素使用索引获取,字段值的类型可以是数字、字符串、数组、对象等几种。对象、数组这两种结构可以互相嵌套,这样就可以组合成复杂的数据结构了。

2)JSON语法规则:

数据在“键:值”对中,每一项数据都是由key:value构成,多个数据之间由逗号分隔;每一对花括号之间的内容表示一个对象,这个对象的属性和属性值则在花括号中的key:value对进行设置,其中的value值可以为另一个JSON对象或数组;方括号保存数组,数组中各元素之间由逗号分隔,数组中的各元素既可以是一个JSON对象,也可以是一个JSON数组,即可以嵌套。

3)JSON定义的微信菜单:

{
"button":[
{
"name":"公共查询",
"sub_button":[
{
"type":"click",
"name":"天气查询",
"key":"tianQi"
},
{
"type":"click",
"name":"公交查询",
"key":"gongJiao"
},
{
"type":"click",
"name":"翻译查询",
"key":"fanYi"
},
{
"type":"click",
"name":"快递查询",
"key":"kuaiDi"
}]
},
{
"name":"本州本地",
"sub_button":[... ...]
},
{
"type":"click",
"name":"联系我们",
"key":"contact"
}]
}

7.接收用户信息:

当微信用户向公众账号发送消息时,微信服务器首先收到用户发送的消息,然后将用户信息和用户发送的消息打包为XML格式的数据包,再将这个XML数据包通过POST方式提交到开发者设置的公众平台服务器的URL上。公众账号服务器就需要获取微信服务器POST过来的XML数据包,然后对XML数据包进行解析,获知发送消息的用户及发送的内容。
微信用户可以向公众账号发送多种类型的数据,包括文本、图片、语音、视频、地理位置、链接等。

1)文本信息:

用户在手机客户端直接编辑文字后点击发送就可以发送文字给微信后台,微信后台会将该消息以XML形式封装后发给公众账号服务器,格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
其中:
·ToUserName:开发者微信账号
·FromUserName:发送方账号
·CreateTime:消息创建时间
·MsgType:消息类型,text表示是一个文本消息
·Content:文本消息内容
·MsgId:消息ID,64位整型

2)图片消息:

用户可以通过选择相册照片或者实时拍照来发送图片,微信后台会将该图片消息以XML形式封装后发给公众账号服务器,格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[this is a url]]></PicUrl>
<MsgId>1234567890123456</MsgId>
<MediaId><![CDATA[id]]</MediaId>
</xml>
图片链接地址URL的样式为:http://mmsns.qpic.cn/mmsns/GA8LLqCNtCKGMH.../0。手机端给公众账号发送图片时,微信后台在接收到照片原始数据后,会把照片上传到CDN,然后把文件对应的CDN地址填写到消息中的PicUrl中,公众账号服务器可以通过这个URL获取对应的图片数据。
其中:
·MediaId:图片消息媒体ID,可以调用多媒体文件下载接口拉取数据

3)语音消息:

用户向用户公众号发送语音消息的XML数据格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[id]]</MediaId>
<Format><![CDATA[amr]]</Format>
<MsgId>1234567890123456</MsgId>
<Recognition><![CDATA[]]</Recognition>
</xml>
其中:
·MediaId:语音消息媒体ID,可以调用多媒体文件下载接口拉取数据
·Format:语音格式,如amr、speex等

4)视频消息:

用户发送视频消息时的XML数据格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[id]]</MediaId>
<ThumbMediaId><![CDATA[thumbid]]</ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
其中:
·MediaId:视频消息媒体ID,可以调用多媒体文件下载接口拉取数据
·ThumbMediaId:视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据

5)地理位置消息:

微信也可以把用户当时所在位置信息发送到公众账号服务器,信息格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>23.134521</Location_X>
<Location_Y>113.358803</Location_Y>
<Scale>20</Scale>
<Label><![CDATA[位置信息]]></Label>
<MsgId>1234567890123456</MsgId>
</xml>
其中:
·Location_X:地理位置纬度
·Location_Y:地理位置经度
·Scale:地图缩放大小
·Label:地理位置信息,是手机定位后带的文本描述

6)链接消息:

用户发送链接消息的封装格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[link]]></MsgType>
<Title><![CDATA[公众平台官网链接]]></Title>
<Description><![CDATA[公众平台官网链接]]></Description>
<Url><![CDATA[url]]></Url>
<MsgId>1234567890123456</MsgId>
</xml>
其中:
·Title:消息标题
·Description:消息描述
·Url:消息链接

7)事件推送:

当用户在手机端触发一个事件时,公众账号服务器也会收到一条消息。这些事件包括用户订阅一个你的公众账号、取消关注你的公众账号、单击一个自定义菜单、扫描二维码等。微信4.5版之后支持事件推送。公众账号服务器收到的事件推送消息格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[EVENT]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>
其中:
·Event:事件类型,subscribe订阅,unsubscribe取消订阅,CLICK自定义菜单单击事件
·EventKey:事件KEY值,与自定义菜单接口中KEY值对应
如果需要在用户关注公众账号之后给用户发送一些欢迎的消息,就需要关注event为subscribe的事件。

8.向用户回复消息:

微信用户与公众账号的沟通是双向的,需要公众账号具有回复用户消息的功能。

1)回复文本消息:

在收到用户的消息后,如果需要回复一条文本消息给用户,构造的数据包格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[content]]></Content>
</xml>
其中:
·ToUserName:接收方账号,即收到的OpenID
·FromUserName:开发者微信公众账号
·Content:回复的消息内容,长度不超过2048字节
如果要发送一个链接,可以在text中使用<a>标记:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[<a href="http://www.qq.com">qq.com</a>]]></Content>
</xml>
用户收到的消息会是一个链接,单击该链接会打开对应的网址。

2)回复图片消息:

微信给公共账号提供了发送图片给用户的功能,但要求发送的图片必须提前上传到微信服务器中,上传后微信将返回该文件的一个媒体id,然后将该媒体id封装为XML数据包格式,然后就可以方便地发送给用户了。数据包格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[image]></MsgType>
<Image>
<MediaId><!CDATA[media_id]></MediaId>
</Image>
</xml>
其中:
·MediaId:保存在微信服务器的图片的媒体id,可以是公共账号上传的图片,也可以是用户上传的图片。

3)回复语音消息:

微信公众号回复用户语音消息的XML格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[voice]></MsgType>
<Voice>
<MediaId><!CDATA[media_id]></MediaId>
</Voice>
</xml>

4)回复视频消息:

微信公众号回复用户视频消息的XML格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[video]></MsgType>
<Video>
<MediaId><!CDATA[media_id]></MediaId>
<ThumbMediaId><!CDATA[media_id]></ThumbMediaId>
<Title><!CDATA[title]></Title>
<Description><!CDATA[description]></Description>
</Video>
</xml>
其中:
·ThumbMediaId:缩略图的媒体Id,通过上传多媒体文件得到的id
·Title:视频消息的标题
·Description:视频消息的描述

5)回复音乐消息:

如果是点歌服务,可以根据用户输入的歌名返回对应的歌曲,回复的是音乐消息格式:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><!CDATA[TITLE]></Title>
<Description><!CDATA[DESCRIPTION]></Description>
<MusicUrl><!CDATA[MUSIC_Url]></MusicUrl>
<HQMusicUrl><!CDATA[HQ_MUSIC_Url]></HQMusicUrl>
<ThumbMediaId><!CDATA[media_id]></ThumbMediaId>
</Music>
</xml>
其中:
·MusicUrl:音乐链接
·HQMusicUrl:高质量音乐链接,WIFI环境优先使用该链接
·ThumbMediaId:音乐的缩略图的媒体id,需要通过上传图片文件,得到相应的图片媒体id。

6)回复图文消息:

图文消息可以附带很多元素,有很强的表现力,消息格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><!CDATA[title1]></Title>
<Description><!CDATA[description1]></Description>
<PicUrl><!CDATA[Pic_Url]></PicUrl>
<Url><!CDATA[Url]></Url>
</item>
<item>
<Title><!CDATA[title]></Title>
<Description><!CDATA[description]></Description>
<PicUrl><!CDATA[Pic_Url]></MusicUrl>
<Url><!CDATA[Url]></Url>
</item>
</Articles>
</xml>
其中:
·ArticleCount:图文消息个数
·Articles:多条图文消息信息,默认第一个item为大图
·PicUrl:图片链接,支持JPG、PNG格式,大图640x320,小图80x80,图片链接的域名需要与开发者填写的基本资料中的Url一致
·Url:单击图文消息跳转的链接
新闻推送账号大多使用这种消息。微信不支持直接发送一个图片的消息,如果想要发送图片给用户也必须使用这种图文消息。

7)示例:

音乐消息
<xml>
<ToUserName><![CDATA[FROM]]></ToUserName>
<FromUserName><![CDATA[FROM]]></FromUserName>
<CreateTime>TIME</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><!CDATA[music[昨日重现]]></Title>
<Description><!CDATA[卡本特_昨日重现]]></Description>
<MusicUrl><!CDATA[http://42.96.142.129/1.mp3]></MusicUrl>
<HQMusicUrl><!CDATA[http://42.96.142.129/1.mp3]></HQMusicUrl>
</Music>
<FuncFlag>0</FuncFlag>
</xml>
图文消息
<xml>
<ToUserName><![CDATA[ouY7yjsXZKL..._b-C3FQ]]></ToUserName>
<FromUserName><![CDATA[gh_fd4633de8852]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><!CDATA[findface找到了]></Title>
<Description><!CDATA[如果照片没有完全展示,轻触照片查看全图]></Description>
<PicUrl><!CDATA[http://www.faceplusplus.com/static/img/starlib/1.jpg]></MusicUrl>
<Url><!CDATA[http://www.faceplusplus.com/static/img/starlib/1.jpg]></Url>
</item>
</Articles>
<FuncFlag>1</FuncFlag>
</xml>

9.下载微信用户发来的图片:

微信服务器只会保存最近5天的消息3天的图片,过期自动删除,以节约资源。如果公众平台希望保存这些信息,就需要将其下载到公众平台服务器上保存。要下载微信用户发来的图片,需要向微信服务器提供access_token和media_id两个数据。

1)获取access_token:

微信提供了一个调用接口来获取公众账号对应的access_token,要使用公众账号的AppID和AppSecret调用URL获取:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
正常情况下,微信会返回JSON数据包:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
其中的ACCESS_TOKEN是一长串字符串,而7200表示这个access_token的有效期7200秒(2小时),超过有效期就需要重新获取新的access_token。有效期内,随时可以再次调用以上接口获取新的access_token,这将导致上次调取的access_token失效。公众账号每天调用access_token接口的次数的限额是200次,获取后应存储,到期后再重新获取。
程序员需要编写代码来获取access_token,并将其保存在一个全局变量中,在需要时调用。

2)下载图片文件:

下载图片时提供的media_id是用户发送图片时由微信生成的,封装在XML数据包中传送到公众账号。下载多媒体文件的接口也是通过GET方法来进行,接口URL格式为:
http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
获取的多媒体文件需要保存到磁盘中。

10.客服消息接口:

有时,用户发送消息后需要人工查询资料,或者企业内部走一些流程,然后再给用户回复消息。这可以使用公众账号平台提供的手动功能,也可通过调用微信提供的客服消息来发送消息,将要发送的消息封装为规定的JSON数据包,然后通过POST方法发送到微信提供的客服消息接口,这样用户就可以收到一条消息。在通过客服消息接口给用户发送消息时,接收消息的一方并不是用户的微信号,而是用户给公共账号发消息时附带的OpenID。
在公众账号收到用户消息后的48小时内,才可以通过客服消息接口将消息发送给用户;只要是在48小时内给公众账号发送过消息的客户,都可以不限次数的给其发送消息。微信提供的客服消息接口是通过POST方式向以下链接发送消息:
https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
客服消息采用JSON格式封装,采用POST方式把数据发送给接口。

1)文本消息:

文本消息封装为以下JSON格式:
{"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}
其中:
·touser:微信用户的OpenID
·msgtype:发送消息类型,文本消息固定为text
·content:发送的文本消息内容

2)图片消息:

图片消息封装为以下JSON格式:
{"touser":"OPENID","msgtype":"image","image":{"media_id":"MEDIA_ID"}}
其中:
·msgtype:发送消息类型,图片消息固定为image
·media_id:发送图片的媒体id

3)语音消息:

语音消息封装为以下JSON格式:
{"touser":"OPENID","msgtype":"voice","voice":{"media_id":"MEDIA_ID"}}
其中:
·msgtype:发送消息类型,图片消息固定为voice

4)音乐消息:

音乐消息封装为以下JSON格式:
{"touser":"OPENID","msgtype":"music","music":{
"title":"MUSIC_TITLE",
"description":"MUSIC_DESCRIPTION",
"musicurl":"MUSIC_URL",
"hqmusicurl":"HQ_MUSIC_URL",
"thumb_media_id":"THUMB_MEDIA_ID"
}
}
其中:
·title:音乐的标题
·description:音乐的描述信息
·musicurl:音乐文件的链接
·hqmusicurl:高品质音乐的链接地址,在WIFI环境优先使用该链接播放音乐
·thumb_media_id:缩略图的媒体id

5)图文消息:

图文消息封装为以下的JSON格式:
{"touser":"OPENID","msgtype":"news","news":{"articles":[
{"title":"Happy Day",
"description":"Is Really A Happy Day",
"url":"URL",
"picurl":"PIC_URL"},
{"title":"Other Day",
"description":"Is Really A Other Day",
"url":"URL",
"picurl":"PIC_URL"}]}
}
图文消息的数据很多,并且articles是一个数组,可以在数组中最多定义10个子元素,每项表示一条图文消息。各参数含义为:
·title:图文消息的标题
·description:图文消息的描述信息
·url:点击后跳转的链接
·picurl:图文消息的图片链接地址,支持JPG、PNG格式,大图640x320,小图80x80

11.响应微信推送事件:

微信中有6种事件,关注/取消关注事件、扫描带参数二维码事件、上报地理位置事件、自定义菜单事件、点击菜单拉取消息时的事件、点击菜单跳转消息时的事件。这里主要介绍关注/取消关注事件和扫描带参数二维码事件。

1)关注/取消关注事件:

当用户关注公众账号时,将产生一个订阅subscribe事件,只需要响应这个事件,给用户发送一条消息以提供一个简短的欢迎代码及使用说明。微信推送事件是以XML格式封装的数据包,格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>
其中:
·Event:事件类型,subscribe订阅,unsubscribe取消订阅
程序中,对接收到的消息的类型MsgType进行判断,如果为event则表示收到的是一个推送的事件信息,然后即可对Event进行判断,以分辨是订阅还是取消订阅。

2)用户扫描二维码的处理:

每一个用户都可以将自己的账号生成一个二维码,以方便其他微信用户扫描关注自己,账号的二维码还可以附加一些参数。
目前微信支持两种类型的二维码,分别是临时二维码和永久二维码,临时二维码有过期时间,最大为1800秒(30分钟),但其参数设置范围大,最多支持2e32种不同的场景。这里说的参数,可用来设置不同的场景,如制作出10万份不同的二维码,然后放置不同位置,用户扫描时能通过参数知道用户来自哪个位置。
获取带参数的二维码有两个过程,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。
①创建二维码ticket:
每次创建二维码ticket需要提供一个开发者自行设定的参数scene_id,然后调用微信生成二维码ticket的接口,这里需提供access_token。微信生成二维码ticket的接口链接:
https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
在接口链接中要提供access_token,开发者自行设定的参数需要使用JSON封装,然后通过POST方式提交。
根据生成临时二维码或永久二维码,JSON数据格式有所不同。创建临时二维码ticket的JSON数据包格式为:
{"expire_seconds":1800,"action_name":"QR_SCENE","action_info":{"scene":{"scene_id":123}}}
创建永久二维码ticket的JSON数据包格式为:
{"action_name":"QR_LIMIT_SCENE","action_info":{"scene":{"scene_id":123}}}
其中:
·expire_seconds:该二维码的有效时间,以秒为单位,最大不超过1800
·action_name:二维码类型,QR_SCENE为临时,QR_LIMIT_SCENE为永久
·action_info:二维码详细信息,只是一个关键字
·scene_id:自定义参数,整数,临时二维码32位非0整数,永久二维码最大值100000
调用微信生成二维码ticket的接口,成功则生成二维码ticket,返回JSON数据格式类似:
{"ticket":"gGQ28DoAAAAAAASxodHRwoi8vd2VpeGluLnFxLmNvbS9xL0","expire_seconds":1800}
其中:
·ticket:获取二维码ticket,凭借此ticket可以在有效时间内换取二维码
·expire_seconds:二维码的有效时间,以秒为单位,最大不超过1800
如果未能正确生成二维码ticket,返回错误JSON数据:
{"errcode":40013,"errmsg":"invalid appid"}
②通过ticket获取二维码:
获取二维码ticket后,就可以通过ticket获取二维码图片了。获取二维码图片的接口链接为:
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
只要有ticket就可以通过网页浏览器来获取二维码图片。开发者一般通过程序来获取。由于ticket由GET方式提供,最好将ticket进行UrlEncode编码。

3)响应用户扫描二维码:

生成带参数的二维码后,当用户扫描这些带参数二维码时,微信将向公众账号推送两种事件:
如果用户还未关注公众账号,则用户可以关注公众账号,关注后微信会将带参数值关注事件推送给开发者;如果用户已经关注公众账号,在用户扫描后会自动进入对话,微信也会将带参数的扫描事件推送给开发者。
用户还未关注公众账号时,扫描关注后的事件推送以下格式的XML数据包:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>
其中:
·ToUserName:开发者微信号
·FromUserName:发送方账号(OpenID)
·CreateTime:消息创建时间,整型
·MsgType:消息的类型,固定为event
·Event:具体的事件类型,固定为subscribe
·EventKey:事件的KEY值,即自定义参数值,微信会自动加前缀qrscene_
·Ticket:二维码ticket,可用来换取二维码图片
如果用户已经关注公众账号,这时扫描二维码图片时,微信推送事件的XML数据包格式:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>
其中:
·ToUserName:开发者微信号
·FromUserName:发送方账号(OpenID)
·CreateTime:消息创建时间,整型
·MsgType:消息的类型,固定为event
·Event:具体的事件类型,固定为SCAN
·EventKey:事件的KEY值,即自定义参数值,32位无符号整数,创建二维码的scene_id
·Ticket:二维码ticket,可用来换取二维码图片

12.管理用户分组:

随着关注用户不断增多,用户管理就会成为公众账号服务中的重要部分,包括用户分组、查询用户信息等。

1)分组管理:

好的管理方法是将用户按一定规则进行分组,给用户发消息也按分组进行。通过微信提供的接口,可以通过代码查询分组名称、新建分组、修改分组名等。
①查看分组:
可通过以下接口获取已有分组信息:
https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN
获取分组信息只需要提供access_token就足够了。成功调用接口后将返回所有分组的JSON数据包:
{"groups":[
{"id":0,"name":"未分组","count":72596},
{"id":1,"name":"黑名单","count":36},
{"id":2,"name":"星标组","count":8},
{"id":104,"name":"自定义","count":4},
{"id":106,"name":"不测试组","count":1}
]}
其中:
·groups:是返回JSON数据的最外层,表示其下数据是公众平台分组信息列表,为一个数组,数组的每一个元素都由3项数据组成
·id:分组的id,由微信自动分配
·name:分组的名字,采用UTF8编码
·count:该分组内的用户数量
如果调用接口出错将返回包含错误信息的JSON数据包,如AppID无效引发的为:
{"errcode":40013,"errmsg":"invalid appid"}
②新建一个分组:
除了系统默认的3个分组外,公众账号也可以根据需要创建自己的分组,一个公众账号最多可创建500个分组。创建分组也是通过调用微信接口的方式进行,接口链接为:
https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN
创建分组必须要指明分组的名称,必须以POST方法提交,分组名称在POST 数据中,分组名称长度在30个字符以内。使用的JSON格式:
{"group":{"name":"test"}}
成功调用接口后,返回数据也是JSON,类似下面样式:
{"group":{"id":107,"name":"test"}}
返回的JSON数据中,id是创建分组的id,由微信分配,而name则是分组的名称。当调用接口失败时,将返回错误时的JSON数据包,类似下面示例:
{"errcode":40013,"errmsg":"invalid appid"}
③修改分组名称:
微信还提供了修改名称的接口,调用接口的链接为:
https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN
修改分组时也需要提供一些相关数据,由于分组的id是唯一的,修改分组名称时要提供修改分组的id及新的名称,这两项数据封装为JSON格式:
{"group":{"id":108,"name":"test2"}}
接口调用成功后,返回数据也是JSON,类似下面样式:
{"errcode":0,"errmsg":"ok"}
如果调用接口失败,将返回错误的JSON数据包,类似下面示例:
{"errcode":40013,"errmsg":"invalid appid"}

2)管理关注者:

①获取关注者的OpenID列表:
为了保护用户隐私,公众账号中的用户列表中不会显示用户的微信号,而是显示一串经过加密的微信号,称为OpenID。每个用户对每个公众账号的OpenID是唯一的,即一个用户在多个公众账号中的OpenID也是不同的。公众账号中,就是通过这唯一的OpenID来标识不同的用户。
微信提供了相应的接口来获取公众账号的关注者列表,调用一次接口最多可获取10000个关注者的OpenID,如果需要获更多关注者的OpenID,可通过多次调用接口的方式来实现。获取关注者OpenID的接口链接为:
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
其中,参数access_token是调用接口凭证,而next_openid则是第一个拉取的OpenID,如果该参数为空则从用户列表的开始获取数据。成功调用以上接口后,将返回类似JSON数据:
{"tptal":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
其中:
·total:关注该公众账号的总用户数,可能大于10000
·count:本次获取的OpenID的数量,最大10000
·data:列表数据,即OpenID列表,这只是数据的外层
·openid:表示多个OpenID数组
·next_openid:位于本次获取OpenID列表的下一个用户的OpenID,该参数主要是方便下一次从该位置开始获取后续的用户数据
如果接口调用失败,将返回一个表示错误信息的JSON数据包,格式为:
{"errcode":40013,"errmsg":"invalid appid"}
获取关注者列表接口调用的次数每天都有限制,超过限制返回的JSON数据格式为:
{"errcode":45009,"errmsg":"api freq out of limit"}
②查询用户所在分组:
获取关注者的OpenID后,通过每位关注者的OpenID可以查询关注者所在分组的id。微信提供以下接口来完成此功能:
https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=ACCESS_TOKEN
需要查询分组的关注者的OpenID需通过POST方式提交,数据格式为:
{"openid":"od8XIjsmk6QdVTETa9jLtGWA6KBc"}
调用接口成功,将返回以下格式的JSON数据包:
{"groupid":102}
返回值只有一个groupid,表示对应OpenID所属组的id。如果调用接口失败,返回错误的JSON数据包为:
{"errcode":40003,"errmsg":"invalid openid"}
③将用户添加到分组中:
默认状况下,新关注的用户都被添加到“未分组”,即分组id为0的分组中。为了方便管理用户,通常需要将未分组的用户添加到自己创建的分组中。微信提供了将用户添加到分组的相应接口:
https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=ACCESS_TOKEN
这个接口也需要以POST方式提交,数据采用JSON格式封装:
{"openid":"oDF3iYx0ro3_7jD4HFRDfrjdCM58","to_groupid":108}
JSON数据包中只有两个参数,其中openid是需要设置的用户唯一标识符,而to_groupid则是需要添加到的分组id。
如果调用成功,返回以下JSON数据包:
{"errcode":0,"errmsg":"ok"}
如果调用接口失败,返回错误值,JSON数据包为:
{"errcode":40013,"errmsg":"invalid appid"}

3)获取用户基本信息:

微信提供了获取用户基本信息的接口,公众账号根据OpenID通过接口可获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间等。获取用户基本信息的接口为:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
其中有3个参数,access_token为调用接口凭证;openid为用户的唯一标识号;lang为语言,zh_CN表示简体中文,zh_TW表示繁体中文,en表示英语。这个接口直接使用GET方法。
接口调用成功,微信会返回JSON数据包:
{"subcribe":1,"openid":"od8XIjsmk6QdVTETa9jLtGWA6KBc","nickname":"Band","sex":1,"language":"zh_CN","city":"广州","province":"广东","country":"中国","headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtHNkdmzicIlibx/0","subscribe_time":1382694957}
返回的数据项比较多,subcribe为用户是否订阅该公众账号的标识,值为0表示用户没有关注该公众号,就不能获取其余信息;openid为用户标识;nickname为用户的昵称;sex为用户的性别,1为男性,2为女性,0为未知;city为用户所在城市;province为用户所在省份;country为用户所在国家;language为用户语言;headimgurl为用户头像,最后一个数值代表正方形头像大小,有0、46、64、96、132数值可选,0代表640x640,没有头像时该项为空;subscribe_time为用户关注时间,为时间戳,如果多次关注,为最后一次关注时间。
如果调用接口出错,返回错误码JSON数据包:
{"errcode":40013,"errmsg":"invalid appid"}
实际应用中,可将分组数据保存到公众账号服务器的数据库中,在修改分组数据时更新公众账号服务器中保存的分组数据。只在公众账号服务器的数据库中进行查询,这样可以规避微信接口调用次数的限制。

13.自定义菜单:

微信开放了自定义菜单接口,让微信号添加了相当于导航的功能。自定义菜单就是在公众账号底部显示的3个菜单按钮,触按某个菜单按钮时将弹出一个菜单列表,用户通过选择其中的某一项菜单就可以向公众账号发送一个功能请求。
微信自定义菜单有一些限制条件:自定义菜单最多包括3个一级菜单,每个一级菜单最多只能显示4个汉字;每个一级菜单最多可包含5个二级菜单,二级菜单最多7个汉字,多出来的部分会以“...”代替。创建自定义菜单后,由于缓存原因,需要经过24小时在微信客户端才会展现出来,如果测试时要立刻看到效果,可以采用取消关注公众账号后再次关注的方法。
开发人员通过编写代码调用微信提供的接口,可查询、创建、删除公众账号的自定义菜单,在调用这些与菜单相关的接口时也需要提供access_token来认证身份。

1)自定义菜单的创建:

创建菜单的接口地址是:
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
这个接口需要使用POST方式访问,将菜单的数据通过POST方式提交。自定义菜单的数据使用JSON格式封装:
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SIFGER"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"view",
"name":"视频",
"url":"http://v.qq.com/"
},
{
"type":"click",
"name":"赞一下吧",
"key":"V1001_GOOD"
}]
}]
}
这个JSON数据包内容比较多,数据包中各参数的含义为:
·button:表示一级菜单的数组,个数为1~3
·sub_button:包含在一级菜单下的二级菜单数组,每个一级菜单下有1~5个
·type:菜单的响应动作类型,目前有click、view两种
·name:菜单的标题,不超过16个字符,子菜单不超过40个字符
·key:如果type设置为click类型则必须设置这个参数,表示菜单的KEY值,长度不超过128个字节
·url:如果type设置为view类型则必须设置这个参数,表示网页链接,长度不超过256字节
目前自定义菜单接口可实现click和view两种类型的按钮,用户触按click类型按钮后,微信服务器会通过消息接口推送类型为event的事件消息给公众账号,并且带上按钮中的key值;用户触按view类型的按钮后,微信客户端将会打开按钮中填写的url值,即网页链接。
调用创建自定义菜单接口成功后,返回以下格式JSON数据包:
{"errcode":0,"errmsg":"ok"}
如果创建自定义菜单出错,将返回以下JSON数据包:
{"errcode":40018,"errmsg":"invalid button name size"}

2)查询用户自定义菜单:

创建自定义菜单后,开发者还可以使用接口查询自定义菜单,以获取定义菜单时的相关JSON数据。查询自定义菜单通过以下接口实现:
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
这个接口以GET方式调用,只要提供access_token即可返回创建自定义菜单的JSON数据包。获取自定义菜单的JSON数据包中包含更多信息,最外层是menu参数,无论是一级菜单还是二级菜单都含义sub_button参数,如果没有子菜单为空数组。

3)删除自定义菜单:

如果公众账号不再使用自定义菜单了,可通过调用微信提供的删除接口将其删除。删除自定义菜单的接口为:
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
这个接口也是使用GET方式调用,只需要使用access_token参数即可完成菜单的删除。
调用以上接口成功删除自定义菜单后,返回的JSON数据包为:
{"errcode":0,"errmsg":"ok"}
由于微信服务器会缓存公众账号的自定义菜单,因此删除24小时后才能看到自定义菜单被删除了。如果要马上看到效果,要先取消关注,然后再重新关注。

4)自定义菜单事件:

微信中,用户触按菜单的操作是一个事件,微信将产生一个事件消息推送给公众账号服务器。
事件消息都是通过XML格式来封装的,类型为click的菜单按钮的事件消息的XML格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>
其中:
·ToUserName:开发者微信号
·FromUserName:发送方账号(OpenID)
·CreateTime:消息创建时间,整型
·MsgType:消息的类型,固定为event
·Event:具体的事件类型,固定为CLICK
·EventKey:事件的KEY值,与自定义菜单接口中key值对应
而类型为View的菜单按钮主要是链接到其他网址,事件消息的XML格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[VIEW]]></Event>
<EventKey><![CDATA[www.qq.com]]></EventKey>
</xml>
其中:
·Event:具体的事件类型,固定为VIEW
·EventKey:事件的KEY值,设置的跳转URL地址

5)自定义菜单的限制及错误码:

自定义菜单的三个接口每天的调用次数是有限制的,一般一次性设置好之后会很少改动:
获取凭证接口每天200次;自定义菜单创建接口每天100次;自定义菜单查询接口每天1000次;自定义菜单删除接口每天100次。当接口返回以下错误信息的时候,表示调用次数已经超过了限制:{"errcode":45009,"errmsg":"api freq out of limit"}
一般在返回凭证过期的错误码42001的时候更新凭证。
返回码说明:


返回码

说明

返回码

说明

-1

系统繁忙

0

请求成功

40001

验证失败

40002

不合法的凭证类型

40003

不合法的OpenID

40004

不合法的媒体文件类型

40005

不合法的文件类型

40006

不合法的文件大小

40007

不合法的媒体文件ID

40008

不合法的消息类型

40009

不合法的图片文件大小

40010

不合法的语音文件大小

40011

不合法的视频文件大小

40012

不合法的缩略图文件大小

40013

不合法的APPID

40014

不合法的access_token

40015

不合法的菜单类型

40016

不合法的按钮个数

40017

不合法的按钮个数

40018

不合法的按钮名字长度

40019

不合法的按钮KY长度

40020

不合法的按钮URL长度

40021

不合法的菜单版本号

40022

不合法的子菜单级数

40023

不合法的子菜单按钮个数

40024

不合法的子菜单按钮类型

40025

不合法的子菜单按钮名字长度

40026

不合法的子菜单KEY长度

40027

不合法的子菜单按钮URL长度

40028

不合法的自定义菜单使用用户

41001

缺少access_token参数

41002

缺少appid参数

41003

缺少refresh_token参数

41004

缺少secret参数

41005

缺少多媒体文件数据

41006

缺少media_id参数

41007

缺少子菜单数据

 

 

42001

access_token超时

43001

需要GET请求

43002

需要POST请求

43003

需要HTTPS请求

44001

多媒体文件为空

44002

POST的内容包为空

44003

图文消息内容为空

 

 

45001

多媒体文件大小超过限制

45002

消息内容超过限制

45003

标题字段超过限制

45004

描述字段超过限制

45005

链接字段超过限制

45006

图片链接字段超过限制

45007

语言播放时间超过限制

45008

图文消息超过限制

45009

接口调用超过限制

45010

创建菜单个数超过限制

46001

不存在媒体数据

46002

不存在的菜单版本

46003

不存在的菜单数据

 

 

47001

解析JSON/XML内容错误

 

 

14.收发语言和视频信息:

微信在公众账号中也提供了接收用户发来的语音视频,向用户发送语音视频的功能。

1)接收微信用户发来的语音:

微信将用户发送过来的语音信息封装为XML格式的数据:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[voice]></MsgType>
<MediaId><![CDATA[media_id]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>
其中:
·ToUserName:开发者微信号
·FromUserName:发送方账号(OpenID)
·CreateTime:消息创建时间,整型
·MsgType:消息的类型,语音消息为voice
·MediaId:语音消息的媒体id
·Format:语音的格式,描述语音消息中语音的格式(如amr、speex等)
·MsgId:消息id,为一个64位整型数据

2)发送语音给微信用户:

公众账号也可以发送语音消息给用户。公众账号可以提前录制多段语音文件,然后将这些语音文件上传到微信服务器,并获取相应的媒体id,最后将这些媒体id封装成相应的格式发送给用户,用户就可以听到相应的语音。
如果要发送语音消息给用户,也需要按规定的XML格式对语音进行封装:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[voice]></MsgType>
<Voice>
<MediaId><![CDATA[media_id]></MediaId>
</Voice>
</xml>
其中:
·MediaId:上传语音文件时得到的媒体id

3)接收微信用户发来的视频:

微信用户可以将手机中的已有视频或现场录制的视频发送给好友,同样也可以将视频发送给公众账号。公众账号接收到用户发送的视频消息,其实只是收到视频媒体id,然后可通过接口将视频下载到公众账号服务器。
视频消息也是通过XML格式进行封装的,格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[video]></MsgType>
<MediaId><![CDATA[media_id]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
其中:
·MsgType:消息的类型,视频消息为video
·MediaId:视频消息的媒体id,可以调用多媒体文件下载接口下载视频
·ThumbMediaId:视频消息缩略图的媒体id,可以调用多媒体文件下载接口下载缩略图
·MsgId:消息id,为一个64位整型数据

4)发送视频给微信用户:

公众账号也可以发送视频消息给用户。公众账号可以提前将视频文件上传到微信服务器,并获取相应的媒体id,最后将这些媒体id封装成相应的格式发送给用户,用户就可以看到相应的视频了。
如果要发送视频消息给用户,也需要按规定的XML格式对视频进行封装:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[voice]></MsgType>
<Video>
<MediaId><![CDATA[media_id]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
</Video>
</xml>
其中:
·MediaId:上传到微信服务器的媒体id
·ThumbMediaId:上传到微信服务器的缩略图的媒体id

5)使用微信的语音识别:

借助微信的语音识别功能,开发者只需要申请开通语音识别功能,就可以让手机听懂用户的语音。微信的语音识别功能只对认证服务号开放,在获得高级接口权限后,即可以通过一个开关打开语音识别功能。这需要登录到认证服务号的管理页面,在高级接口中开启语音识别功能。测试用户也有体验接口权限表,开启语音识别功能。
开启语音识别功能后,用户发送语音消息给公众账号,微信会首先将语音识别为文字,然后在推送的语音消息XML数据包中增加一个Recongnition字段,并将识别的文字放在该字段中。开启语音识别后的语音XML数据包格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[voice]></MsgType>
<MediaId><![CDATA[media_id]></MediaId>
<Format><![CDATA[Format]]></Format>
<Recongnition><![CDATA[腾讯微信团队]]></Recongnition>
<MsgId>1234567890123456</MsgId>
</xml>

15.使用扩展API:

API是应用程序编程接口Application Programming Interface的缩写,是指一些开发团队预先开发出的一些接口,使用者可以简单地调用这些接口去实现所希望达到的功能。
通过API,调用者无需访问实现功能的源码,也不需要理解内部工作机制的细节,只需要根据要求提供的参数,然后直接接收接口的处理结果即可。
互联网中,有很多公司提供了对外开放的API接口,开发者直接调用这些接口即可完成一些复杂的功能,而不需要自己再去编写复杂的代码。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659