微信小程式客服自動回覆訊息功能採坑(完)

adherent發表於2019-03-04

小程式接入客服,我們就需要呼叫微信客服功能。很簡單,只需要在頁面中使用 <button open-type="contact" /> 可以顯示進入客服會話按鈕。 然後我們就能登入網頁版的微信公眾平臺的客服頁面進去回覆各種千奇百怪的問題了。 但是有個問題,我們如何做到自動回覆呢? 那麼就需要通過自己的伺服器去通過微信端請求服務,完成這項工作。 接入指引 · 小程式附上官網接入指南,這可是相當的簡潔。

First

填寫伺服器配置的圖:

微信小程式客服自動回覆訊息功能採坑(完)
<!—more—> 在這裡填寫的同時我們需要在後臺寫get請求驗證。 官方提供了一個非常簡潔的一個php程式碼。。那是相當的坑爹啊。 這裡我是用express寫得提供一個例子

function checkSignature(params) {
    var key = [params.token, params.timestamp, params.nonce].sort().join('');
    var sha1 = crypto.createHash('sha1');
    sha1.update(key);
    return sha1.digest('hex') === params.signature;
  }
app.get('/wxlalalala', function(req, res, next) {
    let token = 'xxxxx'; // 填寫伺服器配置上所填的token
    let isCheck = checkSignature({
      signature: req.query.signature,
      timestamp: req.query.timestamp,
      nonce: req.query.nonce,
      token: token,
    });
    req.body = req.query.echostr;
    res.send(req.body);
    return req.body;
  });
複製程式碼

然後我們就完成了最關鍵的一步。之後就可以去寫,客戶發了什麼我們就自動回啥的邏輯。

Second

當我們去接受客戶發的訊息和事件,我們都需要去通過一個post去接受。 當然第一我們需要先去拿access_token。沒有這個我們啥事情都做不了。 給上一個官方網站: 介面呼叫憑證 · 小程式,但是毫無程式碼示例,算了還在自己擼吧。 以下自己的code:

let access_token = '';

  const getAccessToken = function() {
    if (access_token !== '') {
      return access_token;
    }
    let URL =
      'https://api.weixin.qq.com/cgi-bin/token?grant_type= client_credential&appid=xxxx&secret=sssss'; // grant_type一定要填client_credential.
    let options = {
      method: 'GET',
      url: URL,
    };
    return new Promise((resolve, reject) => {
      request(options, function(err, res, body) {
        if (res) {
          access_token = JSON.parse(body).access_token;
          let expires_in = parseInt(JSON.parse(body).expires_in) - 10;
          setTimeout(() => {
            access_token = '';
            //getAccessToken();
          }, expires_in * 1000);
          resolve(access_token);
        } else {
          reject(err);
        }
      });
    });
  };
複製程式碼

因為token有7200s的過期時間,所以就存在記憶體裡了。 Ok這個我們就有access_token能去做客服自動回覆啦!

Third

再來一個官方客服傳送訊息的文件: 傳送客服訊息 · 小程式,發現又是啥都沒用。。。 還是自己動手寫一個吧。。畢竟那麼精瘦的文件。。T T.那就寫一個回覆文字訊息的吧!其他的類似自己擴充套件。

  const postJson = function(param) {
    var options = {
      url: param.url,
      method: 'POST',
      body: param.body,
      json: true,
    };
    request(options, function callback(error, response, data) {
      if (!error && response.statusCode == 200) {
        param.success(response.errcode);
      } else {
        param.error(error);
      }
    });
  };

  async function sendTextMessage(content, data, access_token) {
    await postJson({
      url:
        'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=' +
        access_token,
      body: {
        touser: data.FromUserName,
        msgtype: 'text',
        text: {
          content: content,
        },
      },
      success: function(res) {
        console.log(res, 'send successed!1');
      },
      error: function(err) {
        console.log(err);
      },
    });
  }
複製程式碼

Last

回覆的函式也寫好了,來到最後根據客戶發來的訊息我們作為智慧客服去回訊息啦!不多說直接上code。文件。。。就算了只能看看引數啥的。。哎 客服訊息 · 小程式

app.post('/wxlalallala', (req, res, next) => {
    let token = 'xxxxx';// 填寫伺服器配置那的token
    let reqBody = req.body;
    let isCheck = checkSignature({
      signature: req.query.signature,
      timestamp: req.query.timestamp,
      nonce: req.query.nonce,
      token: token,
    });
    if (isCheck) {
      let welcome= '歡迎';
         switch (reqBody.MsgType) {
        case 'text': {
          //文字訊息
          sendTextMessage('您好,【'+reqBody.Content+'】是未知命令,已轉發給人工處理。\n'+welcomeTips, reqBody, getAccessToken());
          break;
        }
        case 'image': {
          //使用者在客服會話中傳送圖片訊息
          sendImageMessage('xxxxxxx', reqBody, getAccessToken());
          break;
        }
        case 'event': {
            sendTextMessage(welcome, reqBody, getAccessToken());
          break;
        }
        default:
          break;
      }
    }
    res.send('success');
    next();
    res.end();
  });
複製程式碼

完成啦愉快的使用自動客服回覆!!

相關文章