客服消息推送及图文消息发送,素材管理永久素材media_id登场
当微信公众号要给用户发送服务通知之际,客服消息接口乃是开发者颇为常用的工具当中的一个 ,它的规则约束和使用具体细节常常易于被忽略 。
客服消息接口的核心机制
微信客服消息不是能随时随地发送的,这是基于用户跟公众号产生特定互动才有的情况。比如说,当用户发送了消息,或者点击了菜单,又或者完成了支付之后,公众号会在48小时之内得到一个能向该用户主动发送消息的权限窗口。
此机制设计的最初目的是用以避免公众号借助接口去烦扰用户,开发者得去捕获由微信服务器推送而来的事件,且要在有效期限之内构造出JSON格式的数据包,借由POST请求去调动客服接口,如若一旦超时或者超出条数限定,发送就会失败 。
触发动作与消息条数限制
所能够触发客服接口的动作是被明确列举出来的,涵盖用户发送信息,订阅公众号,扫描二维码等情况。然而不同动作所准许的回复条数上限并非一致,举例来说,若用户主动发出消息,公众号可以进行多次回复,而某些事件类互动或许只准许回复一条 。
公众平台会对这个动作列表予以更新,开发者得持续留意官方文档。要是尝试发送超出限额的消息,接口会返回确切的错误码,这表明程序当中必须妥善进行异常处理,防止因发送失败对用户体验造成影响。
客服接口与永久素材管理
发送图片、语音等内容的早期客服接口,需要临时素材media_id,现在,该接口全面支持使用素材管理里的永久素材,这对开发者而言是一个重大利好。
这表明,开发者能够把常用的欢迎图文、操作指南之类,事先上传当作永久素材,获取其media_id之后,存到数据库或者配置文件里。在有需要发送之际,直接进行调用,用不着每次都临时上传,如此一来,既提高了响应速度,又减轻了服务器的负担。
客服图文消息的发送实践
客服图文消息属于常见的通知形式,为此其数据包结构有着特定要求。开发者得去构造一个JSON对象,这个对象要包含用户OpenID,消息类型得是“news”,还是图文素材数组。
图文数组之中,需对标题、描述、图片链接以及跳转网址进行详细设定。在实践期间,经常会出现的错误乃是图片链接失效,或者描述过长而遭遇被截断的情况。于测试之时,务必要在不同的手机客户端对效果予以预览,从而确保信息能够完整呈现。
常见开发问题与调试
进行开发期间最为常见的问题是没法收到客服所发送的消息。首先,应当去查验服务器是不是准确无误地接收并且解析了微信的事件推送,而此乃是获取48小时回复权限的前提条件。其次,要去查看接口调用的频率以及用户在当日接收的条数是不是已经达到了上限。
在进行调试之际,提议运用微信公众平台的开发者工具去模拟用户事件,并且查看日志里接口的返回码,举例来说,错误码45015意味着回复超时,48001意味着API功能未获授权,有针对性地展开排查能够迅速定位问题。
package com.bigbigbu.wx.tools.bean;
import java.util.List;
/**
* Title: SenderContent
* Description: 消息内容
* Company: 卜凡起的博客
* @author FANQIBU修改
* @date 2018年1月4日
*/
public class SenderContent {
/**
* @Fields mpnews : TODO 通过media_id发送图文消息
*/
private Media mpnews;
/**
* @Fields news : TODO 修改 增加 通过Article发送图文消息
*/
private News news;
public Media getMpnews() {
return mpnews;
}
public void setMpnews(Media mpnews) {
this.mpnews = mpnews;
}
public News getNews() {
return news;
}
public void setNews(News news) {
this.news = news;
}
/**
* 媒体包括图文语音视频图片
* @author antgan
*
*/
public static class Media{
private String media_id;
public Media() {
// TODO Auto-generated constructor stub
}
public Media(String media_id) {
this.media_id = media_id;
}
public String getMedia_id() {
return media_id;
}
public void setMedia_id(String media_id) {
this.media_id = media_id;
}
}
public static class News{
private List articles;
public News() {
// TODO Auto-generated constructor stub
}
public News(List articles) {
this.articles = articles;
}
public List getArticles() {
return articles;
}
public void setArticles(List articles) {
this.articles = articles;
}
}
public static class Article{
private String description;
private String title;
private String url;
private String picurl;
public Article() {
// TODO Auto-generated constructor stub
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
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;
}
}
}
接口的合理使用与边界
客服接口的关键作用在于服务,并非营销,它适用于像订单确认的场景,适用于物流通知的场景,适用于问题解答等提升服务体验的场景,滥用这个接口去做广告推送,有可能致使接口权限被限制,甚至公众号被封禁 。
开发者要把它当作提升用户满意度的手段,设计逻辑之际率先考虑消息的必要性与及时性,像在用户完成支付后马上发送购买成功的图文确认,如此能够有力消减负 荷用户的焦虑感。
package com.bigbigbu.wx.tools.bean;
import java.io.IOException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
/**
* Title: WxOpenidKfSender
* Description: 客服消息模型
* Company: 卜凡起的博客
* @author FANQIBU
* @date 2018年1月4日
*/
public class WxOpenidKfSender extends SenderContent {
private String touser;
private String msgtype;
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 String toJson() throws JsonGenerationException, JsonMappingException, IOException{
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(this);
}
}
你于运用客服消息入口时,碰到最为棘手的技术难题或者运营限制是啥呢?欢迎于评论区域分享你的履历,要是感觉此文有帮助,也请点赞予以支持。


