小册子《Uniapp 从入门到进阶》-从基础到实战,详细讲解跨平台应用开发的方方面面,包括Uniapp开发常用知识点,基础api,前端交互、组件封装、后处理End-endNodejs开发,前后端联调调优部署,是一套非常全面的综合课程。今年的早春不平凡。肆虐的病毒影响了各行各业。我希望它会很快过去,一切都会恢复正常。简介最近在升级公司的小程序。打算逐步把一些前端可操作的、相对独立的功能(后端懒得改)转移到云开发上。这次来说说客服消息推送。我“参考”了官方文档,感谢官方提高了我多想多做的能力,所以这篇文章内容大致分为以下几点:什么是云开发?什么是云函数?年味很浓,不懂的点这里。我的理解是Serverless是一种架构,云开发是它的一种实现方式。云开发为开发者提供完整的原生云支持和微信服务支持,弱化后端和运维概念,无需搭建服务器,接入SDK,使用平台提供的API进行核心业务开发,即可实现快速上线和迭代。云开发提供了几个基础能力支持:能力说明云函数不需要自己搭建服务器在云端运行代码,微信私有协议提供自然认证,开发者只需要自己写业务逻辑代码,不需要自己搭建自己的数据库。小程序前端操作,云函数可读写的JSON数据库。云存储不需要自建存储和CDN。直接在小程序前端上传/下载云端文件,在云端开发控制台可视化管理云端调用。原生微信服务集成基于云端功能免认证使用小程序开放接口的能力,包括调用服务端和获取开放数据的能力。在开发者工具栏左侧,点击云开发按钮,打开云控制台,激活云开发,根据提示创建云。环境。默认配额下,可以创建两个环境,每个环境相互隔离,每个环境包含独立的数据库实例、存储空间、云功能配置等资源。每个环境都由唯一的环境ID标识,最初创建的环境自动成为默认环境。以上为官方介绍。简而言之,确保您启用了云开发功能。云功能客服消息推送开启。云开发的小程序可以使用云函数接收消息推送。目前仅支持客服消息推送。云调用会用到2个API:customerServiceMessage.sendcustomerServiceMessage.uploadTempMediacustomerServiceMessage.send可以推送四种消息|属性|说明||------|:-----:||文字|短信,msgtype="文本"||图片|图片消息,msgtype="图片"|链接|图文链接,msgtype="link"|小程序页面|小程序卡片,msgtype="miniprogrampage"|这次只用到了文字,图片有两种,暂时不用链接和小程序页面。图片类型有一个要求:传入media_id参数,即要发送图片的媒体ID,需要通过新素材接口(customerServiceMessage.uploadTempMedia)上传图片文件获取。customerServiceMessage.uploadTempMedia上传媒体文件到微信服务器。目前仅支持图像。用于发送客服消息或被动回复用户消息,放在后面的功能实现介绍中。功能实现先说说我们的需求:用户点击弹窗导图,打开客服消息窗口,主动推送欢迎信息,操作提示。当用户输入“1”时,将推送一个二维码图像。由于我们公司的小程序已经存在很长时间了,结构不容易调整。起初我认为很难融入。没想到只需要简单的配置。在根目录下新增文件夹cloudfunctions存放云函数,并在根目录project.config.json文件中,添加cloudfunctionRoot字段,指定cloudfunctions为云函数的本地根目录,{"cloudfunctionRoot":"cloudfunctions/",}指定完成后,云函数根目录图标变为“云函数目录图标”,云函数根目录下一级目录(云函数目录)同名云函数。如果相应的线上环境中存在云函数,则会用一个特殊的“云图标”来标记:接下来,在云函数根目录的右键菜单中,选择新建一个Node.js云函数。我们将云函数命名为kefum??sg,在本地创建云函数目录和入口index.js文件,在线环境中创建生成对应的云函数。一个目录代表一个云函数,一般由两个文件组成,index.js、package.json,这里手动添加一个config.json文件,配置使用customerServiceMessage的权限。send:{"permissions":{"openapi":["customerServiceMessage.send","customerServiceMessage.uploadTempMedia"]}}下面是kefmsg云函数的目录:node_modules是本地调试生成的,后面会讲到。先将二维码图片上传到云存储,打开微信开发工具打开云开发->存储->上传文件:下面会用到这里的文件ID。写一个云函数打开kefmsg云函数目录下的index.js文件,替换成如下代码:constcloud=require('wx-server-sdk')cloud.init()letdownLoad=async(event,context)=>{constres=awaitcloud.downloadFile({fileID:'cloud://kefum??sg-n350x.6769-kefum??sg-n350x-1302104716/1588064201743.png',//图片文件ID})constbuffer=res.fileContentconsole.log(buffer)returnbufferletupload=async(Buffer)=>{returnawaitcloud.openapi.customerServiceMessage.uploadTempMedia({type:'image',media:{contentType:'image/png',value:Buffer}})}exports.main=async(event,context)=>{constwxContext=cloud.getWXContext()if(event.Content=='1'){letBuffer=awaitdownLoad()letmeida=awaitupload(Buffer)//console.log(meida)try{const结果=等待云。openapi.customerServiceMessage.send({touser:wxContext.OPENID,"msgtype":"image","image":{"media_id":meida.mediaId}})返回结果}catch(err){returnerr}}elseif(event.Title=='Customtitle'){//根据自定义卡片标题触发letBuffer=awaitdownLoad()letmeida=awaitupload(Buffer)try{constresult=awaitcloud.openapi.customerServiceMessage.send({touser:wxContext.OPENID,"msgtype":"image","image":{"media_id":meida.mediaId}})returnresult}catch(err){returnerr}}else{try{awaitcloud.openapi.customerServiceMessage}.send({touser:wxContext.OPENID,msgtype:'text',text:{co意图:'您好,很高兴为您服务。回复1,查看入群二维码'}});return'success'}catch(err){returnerr}}}你一定很疑惑为什么又是download(),又是upload(),这里会有点乱,跟着小编一起来了解一下:首先是二维码图片放在云存储中,首先需要通过cloud.downloadFile下载对应的buffer值,然后打开api.customerServiceMessage.uploadTempMedia的media类型只接受Buffer,上传成功返回mediaId标识(媒体文件上传后,获取到标识符,3天内有效),传递给openapi.customerServiceMessage.send中图片的media_id属性,这样就可以成功返回图片类型的消息。如果你们有好的解决方案,请告诉我。上传部署写好云函数后,右键kefmsg云函数目录,选择上传部署:所有文件,一键推送到云端,无论部署成功与否自动返回消息。然后,在开发工具云开发控制台中,选择设置->全局设置->添加消息推送,添加一个配置,这里只选择文本类型:确认保存根据我们的需要,用户点击客服,一个消息会自动推送,经过测试,只有配置了文本类型才会主动推送。如果配置了多条短信,只有用户主动发送消息才会触发推送。调用云功能首先在小程序app.js头部添加:wx.cloud.init()在page.wxml中添加打开客服对话框:
