开发者模式如何开启客服功能?

2022-09-29  本文已影响0人  姜治宇

公众号的开发者模式和编辑模式是互斥的,二者只能选其一。
一旦我们开启了开发者模式,比如自定义菜单,消息自动回复等功能都是无法使用的,需要在服务端写接口支持。
我们首先需要开启服务端的支持,在设置与开发->基本配置里面,把服务器地址配置一下。这里就写一个路由地址就可以。

1.png
以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>`;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读