手机版

微信小程序在线客服自动回复功能(基于节点)

时间:2021-08-21 来源:互联网 编辑:宝哥软件园 浏览:

前言

我们知道H5页面经常需要通过下载安装包或者跳转到App Store /Appstore来转移用户到APP。但由于小程序嵌套webview时需要验证域名,跳转到第三方应用市场和Appstroe无法实现分流。那我们该怎么办?

我只能说身高一尺,身高一尺。看看微博小程序是怎么分流的:

曲线救国,利用小程序的在线功能可以打开H5下载和指南。

然后,引出本文的主题,小程序在线客服的自动回复功能。

阅读本文档前,最好了解小程序客服信息官方相关文档:

客服消息用户指南-小程序客服消息服务器界面客服消息开发文档这次在线客服功能的开发也踩了很多坑,网上查阅了很多资料,但是后台开发大部分是基于php或者python、java开发,node.js的开发比较少,所以开发过程会记录下来供大家参考,避免踩坑。可能会有一些错误。请指正并交流。

此外,我们使用的节点框架是基于koa的自封装,在一些细节上与其他框架不同。

需求描述

点击小程序中的按钮,跳转到在线客服界面,根据关键词自动回复

客服回复判断条件,支持cms配置键,并响应

响应支持配置以下类型,并回复内容:

键入内容文本文本=文本回复内容链接title=title description=description URL=跳转链接thumb_url=图片地址imageurl=图片地址配置完成后,用户需要准确匹配回复条件才能收到自动回复。可以配置多个按键,可以配置除已配置按键外的对应应答,可以配置默认的自动回复开发流程。

写一个按钮跳转到客户服务

index.wxml

按钮打开-类型=“联系”到在线客户服务/按钮后台配置

登录小程序后台后,在“开发”-“开发设置”-“消息推送”中,管理员扫描代码启用消息服务,并填写服务器地址(URL)、令牌(Token)和消息加密密钥(EncodingAESKey)等信息。

1.URL服务器地址

URL:是开发者用来接收微信消息和事件的界面URL。开发者填写的URL必须以http://或https://开头,分别支持80个端口和443个端口。

一定要记住,服务器地址必须是在线地址,因为需要微信服务器访问。本地主机、IP和内部网地址将不起作用。

否则会提示‘解析失败,请检查信息填写是否正确’。

那么问题来了。不同的公司都有一套网上的程序,所以他们不能去网上测试网址是否可用,这太贵了,也不方便。这将导致内部网的渗透。简单来说就是配置一个在线域名,但是这个域名可以穿透你配置的本地开发地址,方便你调试和读取日志。

推荐一个可以实现内网穿透的工具。(非广告)

为了避免广告嫌疑,NATAPP没有给出详细的介绍。

简单来说,NATAPP有两种模式:免费和付费。免费就是域名时不时的换,微信的推送消息配置一个月才换三次有点奢侈。当配置的域名无法访问时,必须重新配置。付费域名是固定的,映射的内网地址可以随时更改。楼主从免费切换到付费模式,VIP使用一个月大概十块钱。

2.代币

自己写Token就可以了,但是要记住,因为需要在界面中使用。

3.消息加解密密钥

可以随机生成。

4.加密方法和数据格式

楼主根据自己的喜好选择安全模式和JSON格式。不同的模式和数据格式在开发中会有所不同,所以你可以自己衡量。既然这些配置都很清楚,就开始编写代码吧。

确认消息确实来自微信服务器

在提交配置之前,需要编写来自WeC的验证消息的接口

server.js

