美文网首页
微信公众平台开发简要说明 —— 基本原理

微信公众平台开发简要说明 —— 基本原理

作者: 邪恶的Sheldon | 来源:发表于2015-12-15 13:52 被阅读0次

这两个月里,公司的项目基本上都基于微信公众平台的开发上。为了可以快速开发,我使用了 Ruby on Rails框架,而不是之前的 Python,这不是说 Python 不可以做到快速开发,其实我更多只是想试试新的东西。但效果不错。

微信公众平台的开发,与语言没什么太大的关系,大家只要选择自己熟悉的语言即可,以下我只说明大概的原理,并用 Ruby on Rails 作为代码示例。

准备工作

首先,你需要有一个微信公众号,比如 ”SheldonChen写字的地方"。在往下继续阅读前,请自觉掏出手机,打开微信扫一扫:

my_wechat_platform.jpg

其次,你需要有一个独立域名的网站,用来和微信服务器交互。

接入公众平台

登录微信公众平台后台后,点“功能”-“高级功能”-“开发模式”,进入开发模式,如果公众平台显示“尚未成为
开发者”,就点击“成为开发者”:

become_developer.png

同意协议后,填写URL和Token:

url_and_token.png

URL是指微信服务器向哪个URL发送消息,假设我们自己的服务器域名是www.example.com,准备用/weixin来接收消息,就填写:

http://www.example.com/weixin

而Token是微信服务器和我们自己的服务器通信时验证身份用的,可以随便填写,但要注意保密。

然后点“提交”,一般来说会报错“URL超时”或者“没有正确返回echostr”,因为我们的后台还没有准备好,所以,第一步是接收微信后台发送的验证消息,微信后台会发送一个GET请求到上面的URL,并附带以下参数:

signature,timestamp,nonce,echostr

我们的服务器在接收到上述参数后,需要验证signature是否正确,验证方法是先对timestamp、nonce和token先排序,再拼接成一个字符串,计算出sha1,并和signature对比。

注意token不是微信服务器发过来的,而是我们自己写死的一个常量,就是在微信后台填写的Token。

如果计算的sha1和微信传过来的signature相等,说明这个请求确实是微信后台发过来的,如果是别人伪造的请求,由于他不知道token,所以,无法计算出正确的signature。

要防止第三方通过监听发动replay攻击,还需要验证timestamp和nonce,这个以后再讨论。

如果signature计算无误,就把微信后台传过来的echostr原封不动地传回去,这样,就可以通过验证,成为开发者。

在确保开发模式打开的情况下,微信后台会把用户消息发到我们的服务器上,也就是URL:http://www.example.com/weixin

develop_mode.png

微信后台发送消息是一个POST请求,但和普通的POST请求不同的是,首先,URL会带上signature、timestamp、nonce这3个参数:

POST http://www.example.com/weixin?signature=xxx&timestamp=123456&nonce=123

然后,HTTP请求的BODY是一个不规范的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>

我们自己的服务器只需要处理该XML,然后,向微信返回一个类似如下的XML:

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
</xml>

就可以完成消息的回复。微信后台要求必须在5秒内回复,最多重试3次,否则我们自己的回复消息就到达不了用户的手机了。如果我们自己的服务器无法在5秒内回复,就回复一个空字符串,告诉微信服务器,不用重试了,这个消息处理不了,不给用户回复了。

上面的交互逻辑看起来很简单,但实际上坑有很多。

首先,微信服务器发送的POST请求根本就不符合HTTP规范。原则上POST请求不应该在URL上附带参数,但微信后台偏偏要这么干,这就让很多编程语言的标准框架无法获取到POST参数,因为标准的POST参数是从HTTP BODY中解析的。

所以,从POST获取URL参数就需要用到更底层的代码。

相关文章

  • 微信公众平台开发简要说明 —— 基本原理

    这两个月里,公司的项目基本上都基于微信公众平台的开发上。为了可以快速开发,我使用了 Ruby on Rails框架...

  • 微信公众号开发原理

    微信开发,是指“微信公众号”开发。是使用微信公众平台开发者文档的说明,调用数据接口完成。 原理就是,用...

  • 微信开发者

    官网 微信开放平台微信公众平台微信云 微信开发者大本营吧微信开发吧 学习 方倍工作室 微信公众平台开发入门教程_新...

  • 小程序个人总结最佳实践

    一、开发环境 1.成为微信公众平台开发者 成为微信公众平台的开发者,是小程序开发的首要条件。只有成为微信公众平台的...

  • 公众号开发笔记一

    前言 微信公众平台开发: 微信公众平台是提供资讯和服务的平台,其中公众平台开发的接口是提供服务的基础. 在公众平台...

  • 微信小程序开发实战教程(1)--持续更新

    1.成为微信公众平台开发者 成为微信公众平台的开发者,是小程序开发的首要条件。只有成为微信公众平台的开发者,才可以...

  • 01微信公众平台之开发中心

    1.微信公众平台的开发中心 微信公众平台的开发中心 在微信公众平台-开发-服务器配置,设置好服务器地址等配置信息,...

  • 常见问题

    为了帮助开发者快速熟悉微信公众号开发,我们推出了微信公众平台开发者问答系统。 进入微信公众平台开发者问答系统

  • 微信公众平台

    开发文档 微信公众平台测试号申请 微信公众平台接口调试工具

  • 关于微信二次分享,描述变链接的解决方法(一)【转载】

    一、微信JS-SDK说明文档 1.概述 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具...

网友评论

      本文标题:微信公众平台开发简要说明 —— 基本原理

      本文链接:https://www.haomeiwen.com/subject/xowttttx.html