微信公众平台通信过程

做为开发者,咱们须要面对的主要有两个对象:微信服务器和应用程序(网站)服务器。html

    当微信用户向你的公众平台发送一条消息,实际上这条消息首先发送到微信服务器,由微信服务器向网站服务器发起另一个请求,网站服务器返回这个请求的结果,再由微信服务器发送到微信客户端。node

    整个消息通信流程以下图:服务器

    

    上述5个步骤中,做为开发者咱们主要精力都集中在步骤3上,这个步骤主实际上要有3项任务:微信

  1. 接收来自2的XML信息
  2. 服务器内部逻辑执行
  3. 组织并返回用于4的XML信息

    上述三项任务我会在后面作详细说明,并提供一整套简单、高效的处理方法。学习

2、XML通信格式

    用户使用微信客户端发送的不一样类型的消息,网站服务器会收到不一样格式的数据(文字、语音、图片等等),数据格式暂时只有XML一种。测试

    做为学习,我以为只要熟练掌握最简单的文字类型就能够了,其余的格式都是大同小异。且在后面的说明中你会发现,Senparc.Weixin.MP.dll能够帮助咱们彻底忽略这些繁琐的格式和定义。网站

    一个简单的文字请求XML(RequestMessage)内容以下:spa

[html]  view plain  copy
 
  1. <xml>  
  2.     <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>  
  3.     <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>  
  4.     <CreateTime>1357986928</CreateTime>  
  5.     <MsgType><![CDATA[text]]></MsgType>  
  6.     <Content><![CDATA[TNT2]]></Content>  
  7.     <MsgId>5832509444155992350</MsgId>  
  8. </xml>  

  对应节点的官方说明以下:.net

参数 描述
ToUserName 开发者微信号
FromUserName 发送方账号(一个OpenID)
CreateTime 消息建立时间 (整型)
MsgType text
Content 文本消息内容
MsgId 消息id,64位整型

    

 

 

 

 

 

    一个简单的文字返回XML(ResponseMessage)内容以下:xml

[html]  view plain  copy
 
  1. <xml>  
  2.    <ToUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></ToUserName>  
  3.    <FromUserName><![CDATA[gh_a96a4a619366]]></FromUserName>  
  4.    <CreateTime>12345678</CreateTime>  
  5.    <MsgType><![CDATA[text]]></MsgType>  
  6.    <Content><![CDATA[content]]></Content>  
  7.    <FuncFlag>0</FuncFlag>  
  8. </xml>  

  对应节点的官方说明以下:

参数 描述
ToUserName 接收方账号(收到的OpenID)
FromUserName 开发者微信号
CreateTime 消息建立时间
MsgType text
Content 回复的消息内容,长度不超过2048字节
FuncFlag 位0x0001被标志时,星标刚收到的消息。

 

 

 

 

 

 

3、一些须要注意和容易被忽视的问题:

  1. 每条XML信息都有大小限制,如文本信息,建议Content内容不要超过600字。
  2. 上图中,步骤2开始以后,微信服务器有一个等待时间:5秒,若是在这个时间内没有进行到步骤4,那么这个请求将会被关闭(包括数据传输的时间)。也就是说若是超过期间,即便网站服务器返回了数据,客户端也没法收到回复。
  3. 在文本消息中,是容许添加<a>标签来放置链接的,可是有许多朋友测试以后发现iOS没问题,Android上连接没法点击,其实缘由是(至少目前为止):Android的微信客户端对<a>标签格式的断定比较严格,请严格按照这个格式书写:<a href="http://xxxx">内容</a>,href后不要使用单引号,也不要添加其余属性。
  4. 上面XML节点中的FromUserName即微信用户的OpenId,对于同一个公众帐号,这个OpenId的前6位是一致的,而且在整个公众平台的记录中也是惟一的。也就是说同一个用户关注了两个不一样的公众帐号,他会有两个不一样的OpenId。
  5. CreateTime使用的是Unix时间,所以若是使用C#的话,须要作一个转换。
  6. 尽可能保持官方API中XML节点的顺序,之前微信服务器是使用节点位置的方式读取信息的(node[0]),而非节点名称,如今这个问题彷佛有好转,不过仍是要当心(¥…………&%&……)。
  7. 因为这种特殊的通信方式,(至少目前为止)全部请求必须从客户端先发起,不要期望光使用API或SDK能够实现由网站服务器主动推送消息到客户端(固然其余办法仍是有的,好比模拟登录)。
相关文章
相关标签/搜索