/* * https://developers . weixin . QQ.com/mini program/dev/framework/server-ability/message-push . html *验证消息是否真的来自微信服务器*开发者通过验证签名来验证请求(下面有验证方法)。*如果确认GET请求来自微信服务器,请原样返回echostr参数内容,*则访问生效,成功成为开发者,否则访问失败。加密/验证过程如下:*三个参数token、timestamp和nonce按字典顺序排序;将三个参数的字符串拼接成一个字符串进行sha1加密;*开发者获取的加密字符串可以和签名进行比对,表示请求来自微信*/const crypto=require(' crypto ');async wxCallbackAction(){ const CTX=this . CTX;const方法=ctx.method//微信服务器签名验证,确认请求来自微信if(方法=='GET') {//1。获取参数signature、timestamp、nonce、echostar const {signature、timestamp、nonce、echostar }=ctx.query//2.按照字典顺序对令牌、时间戳和随机数进行排序。LetArray=['您的令牌',时间戳,nonce];array . sort();//3.将三个参数字符串拼接成一个字符串,用于sha1加密常量tempStr=array . join(');const HashCode=crypto . create hash(' sha1 ');//创建加密类型const result code=hashcode . update(tempstr,' utf8 ')。摘要(' hex ');//4.开发者获取的加密字符串可以和签名进行比对,表示请求来自微信if(结果码===签名){console.log('验证成功,消息从微信服务器转发');返回this . JSON(echostr);}else {console.log('身份验证失败!');返回this.json ({status:-1,message: '身份验证失败' });}}}验证界面开发完成后,即可提交后台配置。成功配置将提示以下:

接收消息和推送消息

当用户在客服会话中发送消息或某个特定用户操作触发事件推送时,微信服务器会将消息或事件数据包发送到开发者填写的URL。开发者收到请求后,可以使用发送客服消息的接口异步回复。

本文以接收短信为例开发了:

server.js

const WXDecryptContact=require(' ./WxDecryptContact’);async Wxcall backAction(){ const CTX=this。CTX;常数方法=ctx.method//接收信息时为邮政请求;(完整代码自行与上面验证时的合并即可)if(method===' POST '){ const { Encrypt }=CTX。请求。身体;//配置时选的安全模式因此需要解密if(!encrypt){返回这个。JSON(‘成功’);} const Decrypt data=WxDecrypt联系人(加密);等待这个_ handleWxMsg(DecryptDATa);返回这个。JSON(‘成功’);} else {返回此。JSON(‘成功’);} } //处理微信回调消息的总入口(只处理了文本类型,其他类型自行添加)async _handleWxMsg(msgJson){ if(!msgJson){返回这个。JSON(‘成功’);} const { MsgType }=msgJsonif(MsgType===' text '){ 0等待这个_ sendTextMessage(msgJson);} } //微信文本信息关键字自动回复async _ sendTextMessage(msgJson){//获取羧甲基淀粉钠客服关键词回复配置const result=等待此。呼叫服务(CMS)。getdatabyname ',' wxapplet。联系人');让KeyWordObj=结果。数据| | { };//默认回复默认字母选项=keyWordObj.defaultfor(让键入keyWordObj){ //查看是否命中配置的关键词if(msgJson .内容===密钥){ //CMS配置项options=KeyWordObj[key];} } } //获取access_token常量accessToken=等待此消息_ GetAccessToken();/* * 先判断配置回复的消息类型是不是图像类型* 如果是则需要先通过新增素材接口上传图片文件获得media _ id */let media _ id=' ';if(options.type==='image'){ //获取图片地址(相对路径)让url=options.urlconst文件=fs。createReadStream(URL);//调用微信上传临时媒体接口具体实现见服务。js const mediaResult=等待这个。呼叫服务(' wxapplet。uploadtempmedia ',{ access_token: accessToken,type: 'image' },{ media : file });if(媒体结果。状态===0){ media _ id=媒体结果。数据。媒体id;}else { //如果图片编号获取失败则按默认处理options=keyWordObj.default} } //回复信息给用户const sendmasgresult=等待此消息。呼叫服务(' wxapplet。sendsmessageto customer ',{ access_token: accessToken,touser: msgJson .从用户名,msgtype :选项。键入| | ' text ',text : { content :选项。描述| | ' ',},link: options.type==='link '?{ title: options.title,description : options。描述,url: options.url,thumb _ URL : options。thumb _ URL } : { },image : { media _ id } });}service.js

const request=require(' request ');/** 获取羧甲基淀粉钠客服关键词回复配置* 这个接口只是为了回去羧甲基淀粉钠配置的字段回复关键字配置返回的数据数据结构如下*/async contact(){ return { data : { ' 1 ' : { ' type ' : ' link ',' title': '点击下载[****]APP ','描述' : '注册领取领***元注册红包礼,' URL ' : ' https://m。人人戴。com/mo/* * *。html ',' thumb _ URL ' : ' https://m。我们。com/* * */test。png ' },' 2 ' : { ' URL ' : ' http://m。人人戴。com/CMS/* */test。jpg ','键入' : 'image' },' 3 ' : { ' url '再见' } } }}/* * 把媒体文件上传到微信服务器。目前仅支持图片。用于发送客服消息或被动回复用户消息* https://名开发人员。微信。QQ。com/mini program/dev/API-后端/open-API/customer-message/customer service message。上传临时媒体。html */async uploadTempMedia(data,formData){ const URL=`https://api.weixin.qq.com/cgi-bin/media/upload?access _ token=$ { data。access _ token }类型=$ { data。type } `;返回新的承诺(解析,拒绝)={ request.post({url,formData: formData},(err,response,body)={ try { const out=JSON。解析(正文);让结果={ data: out,status: 0,message: 'ok' }返回决心(结果);} catch(err){ return reject({ status :-1,message : err。消息});} });} } /* * 发送客服消息给用户* https://名开发人员。微信。QQ。com/mini program/dev/API-后端/open-API/customer-message/customer service message。发送。html */async sendsmessagefocustomer(数据){ const URL=`https://api.weixin.qq.com/cgi-bin/message/custom/send?access _ token=$ { data。access _ token } `;返回新的承诺(解析,拒绝)={ request.post({url,数据},(err,response,body)=}.});} }WXDecryptContact.js

消息加密解密文档

const crypto=require(' crypto ');//加密模块const decodepkcs 7=函数(buff){ let pad=buff[buff。长度-1];if(pad 1 | | pad 32){ pad=0;}返回buff.slice(0,buff。长度垫);};//微信转发客服消息解密const decryptContact=(key,iv,crypted)={ const AES cipher=crypto。createdecidepheriv(' AES-256-CBC ',密钥,iv);AES密码。setautopadding(false);让deckeredbuff=buffer。concat([AES密码。更新(加密,' base64 '),AES密码。final()]);decredbuff=decodepkcs 7(decredbuff);const lennetordercompid=decredbuff。切片(16);const msgLen=lennetordercompid。切片(0,4)。readuint 32 be(0);const result=lennetordercompid。切片(4,msgLen 4).toString();返回结果;};//解密微信返回给配置的消息服务器的信息const decryptWXContact=(微信数据)={ if(!微信数据){微信数据=' ';} //EncodingAESKey为后台配置时随机生成的常量键=缓冲区。from(EncodingAESKey '=',' base64 ');const iv=key.slice(0,16);const result=decryptContact(key,iv,微信数据);const DecryptedResult=JSON。解析(结果);控制台。日志(解密结果);返回解密结果;};模块。exports=Decryptwxcontact呼~代码终于码完,来看看效果:

总结

开发并不是一帆风顺的,也遇到了一些值得留意的坑,强调一下:

后台配置的URL地址必须能够被外部网络访问(可以通过内部网络渗透来解决)。文件上传界面的uploadTempMedia媒体参数应采用FormData数据格式(可通过节点的请求库轻松实现)。乌尔利布,这个图书馆充满了泪水。T_T)记住,无论接收消息成功与否,都要返回成功。否则,即使成功接收到返回消息并且日志没有报告错误,IOS也会提示该小程序提供的服务失败。请稍后再试。以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:微信小程序在线客服自动回复功能(基于节点)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。