第三课:客服消息
客服消息需要认证的公众号才能调用,没有认证的只能通过测试账号进行使用
公众号客服消息请参阅官网:
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 个小时刷新一次。
客服消息控制器
// /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
执行客服消息发送
// /routes/chatrobot.js // ... const customer = require('../controller/customer') // ... function messageController(req, res, next) { // ... msg['content'] = '答案正在准备中...' // 发送客服消息 customer(fromusername, '答案内容') // ... } // ...