一、自动回复和自定义菜单在启用服务器配置前后的区别
- 未开启服务器配置情况下,可以在微信公众平台直接去编辑;
2. 开启服务器配置情况下,无法在微信公众平台去直接编辑,能够通过接口去编辑。
二、开启服务端配置
进入到设置与开发 -> 基本配置 -> 服务器配置,直接点击启用去开启服务端配置。
第一次开启的时候,需要修改配置,点击页面上的修改配置按钮,进入如下页面修改配置。
需要配置URL和Token两个值,EncodingAESKey随机生成,消息加解密方式选择明文模式。更多内容可参考官方文档。
Token可任意填写,URL需要填写服务器地址,也可以加上路径,比如:
http://lwwztest.cn
或者
http://lwwztest.cn/wx
URL填写完成后,这时候提交会出现token验证失败的错误提示,原因是对应的服务还没有启动
三、服务端如何配置
这里使用nodejs、koa实现
假设填写的URL为http://lwwztest.cn/wx,当我们点击提交的时候,服务端会收到一个请求为http://lwwztest.cn/wx
const Koa = require('koa')
const APP_PORT = 3009
const app = new Koa()
app.use(async (ctx) => {
const echostr = ctx.query.echostr
// 将接收到的echostr返回,即可提交成功
ctx.body = echostr
})
app.listen(APP_PORT, () => {
console.log(`server in running on: http://localhost:${APP_PORT}`)
})
启动上面的服务,运行在端口3009上
nginx配置如下:
location /wx {
proxy_pass http://localhost:3009;
}
如果使用的是 http://lwwztest.cn,按下面配置即可
location / {
proxy_pass http://localhost:3009;
}
四、服务端配置启动成功,如何设置消息回复
const Koa = require('koa')
const bodyParser = require('koa-bodyparser')
const xmlParser = require('koa-xml-body')
const { subscribe: subscribeEvent, unsubscribe: unsubscribeEvent } = require('./constroller/event.js')
const { send: sendMessage } = require('./constroller/message.js')
const APP_PORT = 3009
const app = new Koa()
// 解析xml参数,可以将xml转换成对象形式
app.use(xmlParser())
app.use(bodyParser())
// 所有的消息,事件都会经过这里
app.use(async (ctx) => {
// 根据传递的参数判断类型,具体可参考官方文档
const body = ctx.request.body
const echostr = ctx.query.echostr
// ctx.body = echostr
const data = body.xml
const MsgType = data.MsgType
const Event = data.Event
// 事件消息
if (MsgType[0] === 'event') {
// 订阅
if (Event[0] === 'subscribe') {
// 这里可以处理在用户关注公众号的时候,发送问候消息
await subscribeEvent(ctx, data) // 方法见后面代码subscribe
}
// 取消订阅
if (Event[0] === 'unsubscribe') {
await unsubscribeEvent(ctx, data)
}
}
// 文本消息
if (MsgType[0] === 'text') {
// sendMessage(ctx, data)
ctx.body = ''
}
})
app.listen(APP_PORT, () => {
console.log(`server in running on: http://localhost:${APP_PORT}`)
})
// 部分代码已省略
/**
* 订阅事件
*/
async subscribe(ctx, data) {
const bodyMsg = `
<xml>
<ToUserName><![CDATA[${data.FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${data.ToUserName}]]></FromUserName>
<CreateTime>${parseInt(new Date().valueOf() / 1000)}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[${data.Content}]]></Content>
</xml>
`
// 给用户发送文字消息需要拼成上面的xml,格式官方文档都有
// 需要注意的是ToUserName和FromUserName,这里是从参数中拿的,所以在发送给用户需要将二者反转
ctx.body = bodyMsg
}
五、自定义菜单
需要两个接口(官方接口),这里与服务端配置无关
1、获取token GET
| key | value |
|---|---|
| url | https://api.weixin.qq.com/cgi-bin/token |
| grant_type | client_credential |
| appid | appid |
| secret | secret |
2、自定义菜单POST
| key | value |
|---|---|
| url | https://api.weixin.qq.com/cgi-bin/menu/create |
| access_token | 第一步取得的token |
post参数格式如下 |
// button最长长度是3
{
"button": [
{
"type":"view",
"name":"公司简介",
"url":"xxx"
},
{
"name": "一级菜单1",
"sub_button": [
{
"type": "view",
"name": "二级菜单1",
"url": "xxx"
},
{
"type": "view",
"name": "二级菜单2",
"url": "xxx"
},
{
"type": "view",
"name": "二级菜单3",
"url": "xxx"
}
]
},
{
"name": "一级菜单2",
"sub_button": [
{
"type": "view",
"name": "二级菜单1",
"url": "xxx"
},
{
"type": "view",
"name": "二级菜单2",
"url": "xxx"
},
{
"type": "view",
"name": "二级菜单3",
"url": "xxx"
},
{
"type": "view",
"name": "二级菜单4",
"url": "xxx"
}
]
}
]
}