本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
最近想玩一玩微信的开发,就想着从公众号与小程序入手,租了个服务器,本文主要介绍如何使用nodejs开发公众号,包括字典码排序sha1加密代码服务器配置代码,并举例自定义的自动回复如何实现。
公众号申请
申请页面(个人只能申请订阅号):微信公众平台。
申请后可以发现已经可以在这里设置菜单和一些自动回复内容了,但是我们想要更丰富的内容互动,就得自己开发处理才行。
配置服务器信息
-
要想要自己开发内容,可能需要自己的服务器,云服务器租一个。
-
申请成功后,基础信息自己填写好,找到左侧
设置与开发下的基本配置。
-
url填入自己的服务器地址,只能使用80端口,当然你可以用nginx通过请求名转发到其他端口去,/gzh是我设置的请求名,你也可以自行设置。 -
token也设置为自己想要的,这个在请求加密验证时需要用到。 -
下面的那个加密码随机生成就行。
编写服务端代码
导包
- 创建好nodejs项目,把我们需要的几个包先安装好。
npm i express sha1 xml2js -S
加密代码
-
/gzh是我设置的请求名,你也可以自行设置。 -
编写
get请求作为验证加密请求。 -
token与在配置服务器信息时填写的保持一致。 -
将
nonce, timestamp, token字典排序然后合成字符串再用sha1加密,与signature对比,一样则返回echostr即可。 -
写完启动该js服务。
import express from 'express'
const app = new express()
app.use(express.json())
import sha1 from 'sha1'
// /gzh是我设置的请求名,你也可以自行设置
app.get('/gzh', (req, res) => {
res.set('Access-Control-Allow-Origin', '*')
const { echostr = '', timestamp = '', nonce = '', signature } = req.query
console.log(req.query, req.body)
const token = '你设置的token'
const sortStr = [nonce, timestamp, token].sort().join('')
const sha1Str = sha1(sortStr)
if (sha1Str === signature) {
res.send(echostr)
} else {
console.log('error')
}
})
app.listen(80, () => {
console.log('服务器启动')
})
提交
- 启动服务完,去配置页面提交,成功则可以启用了。
设置自动回复信息
-
完成了上面的步骤之后,所有公众号的配置都要手动进行了。
-
比如给用户消息的自动回复,用户发送消息时会自动调用配置好的服务器
post请求,发送规定的xml内容,详见微信官方文档-接收普通消息,我们在原来的编写的nodejs上加上接收该请求的内容。 -
xml2js用来格式化传来的xml数据,变成我们比较好使用的数据。 -
我创建一个sendMsg方法用来定义返回信息模板,因为这xml太冗长了。
-
通过
MsgType判断用户发来的什么类型信息,这里text就是普通的字符串消息,然后我们可以利用判断Content来决定我们返回的内容,比如当用户发来hello时回复world。注意这些值其实返回的是包含一个字符串的数组,因此我用的是==号,如果你想使用===可能得需要用MsgType[0]和Content[0]来比较。 -
注意,第三方开发公众号回复理论只能被动回复一条,要想回复多条只能被动回复一条之后额外调用客服消息接口,虽然很蠢但是只能这样。
import xml2js from 'xml2js'
const xmlParse = xml2js.parseString
const sendMsg = (xml, msg) => {
const { ToUserName, FromUserName } = xml
return `
<xml>
<ToUserName><![CDATA[${FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${ToUserName}]]></FromUserName>
<CreateTime>${new Date().getTime()}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[${msg}]]></Content>
</xml>
`
}
app.post('/gzh', (req, res) => {
let data = ''
req.on('data', (chunk) => {
data += chunk
})
req.on('end', () => {
xmlParse(data, (err, { xml }) => {
const { ToUserName, FromUserName, CreateTime, MsgType, Content, MsgId } =
xml
if (MsgType == 'text') {
if (Content == 'hello') {
const responseMSg = 'world'
res.send(sendMsg(xml, responseMSg))
}
}
})
})
})
获取开发token
-
我们还需要很多可以定义小程序内容的接口,访问这些接口都需要
access_token。 -
首先我们需要到公众号的基本配置界面,公众号开发信息,获取
AppSecret,这里还有AppID信息。 -
然后访问以下接口。
-
你会发现访问出错,没关系,会返回一个json,里面会有你的
ip信息。 -
把你的ip加进公众号开发信息的白名单再访问一次,就成功获得
access_token。
尾言
本来想多写点内容,结果发现个人公众号无法认证,连自定义菜单都不能用,就到这叭,将来有机会补上。
如果觉得文章还不错的话,欢迎点赞收藏哦,有什么错误或者意见建议也可以留言,感谢~