微信公众平台 客服接口发消息的实现代码(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 相关文章推荐
改进:论坛UBB代码自动插入方式
Dec 22 Javascript
JS Excel读取和写入操作(模板操作)实现代码
Apr 11 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
May 15 Javascript
JavaScript获取table中某一列的值的方法
May 06 Javascript
Javascript数组与字典用法分析
Dec 13 Javascript
uploadify多文件上传参数设置技巧
Nov 16 Javascript
javascript实现下拉提示选择框
Dec 29 Javascript
Treegrid的动态加载实例代码
Apr 29 Javascript
关于Vue组件库开发详析
Jul 01 Javascript
vue如何根据网站路由判断页面主题色详解
Nov 02 Javascript
前端开发之便利店收银系统代码
Dec 27 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
Feb 26 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
怎样去阅读一份php源代码
2009/08/21 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
flash javascript之间的通讯方法小结
2008/12/20 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
Python Trie树实现字典排序
2014/03/28 Python
浅谈Python中的闭包
2015/07/08 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
python实现k-means聚类算法
2018/02/23 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
24式加速你的Python(小结)
2019/06/13 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
animation和transition的区别
2020/10/12 HTML / CSS
新闻学专业应届生求职信
2013/11/08 职场文书
母校寄语大全
2014/04/10 职场文书
员工工作表现评语
2014/04/26 职场文书
微电影大赛策划方案
2014/06/05 职场文书
授权委托书
2015/01/28 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
结婚十年感言
2015/07/31 职场文书
欢送领导祝酒词
2015/08/12 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
Python find()、rfind()方法及作用
2022/12/24 Python