微信公众平台 客服接口发消息的实现代码(Java接口开发)


Posted in Javascript onApril 17, 2019

微信公众平台技术文档:客服消息

一、接口说明

当用户和公众号产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过POST一个JSON数据包来发送消息给普通用户。此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务。

目前允许的动作列表如下(公众平台会根据运营情况更新该列表,不同动作触发后,允许的客服接口下发消息条数不同,下发条数达到上限后,会遇到错误返回码,具体请见返回码说明页):

1、用户发送信息
2、点击自定义菜单(仅有点击推事件、扫码推事件、扫码推事件且弹出“消息接收中”提示框这3种菜单类型是会触发客服接口的)
3、关注公众号
4、扫描二维码
5、支付成功
6、用户维权

二、客服接口-发消息

1 接口调用请求说明

http请求方式: POST

https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN

2 发送客服消息

各消息类型所需的JSON数据包如下:

(1)发送文本消息

{
 "touser":"OPENID",
 "msgtype":"text",
 "text":
 {
   "content":"Hello World"
 }
}

(2)发送图片消息

{
 "touser":"OPENID",
 "msgtype":"image",
 "image":
 {
  "media_id":"MEDIA_ID"
 }
}

(3)发送语音消息

{
 "touser":"OPENID",
 "msgtype":"voice",
 "voice":
 {
  "media_id":"MEDIA_ID"
 }
}

(4)发送视频消息

{
 "touser":"OPENID",
 "msgtype":"video",
 "video":
 {
  "media_id":"MEDIA_ID",
  "thumb_media_id":"MEDIA_ID",
  "title":"TITLE",
  "description":"DESCRIPTION"
 }
}

(5)发送音乐消息

{
 "touser":"OPENID",
 "msgtype":"music",
 "music":
 {
  "title":"MUSIC_TITLE",
  "description":"MUSIC_DESCRIPTION",
  "musicurl":"MUSIC_URL",
  "hqmusicurl":"HQ_MUSIC_URL",
  "thumb_media_id":"THUMB_MEDIA_ID" 
 }
}

(6)发送图文消息(点击跳转到外链) 图文消息条数限制在8条以内,注意,如果图文数超过8,则将会无响应。

{
 "touser":"OPENID",
 "msgtype":"news",
 "news":{
  "articles": [
   {
    "title":"Happy Day",
    "description":"Is Really A Happy Day",
    "url":"URL",
    "picurl":"PIC_URL"
   },
   {
    "title":"Happy Day",
    "description":"Is Really A Happy Day",
    "url":"URL",
    "picurl":"PIC_URL"
   }
   ]
 }
}

(7)发送图文消息(点击跳转到图文消息页面) 图文消息条数限制在8条以内,注意,如果图文数超过8,则将会无响应。

{
 "touser":"OPENID",
 "msgtype":"mpnews",
 "mpnews":
 {
   "media_id":"MEDIA_ID"
 }
}

(8)发送卡券

{
 "touser":"OPENID", 
 "msgtype":"wxcard",
 "wxcard":{    
   "card_id":"123dsdajkasd231jhksad"  
   },
}

特别注意客服消息接口投放卡券仅支持非自定义Code码和导入code模式的卡券的卡券,详情请见:是否自定义code码。

请注意,如果需要以某个客服帐号来发消息(在微信6.0.2及以上版本中显示自定义头像),则需在JSON数据包的后半部分加入customservice参数,例如发送文本消息则改为:

{
 "touser":"OPENID",
 "msgtype":"text",
 "text":
 {
   "content":"Hello World"
 },
 "customservice":
 {
   "kf_account": "test1@kftest"
 }
}

3 请求参数说明

参数 是否必须 说明
access_token 调用接口凭证
touser 普通用户openid
msgtype 消息类型,文本为text,图片为image,语音为voice,视频消息为video,音乐消息为music,图文消息(点击跳转到外链)为news,图文消息(点击跳转到图文消息页面)为mpnews,卡券为wxcard
content 文本消息内容
media_id 发送的图片/语音/视频/图文消息(点击跳转到图文消息页)的媒体ID
thumb_media_id 缩略图的媒体ID
title 图文消息/视频消息/音乐消息的标题
description 图文消息/视频消息/音乐消息的描述
musicurl 音乐链接
hqmusicurl 高品质音乐链接,wifi环境优先使用该链接播放音乐
url 图文消息被点击后跳转的链接
picurl 图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80

4 java接口开发

(1)Message客服接口消息封装对象

public class Message {

 private String touser;
 private String msgtype;
 private TextContent text;
 private MediaContent image;
 private MediaContent voice;
 private MediaContent video;
 private MusicContent music;
 private Articles news;

