微信公众平台 客服接口发消息的实现代码(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 相关文章推荐
告诉大家什么是JSON
Jun 10 Javascript
多个js与css文件的合并方法详细说明
Dec 26 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
Aug 07 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
Dec 12 Javascript
jQuery异步验证用户名是否存在示例代码
May 21 Javascript
javascript实现全角半角检测的方法
Jul 23 Javascript
form表单转Json提交的方法(推荐)
Sep 23 Javascript
bootstrap模态框实现拖拽效果
Dec 14 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
Feb 18 Javascript
vue中路由参数传递可能会遇到的坑
Dec 07 Javascript
在vue中获取token,并将token写进header的方法
Sep 26 Javascript
JS获取本地地址及天气的方法实例小结
May 10 Javascript
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
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
2007/11/30 Javascript
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
html超链接打开窗口大小的方法
2013/03/05 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
Python脚本实现集群检测和管理功能
2015/03/06 Python
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
Python学习之os模块及用法
2020/06/03 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
詹天佑教学反思
2014/04/30 职场文书
上班离岗检讨书
2014/09/10 职场文书
奖学金个人总结
2015/03/04 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
用电申请报告范文
2015/05/18 职场文书
边城读书笔记
2015/06/29 职场文书
详解Python中的for循环
2022/04/30 Python