开发流程
公众号基本配置(首先得有公众平台账号)
- 在开发菜单的基本配置中填写好基本配置项
- 首先配置服务器地址、Token、和消息加密密钥(地址为开发者为微信验证留的接口、token可以随便填写,只要在验证的时候填写一致即可、消息加密三种模式,为了方便开发环境下可使用明文模式。加密项的加密方式可查看微信开发文档消息加说明
- 在配置完后这是提交肯定会出现token验证错误(坑),因为你还没有写验证代码,这是你在自己的服务端开始写验证代码。
*微信会发送一个get请求携带四个参数,根据微信给出的规则进行加密然后验证,验证成功直接返回echostr
。详情可查看微信文档验证消息的确来自微信服务器 - 这些都完成之后皆可以进行开发了。当然如果要调用微信的一些接口是需要用到
access_token
的。具体回去access_token
的方式微信文档也讲得很清楚获取access_token。这次开发的功能是用户消息的接收和被动回复。不需要用到access_token,也不是特别复杂得多功能。主要记录一下这次开发中踩得各种坑
爬坑心路
首先是接收用户发送给供公众号,微信服务器再转发给开发者的
- 微信给开发者填写的
url
发送请求,除了公众号基本配置是使用的是get
请求,发送用户消息使用的是post
请求。所以使用开发的话,需要接收两种方式的请求get
和post
. - 微信发送的
post
请求会携带用户发送的消息。但是发送的是xml格式的数据包,所以这对于node开发者来说是不太友好的。一般nodejs
开发接收post
请求会使用到body-parser
这个包,但是他不支持接收xml格式的数据,所以直接在req
的body
中是找不到微信发送的数据的,这就必须要自己进行转化了。 //使用req的事件来读取发送的请求信息
req.rawBody = ''// 给req添加一个rawBody属性
req.on('data', (chunk) => {
req.rawBody += chunk;// 将数据保存到req.rawBody中
}) req.on('end', () => { })- 在请求结束后,使用
xml2js
这个包对xml数据进行处理,将xml数据转换成json数据 req.on('end', () => {
//在这里使用xml2js对xml数据进行处理,获取用户发送的信息,然后回复用户信息
})
进行用户信息回复
微信服务器在请求五秒之内没有回复的话,回发起第二次第三次请求。三次都没有响应回给用户报错,所以如果无法再五秒之内回复的话,可以直接回复成功,或者一个空的字符串''.
消息回复最重要的就是回复消息的格式,一定要按微信给出的消息回复的格式来进行回复,不然也会报错,可以参考被动回复用户消息.
注意:如果复制微信给出的消息模板一定要去掉其中的空格,因为不符合xml数据的格式,所以也会报错
<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml>
比如!和<之间的空格和两个] ]中间的空格一定要去掉。
还有在回复的时候会有
ToUserName
和FromUserName
两个参数,分别代表要将消息发送给谁(用户的openID),和消息的发送者(开发者公众号微信号).由于接受的微信的xml数据包这两个参数代表是反的ToUserName
和FromUserName
分别是使用户openID和开发者微信。所以一定不要弄反了。