 public String getTouser() {
  return touser;
 }
 public void setTouser(String touser) {
  this.touser = touser;
 }
 public String getMsgtype() {
  return msgtype;
 }
 public void setMsgtype(String msgtype) {
  this.msgtype = msgtype;
 }
 public TextContent getText() {
  return text;
 }
 public void setText(TextContent text) {
  this.text = text;
 }
 public MediaContent getImage() {
  return image;
 }
 public void setImage(MediaContent image) {
  this.image = image;
 }
 public MediaContent getVoice() {
  return voice;
 }
 public void setVoice(MediaContent voice) {
  this.voice = voice;
 }
 public MediaContent getVideo() {
  return video;
 }
 public void setVideo(MediaContent video) {
  this.video = video;
 }
 public MusicContent getMusic() {
  return music;
 }
 public void setMusic(MusicContent music) {
  this.music = music;
 }
 public Articles getNews() {
  return news;
 }
 public void setNews(Articles news) {
  this.news = news;
 }
 @Override
 public String toString() {
  return "Message [touser=" + touser + ", msgtype=" + msgtype + ", text="
    + text + ", image=" + image + ", voice=" + voice + ", video="
    + video + ", music=" + music + ", news=" + news + "]";
 }
}

(2)TextContent文本消息内容封装对象

public class TextContent {

 private String content;

 public String getContent() {
  return content;
 }

 public void setContent(String content) {
  this.content = content;
 }
}

(3)MediaContent媒体ID封装对象

public class MediaContent {

 private String media_id;

 public String getMedia_id() {
  return media_id;
 }
 public void setMedia_id(String media_id) {
  this.media_id = media_id;
 }
}

(4)MusicContent音乐消息封装对象

public class MusicContent {

 private String title;
 private String description;
 private String musicurl;
 private String hqmusicurl;
 private String thumb_media_id;

 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public String getDescription() {
  return description;
 }
 public void setDescription(String description) {
  this.description = description;
 }
 public String getMusicurl() {
  return musicurl;
 }
 public void setMusicurl(String musicurl) {
  this.musicurl = musicurl;
 }
 public String getHqmusicurl() {
  return hqmusicurl;
 }
 public void setHqmusicurl(String hqmusicurl) {
  this.hqmusicurl = hqmusicurl;
 }
 public String getThumb_media_id() {
  return thumb_media_id;
 }
 public void setThumb_media_id(String thumb_media_id) {
  this.thumb_media_id = thumb_media_id;
 }
}

(5)Articles图文集合封装对象

public class Articles {

 private Article[] articles;

 public Article[] getArticles() {
  return articles;
 }
 public void setArticles(Article[] articles) {
  this.articles = articles;
 }
}

(6)Article图文消息封装对象

public class Article {
 private String title;
 private String description;
 private String url;
 private String picurl;
 private String thumb_media_id;
 private String author; 
 private String content_source_url; 
 private String content; 
 private String digest; 
 private Integer show_cover_pic;

 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public String getDescription() {
  return description;
 }
 public void setDescription(String description) {
  this.description = description;
 }
 public String getUrl() {
  return url;
 }
 public void setUrl(String url) {
  this.url = url;
 }
 public String getPicurl() {
  return picurl;
 }
 public void setPicurl(String picurl) {
  this.picurl = picurl;
 }
 public String getThumb_media_id() {
  return thumb_media_id;
 }
 public void setThumb_media_id(String thumb_media_id) {
  this.thumb_media_id = thumb_media_id;
 }
 public String getAuthor() {
  return author;
 }
 public void setAuthor(String author) {
  this.author = author;
 }
 public String getContent_source_url() {
  return content_source_url;
 }
 public void setContent_source_url(String content_source_url) {
  this.content_source_url = content_source_url;
 }
 public String getContent() {
  return content;
 }
 public void setContent(String content) {
  this.content = content;
 }
 public String getDigest() {
  return digest;
 }
 public void setDigest(String digest) {
  this.digest = digest;
 }
 public Integer getShow_cover_pic() {
  return show_cover_pic;
 }
 public void setShow_cover_pic(Integer show_cover_pic) {
  this.show_cover_pic = show_cover_pic;
 }
}

(7)客服消息请求接口

public class CrmSendMessageService{

 private RestTemplate restTemplate ; 

 private String serviceHost = "https://api.weixin.qq.com";

 public CrmSendMessageServiceImpl() {
  restTemplate = RestTemplateFactory.makeRestTemplate();
 }

 @Override
 public WeixinResponse sendMessage(String accessToken, Message message) {
  WeixinResponse weixinResponse = null;
  String url = new StringBuffer(serviceHost).append("/cgi-bin/message/custom/send?access_token=")
    .append(accessToken).toString();
  weixinResponse = restTemplate.postForObject(url, message, WeixinResponse.class);
  return weixinResponse;
 }

}

注:接口发送http请求基于Spring RestTemplate。

