微信小程序客服消息开发实战:实时在手机上接收小程序客服消息通知,以及在手机上回复
在微信小程序开发中,可以非常方便的集成客服功能,只需要一行代码便可以将用户引导至客服会话界面。这行代码就是:
<button open-type="contact" bindcontact="handleContact">联系我们</button>
当用户点击这个【联系我们】的按钮时,便会进入微信自带的小程序客服会话界面。如下图:
虽然只能发送表情和照片,但是对于小程序来讲,已经是非常不错的功能了。
但是,虽然可以一行代码让我们的小程序拥有客服功能,但是当用户给我们小程序发消息的时候,我们小程序的管理员或运营者并不能实时收到消息通知,这就导致经常不能及时回复用户信息,导致销售机会的流失。
如果想要在手机上实时接收小程序客服消息通知,以及在手机上回复用户信息,那就得自己写代码了,或者更简单的,使用第三方平台的服务。
下面,笔者就详细介绍这两种实现方式。
方式一:自己写代码
首先,需要按照官方提供的消息推送文档,完成消息推送接口的开发。请参考这里。这一步通常是比较难的,如果是第一次尝试对接,建议加密方式采用明文方式。
当消息推送接口开发完成后,需要到小程序后台,在「开发」-「开发设置」-「消息推送」中,管理员扫码启用消息服务,填写服务器地址(URL)、令牌(Token) 和 消息加密密钥(EncodingAESKey)等信息。如下图所示:
在上图中的页面提交成功之后,即表示你们开发的消息推送接口反应正常,可以正常收到用户的客服消息了。
接下来,便是接收文字消息和图片消息。
1.1 文本消息
文本消息对接非常的简单,其XML数据格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1482048670</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
你只需要将Content的值通过微信或者短信,或者任何方式发送给你们运营者(或管理员)即可,建议通过微信公众号的模板消息发送,当然,这得要求你们要有已认证的服务号,并且已申请模板消息。
当然运营者收到模板消息通知后,点开消息即可进行回复。这里得需要开发一个聊天界面,方便运营者直接给用户发消息。
这个聊天界面可简单可复杂,但是最基本的应该要支持输入文字和上传图片。所以,开发起来其实也很复杂。
1.2 图片消息
图片消息XML数据格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1482048670</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[this is a url]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
<MsgId>1234567890123456</MsgId>
</xml>
可以看到这里提供了PicUrl图片链接地址,首先需要下载该图片到本地服务器,然后再创建消息并推送给运营者。
1.3 发送小程序客服消息
当运营者通过你们自己开发的聊天界面发送消息时,这时需要调用小程序的API。请参考这篇API文档。
调用发送消息接口的时候,需要先获取accesstoken,并且要求你们服务器自行维护一份可用的accesstoken,这对于很多新手开发人员来讲也是比较难以理解的。
而如果是发送图片消息,则需要通过新增临时图片素材接口获得media_id,然后才能调用发送图片接口。
总的来讲,实现消息的发送也是比较复杂的。
下面,笔者给大家分享第二种实现在手机上实时接收小程序客服消息通知的方式,也是最为推荐的方式。
方式二:直接使用第三方平台的服务
关注下图所示公众号,完了之后点击公众号底部自定义菜单【新增授权】。
重要提示:授权的时候 只勾选客服消息权限,其他权限一个都不要选,否则可能对原有的小程序造成影响。
授权完成后,可以进入自己的小程序,给自己的小程序发一个消息,是不是立即收到了来自微小助公众号的消息通知。点击这个通知就可以直接回复,支持文本、相册选择、拍照。
这时候,你可能已经发现,在第三方平台的聊天界面无法显示粉丝头像和昵称。这是因为小程序只能通过小程序内获取用户信息,而不能通过服务器端获取。
没关系,该第三方平台提供了对接头像昵称的接口。
对接原理:
作为小程序的开发方,通常我们都会将用户头像、昵称和openid存到自己的数据库。那么只需要我们的WEB服务器开放一个根据openid返回头像昵称的接口,那么当第三方平台需要显示用户头像昵称的时候,传一个openid过来就可以显示头像昵称了。而对于小程序开发方,只需要开放一个非常简单的数据接口,并且数据多来自已有的数据库,直接返回即可。
该接口的文档获取方式:微小助公众号 - 底部菜单【管理中心】 - 进入自己的小程序。点击如下图所示一栏:
在接下来的页面中,便会弹出接口对接说明,如下图:
请看.NET示例代码:
[TokenAuthorize(Anonymous = true), HttpGet]
public ActionResult GetStudentNameAndAvatar(string openId)
{
var service = Ioc.GetService<IStudentService>();
var user = service.GetOauthAppletUser(openId);
if (user == null)
{
return null;
}
return Json(new
{
avatarUrl = user.AvatarUrl,
nickname = user.NickName
}, JsonRequestBehavior.AllowGet);
}
下面是java版的API接口实现示例:
@RequestMapping(value = "/get-user-info", method = RequestMethod.GET)
@ResponseBody
@Authorize(anonymous = true)
public UserInfoDto getUserInfo(String openId) {
OAuthWeixinUser user = this.userService.getUserByOpenId(openId);
UserInfoDto dto = new UserInfoDto();
dto.setAvatarUrl(user.getHeadimgUrl());
dto.setSex(user.getGender().getValue());
dto.setNickname(user.getNickname());
dto.setRemark(user.getRemark());
return dto;
}
其中UserInfoDto类的定义如下:
public class UserInfoDto {
private String avatarUrl;
private String nickname;
private int sex;
private String remark; public String getAvatarUrl() {
return avatarUrl;
} public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
} public String getNickname() {
return nickname;
} public void setNickname(String nickname) {
this.nickname = nickname;
} public int getSex() {
return sex;
} public void setSex(int sex) {
this.sex = sex;
} public String getRemark() {
return remark;
} public void setRemark(String remark) {
this.remark = remark;
}
}
接口开发完成后,发布到生成环境,可以随便从数据库取一个openid拼接成URL之后在浏览器中测试。测试正确返回数据后,将此URL回填到第三方平台内的URL配置地方。
现在,再次用自己的微信给小程序发一个消息,你会看到,在运营者(或管理员)打开通知的聊天界面,已经可以正常显示粉丝头像昵称了。
是不是非常的简单呢!(如果需要更完善的第三方平台操作步骤,请点击这里继续阅读)
THE END.
微信小程序客服消息开发实战:实时在手机上接收小程序客服消息通知,以及在手机上回复的更多相关文章
- C#微信公众号开发系列教程五(接收事件推送与消息排重)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 极客时间_Vue开发实战_汇总贴
视频地址: https://time.geekbang.org/course/intro/163 https://github.com/tangjinzhou/geektime-vue-1 电脑dem ...
- iOS开发实战-基于SpriteKit的FlappyBird小游戏
写在前面 最近一直在忙自己的维P恩的事情 公司项目也是一团乱 于是...随手找了个游戏项目改了改就上线了,就当充数了. SpriteKit简介 SpriteKit是iOS 7之后苹果推出的2D游戏框架 ...
- 极客时间-vue开发实战学习(ant-design vue作者)
vue基础 属性 事件 插槽 指令(Directives) 生命周期 底层原理 vue生态 路由管理器vue Router 状态管理器vuex 同构Nuxt vue实战 实战项目-ant-desing ...
- 极客时间_Vue开发实战_04.开发环境搭建
Vue CLI的形式搭建环境: vue create hello-world 我们选择default默认的配置,提供babel和eslint的支持.如果你已经对工程化的东西非常了解了.你可以选择自定义 ...
- 极客时间_Vue开发实战_05.Vue组件的核心概念(1):属性
05.Vue组件的核心概念(1):属性 代码地址: https://github.com/tangjinzhou/geektime-vue-1/blob/master/%E6%BC%94%E7%A4% ...
- 极客时间_Vue开发实战_06.Vue组件的核心概念(2):事件
06.Vue组件的核心概念(2):事件 通过emit传递给父组件 我们点击了重置失败,上层的div的click=handleDivClick是接收不到.重置失败的点击的行为的 通常情况下,你不用.st ...
- 极客时间_Vue开发实战_07.Vue组件的核心概念(3):插槽
07.Vue组件的核心概念(3):插槽 严格来的说在2.0之后已经不分区这两种插槽的概念了. 因为它底层的实现已经趋向于相同了. 2.6为了兼容2.5的版本,现在依然可以用这两种写法 作用域插槽就是多 ...
- 《微信小程序商城开发实战》笔者的新书,欢迎各位粉丝上京东购买
作者图书京东链接,请点击------>>> **微信小程序商城开发实战** 附京东真实评价截图: 编辑推荐 在当今移动互联网大潮中,微信应用凭借其庞大的用户基数和极强的用户黏性 ...
随机推荐
- 【php增删改查实例】第十节 - 部门管理模块(新增功能)
正常情况下,在一个部门管理页面,不仅仅需要展示列表数据,还需要基本的增删改操作,所以,我们先把之前写好的新增功能集成进来. 在toolbar中,添加一个新增按钮. <div id="t ...
- Java JFrame图形界面 ----一个简单的窗口
#开始 申请博客已经有一段时间了 但是一直没有时间写博文(其实还是懒虫侵蚀了大脑) 最近正在学习JFrame做窗口 遇到了很多的问题 为了解决问题也谋杀了很多的脑细胞 为了让更多的朋友不死的很多脑细胞 ...
- idea运行多模块的maven项目,工作目录不一致的问题
我使用idea开发多模块的maven项目,目录结构如下: segment (父级) ---pom.xml ---core (子模块) ...
- InnoDB页压缩技术
Ⅰ.想起一个报错 1.1 创建表报错 (root@localhost) [(none)]> create tablespace ger_space add datafile 'ger_space ...
- Java 读书笔记 (十四) Java 方法
finalize() 方法 finalize() 用来清除回收对象. //为什么要回收内存?怎样写可以避免内存过多占用?什么时候需要手动回收内存? protected void finalize() ...
- 时间戳转换成时间js(年-月-日,例如“2017-04-22”)
function GetDateByShiJianChuo(timespan) { var date = new Date(parseInt(timespan.replace("/Date( ...
- B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij
B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...
- BZOJ_1895_Pku3580 supermemo_Splay
BZOJ_1895_Pku3580 supermemo_Splay Description 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx ...
- 解决非root用户使用docker的办法
通常我们使用Docker的时候都是使用的root,官方说法如下 The docker daemon binds to a Unix socket instead of a TCP port. By d ...
- setContentType与setCharacterEncoding的区别
setCharacterEncoding只是设置字符的编码方式 setContentType除了可以设置字符的编码方式还能设置文档内容的类型 1.setCharacterEncoding respon ...