第三课:客服消息
客服消息需要认证的公众号才能调用,没有认证的只能通过测试账号进行使用
公众号客服消息请参阅官网:
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
access_token 每日调用上限/次 2000,最佳实践是在本地存储起来,每 2 个小时刷新一次。
客服消息控制器
代码语言:javascript复制// /controller/customer.js
const axios = require('axios')
const fs = require('fs')
// 从测试号中获取内容
const APPID = 'wx980547b6de8f7c1e'
const APPSECRET = '73d73fea3b46f8e57617b5a6b28d8b8b'
async function genAccessToken() {
// 获取access_token
const result = await axios.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`)
// 将 token 和 创建时间写入文件
const { access_token } = result.data
const data = {
access_token,
create_time: new Date().getTime()
}
fs.writeFileSync('./data/access_token.json', JSON.stringify(data))
return access_token
}
async function getAccessToken() {
// 读取文件中的信息
const json = fs.readFileSync('./data/access_token.json', 'utf8')
const { access_token, create_time } = JSON.parse(json || "{}")
// 判断token是否过期,未过期即返回原token
const now = new Date().getTime()
if (access_token && now - create_time <= 7000 * 1000) {
return access_token
}
// 如果token不存在或者超时, 获取最新的token
const token = await genAccessToken()
return token
}
async function customerController(touser, content) {
// 获取 token
const ACCESS_TOKEN = await getAccessToken()
// 客服信息 url
const url = `https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${ACCESS_TOKEN}`
// 消息定义
const message = {
touser,
msgtype: "text",
text: {
content
}
}
// 客服接口-发消息
await axios.post(url, message)
}
module.exports = customerController
执行客服消息发送
代码语言:javascript复制// /routes/chatrobot.js
// ...
const customer = require('../controller/customer')
// ...
function messageController(req, res, next) {
// ...
msg['content'] = '答案正在准备中...'
// 发送客服消息
customer(fromusername, '答案内容')
// ...
}
// ...