参考文章地址:

1.Spring RestTemplate详解

(8)WeixinResponse客服消息接口返回对象

public class WeixinResponse {
 private String msgid;
 private String code;
 private int errcode;
 private String errmsg;

 public String getMsgid() {
  return msgid;
 }
 public void setMsgid(String msgid) {
  this.msgid = msgid;
 }
 public int getErrcode() {
  return errcode;
 }
 public void setErrcode(int errcode) {
  this.errcode = errcode;
 }
 public String getErrmsg() {
  return errmsg;
 }
 public void setErrmsg(String errmsg) {
  this.errmsg = errmsg;
 }
 public String getCode() {
  return code;
 }
 public void setCode(String code) {
  this.code = code;
 } 
}

5 接口实例开发

/**
 * 发送客服消息
 * @param openId 要发给的用户
 * @param accessToken 微信公众号token
 * @param weixinAppId 微信公众号APPID
 */
private void sendCustomMessage(String openId,String accessToken,String weixinAppId){
  try {
   RestTemplate rest = new RestTemplate();
   String postUrl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + accessToken;
   //推送图文消息
   Message message = new Message();
   message.setTouser(openId);//普通用户openid
   message.setMsgtype("news");//图文消息(点击跳转到外链)为news
   Articles news = new Articles();
   Article article = new Article();
   article.setDescription("客服消息图文描述");//图文消息/视频消息/音乐消息的描述
          article.setPicurl("http://mmbiz.qpic.cn/mmbiz_jpg/CDW6Ticice130g6RcXCkNNDWic4dEaAHQDia2OG5atHBqSvsPuCfuqoyeeLWENia4ciaKt3KHWQ9t2LRPDpUo5AkOyyA/0");//图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80
   article.setTitle("客服消息图文标题");//图文消息/视频消息/音乐消息的标题
   //图文推送链接
   String url="https://www.baidu.com";
   article.setUrl(url);//图文消息被点击后跳转的链接
   Article[] articles = {article};
   news.setArticles(articles);
   message.setNews(news);
   int i=1;
   while(i<=3){//循环发送3次
    WeixinResponse response = rest.postForObject(postUrl, message, WeixinResponse.class, new HashMap<String,String>());
    LOG.info("发送客服消息返回信息:"+response.toString());
    if(response.getErrcode()==0){//发送成功-退出循环发送
     i=4;
     break;
    }else{
     i++;//发送失败-继续循环发送
    }
   }
  } catch (Exception e) {
   LOG.error("发送客服消息失败,openId="+openId,e);
  }
 }

6 客服接口图文推送上传图片

在发送图文消息时,我们需要添加图片的地址,介绍一个好方法。

(1)进入微信公众平台接口调试工具

https://mp.weixin.qq.com/debug

(2)选择类型和列表

接口类型:基础支持

接口列表:上传logo接口/media/uploadimg

微信公众平台 客服接口发消息的实现代码(Java接口开发) 

添加access_token,选择类型是image,最后选择文件

注:添加视频、音乐是一样的

(3)最后就会生成图片的url

微信公众平台 客服接口发消息的实现代码(Java接口开发) 

(4)在浏览器访问url即可看见生成的图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
为超链接加上disabled后的故事
Dec 10 Javascript
基于jquery的3d效果实现代码
Mar 23 Javascript
JS 跳转页面延迟2种方法
Mar 29 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
May 10 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
Jul 28 Javascript
正则验证小数点后面只能有两位数的方法
Feb 28 Javascript
vue resource发送请求的几种方式
Sep 30 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
Nov 12 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 Javascript
JavaScript实现轮播图效果
Oct 30 Javascript
JavaScript函数柯里化实现原理及过程
Dec 02 Javascript
Vue Element UI自定义描述列表组件
May 18 Vue.js
vue获取时间戳转换为日期格式代码实例
Apr 17 #Javascript
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 #Javascript
vue 项目 iOS WKWebView 加载
Apr 17 #Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
Apr 17 #Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
Apr 17 #Javascript
抖音上用记事本编写爱心小程序教程
Apr 17 #Javascript
基于JS实现web端录音与播放功能
Apr 17 #Javascript
You might like
介绍php设计模式中的工厂模式
2008/06/12 PHP
PHP setcookie() cannot modify header information 的解决方法
2009/01/09 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
Bootstrap模块dropdown实现下拉框响应
2016/05/22 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python实现从URL地址提取文件名的方法
2015/05/15 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
python处理csv中的空值方法
2018/06/22 Python
Python List cmp()知识点总结
2019/02/18 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
Python实现井字棋小游戏
2020/03/09 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
驾驶员培训方案
2014/05/01 职场文书
医生见习报告范文
2014/11/03 职场文书
计算机实训心得体会
2016/01/14 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