参考连接点击打开链接
模板消息不好审核通过,因此有时候我们需要发送客服消息。
客服消息在发送“图文消息”的时候不会夹带客服图标,而是一整块的消息,体验相对比较好。
下边描述一下发送客服消息的大概过程。
1、公众号配置
发送客服消息需要应用的服务响应在线,因此首先在公众平台进行配置(开发->基本配置),如图所示:
需要注意的是:
应用在线,代码如下所示:
// 微信加密签名
String st = request.getParameter("signature");
// 随机字符串
String ec = request.getParameter("echostr");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
Arrays.sort({ token, timestamp, nonce };);
String bigStr = str[0] + str[1] + str[2];
// 加密
String digest = new SHA1().getDigestOfString(bigStr.getBytes()).toLowerCase();
// 确认请求来至微信
if (digest.equals(signature)) {
response.getWriter().print(echostr);
}
token是在配置的时候填写的token中的字符串,微信服务器在收到以上响应的时候将会成功配置
2、发送客服消息
a/用户需要是公众号的关注用户;
b/获取accesstoken,在之前的文章中有获取的方法,就不再赘述;
发送代码如下:
public static java.util.Map<String,Object> sendCustomerServiceMessTo(final String openId, final String appid, final String secret){ java.util.Map<String,Object> retCode = new java.util.HashMap<String,Object>(3);
if(jsApiTicketToken.getAccess_token() == null|| "".equals(jsApiTicketToken.getAccess_token()))return null;final java.util.Map<String,String> bussData_First = new java.util.HashMap<String,String>(){private static final long serialVersionUID = 1L;{put("title","Happy Day");put("description","Is Really A Happy Day");put("url","详情地址");put("picurl","图片地址");}};final java.util.ArrayList<java.util.Map<String,String>> bussData_List = new java.util.ArrayList<java.util.Map<String,String>>(1);final java.util.Map<String,java.util.ArrayList<java.util.Map<String,String>>> articleMap= new java.util.HashMap<String,java.util.ArrayList<java.util.Map<String,String>>>(1);bussData_List.add(bussData_First);articleMap.put("articles", bussData_List);java.util.Map<String,Object> postData = new java.util.HashMap<String,Object>(){private static final long serialVersionUID = 1L;{put("touser",openId);put("msgtype","news");put("news",articleMap);}};String postDataJsonString = JSON.toJSONString(postData);HttpUriRequest httpUriRequest = RequestBuilder.post().setUri("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="+jsApiTicketToken.getAccess_token()).addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8").setEntity(new StringEntity(postDataJsonString, Charset.forName("utf-8"))).build();Ret messvo = LocalHttpClient.executeJsonResult(httpUriRequest, Ret.class);retCode.put("1", messvo);return retCode;}TicketToken jsApiTicketToken = getToken(appid,secret);
public class Ret { private int errcode; private String errmsg; private long 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 long getMsgid() { return msgid; } public void setMsgid(long msgid) { this.msgid = msgid; } }
public class TicketToken { private String access_token; private int expires_in; private int errcode; private String errmsg; public String getAccess_token() { return access_token; } public void setAccess_token(String access_token) { this.access_token = access_token; } public int getExpires_in() { return expires_in; } public void setExpires_in(int expires_in) { this.expires_in = expires_in; } 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 static JsApiTicketToken getToken (String appid, String secret){ HttpUriRequest httpUriRequest = RequestBuilder.get() .setUri("https://api.weixin.qq.com/cgi-bin/token") .addParameter("grant_type","client_credential") .addParameter("appid",appid) .addParameter("secret",secret) .build(); return LocalHttpClient.executeJsonResult(httpUriRequest, JsApiTicketToken.class); }