公众号的开发者模式和编辑模式是互斥的,二者只能选其一。
一旦我们开启了开发者模式,比如自定义菜单,消息自动回复等功能都是无法使用的,需要在服务端写接口支持。
我们首先需要开启服务端的支持,在设置与开发->基本配置里面,把服务器地址配置一下。这里就写一个路由地址就可以。
以node框架nestjs为例,比如我配置了http://xxx.com/auth/weServiceAuth,相应的就写一个控制器就行。
下面我们看一下文档。 2.png
好多人看到这样的文档都一脸懵逼,不知道如何使用。其实很简单,他的意思就是把这段xml发送出去就可以了。直接上代码:
import { Controller, Request, Post, Res, Req } from '@nestjs/common';
import { Response } from 'express';
const getRawBody = require('raw-body');
const contentType = require('content-type');
@Controller('auth')
export class AuthController {
constructor() { }
@Post('weServiceAuth')
async weServiceAuth(@Res() res: Response, @Req() req: Request) {
// 返回给微信的信息是application/xml格式
res.writeHead(200, { 'Content-Type': 'application/xml' });
// 拿到全局ACCESS_TOKEN
const ACCESS_TOKEN = await this.weServiceTOKEN();
const data = getRawBody(req, {
length: req.headers['content-length'],
limit: '10mb',
encoding: contentType.parse(req).parameters.charset
}, async (err, buf) => {
const message = await this.formatMessage(buf.toString());//从微信接收的消息
console.log('message', message);
if (message.MsgType.toLowerCase() === 'event') { //事件类型
//比如扫码登录类型事件
if (message.Event.toLowerCase() === 'scan') {
//鉴权后,回复用户登录成功
const msg = {
FromUserName: message.FromUserName,
ToUserName: message.ToUserName,
reply: '登录成功'
};
let replyXml = this.textWXMsg(msg);
res.end(replyXml);
} else if (message.Event.toLowerCase() === 'subscribe') {
//订阅公众号类型事件
const msg = {
FromUserName: message.FromUserName,
ToUserName: message.ToUserName,
reply: '肥肠感谢您的关注'
};
let replyXml = this.textWXMsg(msg);
res.end(replyXml);
}
} else {
//其他行为统统转到客服
let result = {
FromUserName: message.FromUserName,
ToUserName: message.ToUserName
};
const replyXml = this.toCustomer(result);
res.end(replyXml);
}
});
}
// 回复消息,xml格式
textWXMsg(message) {
const createTime = parseInt(new Date().getTime() / 1000);
return `<xml>
<ToUserName><![CDATA[${message.FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${message.ToUserName}]]></FromUserName>
<CreateTime>${createTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[${message.reply}]]></Content>
</xml>`
}
//客服消息,xml格式
toCustomer(message) {
const createTime = parseInt(new Date().getTime() / 1000);
return `<xml>
<ToUserName><![CDATA[${message.FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${message.ToUserName}]]></FromUserName>
<CreateTime>${createTime}</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>`;
}
}
网友评论