最近项目中要做一个商品搜索(小程序)功能,通过首页的搜索框引导用户到客户会话里面,用户通过会话进行商品的搜索。
搜索到相关的商品就推送相关商品的小程序卡片,没有搜索到就直接推送指定的商品链接。
原型如下图:
通过客户会话,用户发起会话,获取文本信息后,通过关键字进行搜索。而发起客服会话事件,是前后端通过 SessionFrom 来进行的。
由于客服有多个不同的入口,前端通过 session-from 属性 设置search_ 才可进入到搜索会话里面来。
部分代码:
// 每次从搜索进入
if (StringUtils.isNotEmpty(cs)) {
if ((cs.startsWith("search_"))) {
logger.info("每次从首页进入");
getSearchone(openId, cs, jsonObject, request, 1);
return "success";
}
}
现在问题有来了,前端从首页搜索框每次进入客服会话界面才到有SessionFrom,后面就不会带有SessionFrom,如果一直停留在该页面,不断进行会话,那该如何?(这个地方就踩坑了)
针对这种情况,我们通过**用户第一次进入的时候把SessiionFrom的路径来源存储起来解决**。
表结构:
<img src="https://qiniu.epipe.cn/picture/006.png"/>
<br/>
代码实现:
if (StringUtils.isNotEmpty(msgType) && "text".equals(msgType)) { //接受到了文本消息
WxMsgSmall wxMsgSmall = new WxMsgSmall();
wxMsgSmall.setOpenid(jsonObject.getString("FromUserName"));
WxMsgSmall query = wxMsgSmallService.query(wxMsgSmall);
if (null != query && query.getSessionFrom().startsWith("search_")) { //说明上次是通过搜索入口进去得
logger.info("尚未进入搜索页面");
getSearch(openId, cs, jsonObject, request, -1);
return "success";
}
}
```
其中里面 getSearch,getSearchone 方法均为业务代码的实现。在该方法里面会有发送小程序卡片,图片,文本信息,此时就需要调用微信的客服消息发送相关的接口。
[客服消息](https://developers.weixin.qq.com/miniprogram/dev/api-backend/customerServiceMessage.send.html)
<img src="https://qiniu.epipe.cn/picture/007.png"/>
<br/>
<img src="https://qiniu.epipe.cn/picture/008.png"/>
<br/>
重点来看,在文本消息里面嵌套小程序,多个小程序链接,又是字符串类型,完全靠拼接起来,这个地方就会字符转义,从而发出去的就是一堆字符串了(折腾了我半天)。
拼接部分的代码:
<img src="https://qiniu.epipe.cn/picture/009.png"/>
<br/>
现在就来看看最终的效果
<img src="https://qiniu.epipe.cn/picture/010.jpg" height="1040" width="600"/>
<img src="https://qiniu.epipe.cn/picture/011.jpg" height="1037" width="600"/>
**从首页搜索框到客服会话消息里面,输入相关的商品,即可推送相关卡片。没有搜索到的商品会推荐相关的,到这步体验感觉稍好。那么难题又来了,从 小程序-->客服会话--> 点击 先关卡片链接或者卡片。跳回的页面却是小程序首页,却不是指定页面(页面路径均正确)。现在推出小程序,微信-->客服消息助手--> 点击卡片链接或者卡片,此时能够正常显示。 上线半天的时间 ,收到的反馈都要炸了。该问题始终没有定位出来,官方也没有类似的demo和帖子,限于小程序官方的瓶颈,只能下架该功能了**