微信公众号启动服务端配置

1,127 阅读2分钟

一、自动回复和自定义菜单在启用服务器配置前后的区别

  1. 未开启服务器配置情况下,可以在微信公众平台直接去编辑;

image.png

image.png 2. 开启服务器配置情况下,无法在微信公众平台去直接编辑,能够通过接口去编辑。 image.png

image.png

二、开启服务端配置

进入到设置与开发 -> 基本配置 -> 服务器配置,直接点击启用去开启服务端配置。

image.png

第一次开启的时候,需要修改配置,点击页面上的修改配置按钮,进入如下页面修改配置。 image.png

需要配置URLToken两个值,EncodingAESKey随机生成,消息加解密方式选择明文模式。更多内容可参考官方文档。

image.png

Token可任意填写,URL需要填写服务器地址,也可以加上路径,比如:

http://lwwztest.cn
或者
http://lwwztest.cn/wx

URL填写完成后,这时候提交会出现token验证失败的错误提示,原因是对应的服务还没有启动

image.png

三、服务端如何配置

这里使用nodejs、koa实现

假设填写的URLhttp://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

keyvalue
urlhttps://api.weixin.qq.com/cgi-bin/token
grant_typeclient_credential
appidappid
secretsecret

2、自定义菜单POST

keyvalue
urlhttps://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"
                }
            ]
        }
    ]
}