unicloud云函数开发微信客服消息自动回复图片消息(完整步骤)

简介: unicloud云函数开发微信客服消息自动回复图片消息(完整步骤)

H_R``E68`3R~M9$U1CM{Y7C.png


最近跟着大帅搞得小程序开通流量主之后,想着给公众号引流一下,就要从小程序能够去关注公众号咯。但是小程序的机制大家懂的,不能直接跳转到公众号哦,那就只能找客服回复一个二维码图片咯!!!


配置一下


unicloud配置


  1. 先在项目uniCloud下面的云函数文件夹中右键添加云函数


7(2QH~}@DDJ%JC]5Z$D@9_I.png


  1. 在弹出层中新建一个名称为 contact 的云函数(名称随便取都行)


9AP8}7$E58{)YP%J9)0BK%7.png


  1. 创建好之后,在contact云函数文件夹上右键上传云函数


GW6QXRSYXM)K208EUD9MH_R.png


  1. 云函数代码如下:


JK44SYG@@UGC(~8CH5VLV48.png


  1. 暂时不写云函数代码,先去unicloud后台配置小程序需要的URL数据


NO6(1{NGP[1S@](JY3`](UV.png


  1. 在右侧目录找到云函数 - 函数列表之后,找到contact云函数,点击详情按钮


5YOP~DA}21`({S~HA}NW1IK.png


  1. 找到云函数URL化模块,点击编辑


NRW$[M{M97{[18AGZ}9@2O0.png


  1. 在输入框中输入 /contact注意:此处必须用/开头,名称可以随便取


SXE5V%T_XR1_QNT_}DGMRTD.png


  1. 点击确定之后,在点击PATH后面的复制路径按钮


此时,uniCloud配置完成,下面开始配置小程序


小程序配置


  1. 微信公众平台登录自己的小程序账号


  1. 在左侧菜单栏找到开发 - 开发管理


EEUTO}ZZKHEI0)JLWE(F_3M.png


  1. 进入开发管理之后切换tab到开发设置


2RD(52]((AE%O$B{K116(W4.png


  1. 找到消息推送,点击启用


A[L_Q){MKO0A7DPI1K]`1LL.png


  1. 跳转到消息推送配置页面之后,按照图片方式进行配置


