手把手做一个公众号GPT智能客服(三)客服消息

2023-09-28 08:38:10 浏览数 (1)

第三课:客服消息

客服消息需要认证的公众号才能调用,没有认证的只能通过测试账号进行使用

公众号客服消息请参阅官网:

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, '答案内容')

  // ...
}

// ...

0 人点赞