@SPS[{M%Z)95~FJCVZWH[~6.png


此时点击提交,会提示你Token校验失败,请检查确认,不要慌,只是云函数里面没有写而已。这个时候就可以去写云函数的代码了~~


开始写云函数


如果对消息来源要求不高,或者不考虑安全性,可以直接在云函数中返回 event.queryStringParameters.echostr


云函数代码如下:


'use strict';
exports.main = async (event, context) => {
  //event为客户端上传的参数
  console.log('event : ', event)
  //返回数据给客户端
  return event.queryStringParameters.echostr;
};
复制代码


校验安全性也很简单的


LLUOLQVRDS%KLQH%X78SLF3.png


1. 将token、timestamp、nonce三个参数进行字典序排序


2. 将三个参数字符串拼接成一个字符串进行sha1加密


3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信


云函数代码如下:


'use strict';
//npm install sha1
const sha1 = require("sha1");
const token = "123qweASD";
function verifyMSGSender(params){
  const mysignature = sha1([token,params.timestamp,params.nonce].sort().join(""));
  console.log(mysignature===params.signature?"校验通过":"校验失败");
  if(mysignature===params.signature)return true;
  else return false;
}
exports.main = async (event, context) => {
  //event为客户端上传的参数
  if(!verifyMSGSender(event.queryStringParameters))return "来源校验失败";
  //校验通过后,下面这行返回echostr的代码注释掉
  else return event.queryStringParameters.echostr;
  //返回数据给客户端
  return;
};
复制代码


注意:token需要和消息配置页面的token保持一致哦~ 此时就可以去消息配置里面点击保存按钮啦!!!


配置完成后是这样的


RBCRO4G1Y(3_(%A[A6L@(UT.png


校验通过之后,代码里面的 echostr 代码就可以注释掉了


//校验通过后,下面这行返回echostr的代码注释掉
else return event.queryStringParameters.echostr;
复制代码


此时给客服发消息之后,在云函数日志里面可以看到返回结果了


KBL{0_NY~2AL)1{MK1I6SUO.png


但是这个结果是一个字符串的,我们需要把字符串转为json格式


// 解析json格式字符串
const receiveMsg = JSON.parse(event.body);
复制代码

数据包返回格式


根据用户发送的消息,会有以下格式


{// 文本消息返回数据包
  "ToUserName": "toUser",
  "FromUserName": "fromUser",//客服消息发起者的openid
  "CreateTime": 1482048670,
  "MsgType": "text",//该条消息类型
  "Content": "this is a test",
  "MsgId": 1234567890123456
}
复制代码


{// 图片消息返回数据包
  "ToUserName": "toUser",
  "FromUserName": "fromUser",//客服消息发起者的openid
  "CreateTime": 1482048670,
  "MsgType": "image",//该条消息类型
  "PicUrl": "this is a url",
  "MediaId": "media_id",//微信媒体资源id
  "MsgId": 1234567890123456
}
复制代码


// 小程序卡片消息button按钮配置
<button 
  size="mini" 
  type="primary" 
  :plain="true" 
  open-type="contact" 
  :session-from="" 
  :show-message-card="true" 
  :send-message-title="title">
  查看
 </button>
 {// 小程序卡片消息返回数据包
  "ToUserName": "toUser",
  "FromUserName": "fromUser",//客服消息发起者的openid
  "CreateTime": 1482048670,
  "MsgType": "miniprogrampage",//该条消息类型
  "MsgId": 1234567890123456,
  "Title":"title",//小程序卡片标题
  "AppId":"appid",//小程序appid
  "PagePath":"path",//小程序卡片跳转页面
  "ThumbUrl":"",//小程序卡片缩略图
  "ThumbMediaId":""
}
复制代码


{// 客服消息进入会话事件
  "ToUserName": "toUser",
  "FromUserName": "fromUser",//客服消息发起者的openid
  "CreateTime": 1482048670,
  "MsgType": "event",//该条消息类型
  "Event": "user_enter_tempsession",
  "SessionFrom": "sessionFrom"//开发者在客服会话按钮设置的 session-from 属性
}
复制代码

回复客服消息


微信客服消息文档


先获取access_token


微信获取access_token文档


注意:APPID和APPSECRET配置在微信公众平台开发管理里面获取


const tokenUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + APPID + '&secret=' + APPSECRET;
// uniCloud.httpclient 发起请求
const res1 = await uniCloud.httpclient.request(tokenUrl,
{
  method: 'GET',
  dataType:"json"
});
//返回数据给客户端
const access_token = res1.data.access_token;
复制代码

开始回复消息


const access_token = res1.data.access_token
const res2 = await uniCloud.httpclient.request("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="+access_token,{
    method:"POST",
    headers:{
      "Content-Type":"application/json"
    },
    dataType:"json",
    data:{
      touser:touser,//接收此消息用户的openid
      msgtype:"text",//此消息的类型
      text:{
        content:"回复的文本内容",
      }
    }
});
复制代码


回复消息的种类有很多,text文本消息,img图片消息,link链接消息,miniprogrampage小程序卡片消息。下面只说回复图片消息(这个在大部分教程里面都没写过,其他的可以自行在掘金上搜索)

在做图片消息自动回复之前,根据微信文档描述,需要现将图片上传到临时文件服务器,而且图片保存时间有效期只有三天


上传图片信息


微信客服上传临时图片文档


YXGZ)ZBPE~F)MSYM)LWY6UL.png


在请求参数中可以看到,我们需要传一个media的参数,而且是FormData类型的,但是我们不会在小程序上添加一个input框来用作上传图片,所以需要借助nodeJS的form-data模块


注意:在微信小程序中,不能直接在代码中写 new FormData() ,需要自行安装模块


  1. 首先将需要的图片上传到unicloud云存储中,获取到对应的URL


const img_url = 'https://云存储路径.jpg'


  1. 将图片链接转为Buffer


const url = await uniCloud.httpclient.request(img_url)
let buff = new Buffer(url.data);
复制代码


  1. 将buff传入formData


// 此处的FormData需要安装到当前云函数文件夹中
// npm install form-data
let form = new FormData()
// 将 media 参数、buff信息、formdata中需要包含的filename、图片信息打包
form.append('media', buff, {
  filename: `${Date.now()}.jpg`,
  contentType: 'image/jpeg'
})
复制代码


  1. 请求上传客服临时文件接口,将formdata信息上传,获取到media_id


// 请求微信服务器API,将formdata信息上传,获取到media_id
const imgRes = await uniCloud.httpclient.request("https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + access_token + '&type=image', {
  method: "POST",
  headers: form.getHeaders(),
  dataType: 'json',
  content: form.getBuffer()
});
return imgRes.data.media_id
复制代码


  1. 判断用户发送的消息,然后回复图片 注意:我这里判断的是用户发送 2 之后,回复消息


// 判断用户发送的消息内容
if(receiveMsg.Content === '2'){
  // 调用获取media_id的方法
  // 因为方法是一个promise,所以调用的时候需要加上 await 前缀
  let media_id = await uploadTempImg(url, access_token)
  if(media_id){
    // 发送消息
    const res2 = await uniCloud.httpclient.request("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + access_token, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      dataType: "json",
      data: {
        touser: receiveMsg.FromUserName, //接收此消息用户的openid
        msgtype: "image", //此消息的类型
        image: {
          media_id: media_id
        }
      }
                });
  }
}
复制代码

自动回复的小机器人就出现了


HF]X@LSJL[[`67]R9W@EMVX.png


完整代码


'use strict';
// 需要先执行初始化 npm init -y 生成packages.json文件后
// 再执行安装 npm install sha1
// 安装在当前目录哦。。不是全局安装的
const sha1 = require("sha1");
const FormData = require("form-data");
const token = "123qweASD";
const db = uniCloud.database();
function verifyMSGSender(params) {
  const mysignature = sha1([token, params.timestamp, params.nonce].sort().join(""));
  console.log(mysignature === params.signature ? "校验通过" : "校验失败");
  if (mysignature === params.signature) return true;
  else return false;
}
async function uploadTempImg(img_url, access_token){
  // 现将图片链接转为buffer
  const url = await uniCloud.httpclient.request(img_url)
  let buff = new Buffer(url.data);
  // 此处的FormData需要安装到当前云函数文件夹中
  // npm install form-data
  let form = new FormData()
  // 将 media 参数、buff信息、formdata中需要包含的filename、图片信息打包
  form.append('media', buff, {
    filename: `${Date.now()}.jpg`,
    contentType: 'image/jpeg'
  })
  // 请求微信服务器API,将formdata信息上传,获取到media_id
  const imgRes = await uniCloud.httpclient.request(
    "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + access_token + '&type=image', {
      method: "POST",
      headers: form.getHeaders(),
      dataType: 'json',
      content: form.getBuffer()
    });
    return imgRes.data.media_id
}
exports.main = async (event, context) => {
  // 获取config中配置的appid和appSecret
  let appId = await db.collection('wx_config').where({
    'key': 'wxId'
  }).get()
  let appSecret = await db.collection('wx_config').where({
    'key': 'wxSecret'
  }).get()
  const APPID = appId.data[0].val
  const APPSECRET = appSecret.data[0].val
  const tokenUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + APPID + '&secret=' + APPSECRET;
  // uniCloud.httpclient 发起请求
  const res1 = await uniCloud.httpclient.request(tokenUrl,
  {
    method: 'GET',
    dataType:"json"
  });
  //返回数据给客户端
  const access_token = res1.data.access_token;
  //event为客户端上传的参数
  if (!verifyMSGSender(event.queryStringParameters)) return "来源校验失败";
  //校验通过后,下面这行返回echostr的代码注释掉
  // else return event.queryStringParameters.echostr;
  // 解析json格式字符串
  const receiveMsg = JSON.parse(event.body);
  const url = 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a8a16cef-f2b9-4644-b216-3b95bcb12602/eed2e97a-be28-4e6d-beb3-ca338d195858.jpg'
  // 判断用户发送的消息内容
  if(receiveMsg.Content === '2'){
    // 调用获取media_id的方法
    // 因为方法是一个promise,所以调用的时候需要加上 await 前缀
    let media_id = await uploadTempImg(url, access_token)
    if(media_id){
      // 发送消息
      const res2 = await uniCloud.httpclient.request(
        "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + access_token, {
          method: "POST",
          headers: {
            "Content-Type": "application/json"
          },
          dataType: "json",
          data: {
            touser: receiveMsg.FromUserName, //接收此消息用户的openid
            msgtype: "image", //此消息的类型
            image: {
              media_id: media_id
            }
          }
        });
    }
  }
  //返回数据给客户端
  return;
};


相关文章
|
15天前
|
人工智能 数据可视化 API
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
56 2
|
10天前
|
人工智能 运维 负载均衡
10 分钟构建 AI 客服并应用到网站、钉钉或微信中
《10分钟构建AI客服并应用到网站、钉钉或微信中》的解决方案通过详尽的文档和示例代码,使具有一定编程基础的用户能够快速上手,顺利完成AI客服集成。方案涵盖高可用性、负载均衡及定制化选项,满足生产环境需求。然而,若文档不清晰或存在信息缺失,则可能导致部署障碍。实际部署中可能遇到网络、权限等问题,需逐一排查。云产品的功能、性能及操作配置便捷性直接影响解决方案效果,详尽的产品手册有助于快速解决问题。总体而言,该方案在各方面表现出色,值得推荐。
ly~
|
1天前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
20 6
|
1天前
|
小程序 JavaScript API
微信小程序开发学习之页面导航(声明式导航和编程式导航)
这篇文章介绍了微信小程序中页面导航的两种方式:声明式导航和编程式导航,包括如何导航到tabBar页面、非tabBar页面、后退导航,以及如何在导航过程中传递参数和获取传递的参数。
微信小程序开发学习之页面导航(声明式导航和编程式导航)
|
15天前
|
存储 移动开发 监控
微信支付开发避坑指南
【9月更文挑战第11天】在进行微信支付开发时,需遵循官方文档,确保权限和参数配置正确。开发中应注重安全,验证用户输入,合理安排接口调用顺序,并处理异常。上线后需实时监控支付状态,定期检查配置,关注安全更新,确保系统稳定运行。
|
21天前
|
移动开发 小程序 JavaScript
uni-app开发微信小程序
本文详细介绍如何使用 uni-app 开发微信小程序,涵盖需求分析、架构思路及实施方案。主要功能包括用户登录、商品列表展示、商品详情、购物车及订单管理。技术栈采用 uni-app、uView UI 和 RESTful API。文章通过具体示例代码展示了从初始化项目、配置全局样式到实现各页面组件及 API 接口的全过程,并提供了完整的文件结构和配置文件示例。此外,还介绍了微信授权登录及后端接口模拟方法,确保项目的稳定性和安全性。通过本教程,读者可快速掌握使用 uni-app 开发微信小程序的方法。
52 3
|
30天前
|
小程序
Taro@3.x+Vue@3.x+TS开发微信小程序,设置转发分享
本文介绍了Taro中`useShareAppMessage`的使用方法,需在页面配置`enableShareAppMessage: true`并重新编译。
Taro@3.x+Vue@3.x+TS开发微信小程序,设置转发分享
|
1月前
|
数据采集 监控 测试技术
大型IM稳定性监测实践:手Q客户端性能防劣化系统的建设之路
本文以iOS端为例,详细分享了手 Q 客户端性能防劣化系统从0到1的构建之路,相信对业界和IM开发者们都有较高的借鉴意义。
90 2
|
12天前
|
数据挖掘 API
如何选择适合的售后工单管理系统
选择合适的售后工单管理系统需评估需求和预算,考察功能、技术支持及服务商可靠性,并全面试用评估。ZohoDesk适合初创和中小企业,具备强大的工单管理、报告分析及可定制性,助力提升服务质量和客户体验。通过合适系统,企业不仅能优化客户服务流程,还能通过数据分析支持决策,推动长远发展。
43 16
|
9天前
|
人工智能 自然语言处理 前端开发
从客服场景谈:大模型如何接入业务系统
本文探讨了大模型在AI客服中的应用。大模型虽具有强大的知识生成能力,但在处理具体业务如订单咨询、物流跟踪等问题时,需结合数据库查询、API调用等手段。文章提出用Function Call连接大模型与业务系统,允许大模型调用函数获取私域知识。通过具体示例展示了如何设计系统提示词、实现多轮对话、定义Function Call函数,并利用RAG技术检索文档内容。最后,展示了该方案在订单查询和产品咨询中的实际效果。

热门文章

最新文章