1. 官方文档
- 因为微信服务器发送消息时,5秒不回复则会重试,倘若我们的服务器处理数据或者网络的原因没有及时回复,将会造成不好的结果
- 可以选择给予微信服务器回复,再异步调客服接口给予用户回复
2. 实现
-
支持发送
文本消息
、图片消息
、语音消息
、视频消息
、音乐消息
、图文消息
、菜单消息
、卡券
等消息-
发送的是
Json
数据-
文本消息示例
{ "touser":"OPENID", "msgtype":"text", "text": { "content":"Hello World" } }
-
-
共有字段
/** * 发送的用户 */ @JsonProperty("touser") protected String toUser; /** * 消息类型 */ @JsonProperty("msgtype") protected String msgType;
-
文本消息、图片消息示例
import com.small.nine.wxmp.common.constant.WxConstant; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.HashMap; import java.util.Map; /** * 客服发送 文本信息 * * @author sheng_zs@126.com * @date 2021-08-06 16:54 */ @Data @EqualsAndHashCode(callSuper = true) public class WxKfTextMsgBean extends WxKfMsgBaseBean { private static final long serialVersionUID = 1L; /** * 消息内容<br> * 支持插入跳小程序的文字链:<br> * {@literal <a href="http://www.qq.com" data-miniprogram-appid="appid" data-miniprogram-path="pages/index/index">点击跳小程序</a>} * <ol> * <li>data-miniprogram-appid 项,填写小程序appid,则表示该链接跳小程序;</li> * <li>data-miniprogram-path项,填写小程序路径,路径与app.json中保持一致,可带参数;</li> * <li>对于不支持data-miniprogram-appid 项的客户端版本,如果有herf项,则仍然保持跳 href 中的网页链接;</li> * <li>data-miniprogram-appid对应的小程序必须与公众号有绑定关系。</li> * </ol> */ private Map<String, String> text; /** * 初始化,并返回 * * @param toUser 发送对象 * @param content 消息内容 * @return {@link WxKfTextMsgBean} */ public static WxKfTextMsgBean getInstance(String toUser, String content) { WxKfTextMsgBean msgBean = new WxKfTextMsgBean(); msgBean.setToUser(toUser); msgBean.setMsgType(WxConstant.MSG_TYPE_TEXT); Map<String, String> map = new HashMap<>(); map.put(WxConstant.PARAM_CONTENT, content); msgBean.setText(map); return msgBean; } }
import com.small.nine.wxmp.common.constant.WxConstant; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.HashMap; import java.util.Map; /** * 客服返回 图片信息 * * @author sheng_zs@126.com * @date 2021-08-06 17:00 */ @Data @EqualsAndHashCode(callSuper = true) public class WxKfImageMsgBean extends WxKfMsgBaseBean { private static final long serialVersionUID = 1L; /** * 图片内容 */ private Map<String, String> image; /** * 初始化,并返回 * * @param toUser 发送对象 * @param mediaId 图片 ID * @return {@link WxKfImageMsgBean} */ public static WxKfImageMsgBean getInstance(String toUser, String mediaId) { WxKfImageMsgBean msgBean = new WxKfImageMsgBean(); msgBean.setToUser(toUser); msgBean.setMsgType(WxConstant.MSG_TYPE_IMAGE); // 图片信息 Map<String, String> map = new HashMap<>(); map.put(WxConstant.PARAM_MEDIA_ID, mediaId); msgBean.setImage(map); return msgBean; } }
-
-
serviceImpl
import cn.hutool.http.HttpUtil; import com.small.nine.wxmp.common.constant.WxConstant; import com.small.nine.wxmp.domain.bean.wx.WxInMsgBean; import com.small.nine.wxmp.domain.bean.wx.kf.msg.WxKfImageMsgBean; import com.small.nine.wxmp.domain.bean.wx.kf.msg.WxKfNewsMsgBean; import com.small.nine.wxmp.domain.bean.wx.kf.msg.WxKfTextMsgBean; import com.small.nine.wxmp.service.WxAsyncService; import com.small.nine.wxmp.service.WxService; import com.small.nine.wxmp.utils.wx.JsonUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * @author sheng_zs@126.com * @date 2021-08-06 17:40 */ @Slf4j @Service public class WxAsyncServiceImpl implements WxAsyncService { @Resource private WxService wxService; @Async @Override public void kfSend(WxInMsgBean msgBean) { String msg = ""; log.info("微信+++++异步处理+++++ one +++++ WxInMsgBean: {}", msgBean.toString()); switch (msgBean.getMsgType()) { case WxConstant.MSG_TYPE_TEXT: // 处理 文本信息 msg = JsonUtils.writeValueAsString(WxKfTextMsgBean.getInstance(msgBean.getFromUserName(), msgBean.getContent())); break; case WxConstant.MSG_TYPE_IMAGE: // 处理图片信息 msg = JsonUtils.writeValueAsString(WxKfImageMsgBean.getInstance(msgBean.getFromUserName(), msgBean.getMediaId())); break; case WxConstant.MSG_TYPE_EVENT: // 处理事件 switch (msgBean.getEvent()) { case WxConstant.EVENT_TYPE_SUBSCRIBE: // 用户关注公众号 msg = JsonUtils.writeValueAsString(WxKfNewsMsgBean.getInstance(msgBean.getFromUserName(), "http://www.baidu.com", "http://mmbiz.qpic.cn/mmbiz_jpg/8IpUia88gYWiaj07aFP5jcHH5gDlicXhlgNwS2gxfEbC1T4NLGAr9qowOPLHIXBHFhewUxaogqcDMHgcmnZyt5MibA/0", "title", "说明")); break; case WxConstant.EVENT_TYPE_UNSUBSCRIBE: // 用户取消关注 // 加入黑名单、删除数据库等操作 break; default: msg = JsonUtils.writeValueAsString(WxKfTextMsgBean.getInstance(msgBean.getFromUserName(), "事件推送:" + msgBean.getEvent())); break; } break; default: msg = JsonUtils.writeValueAsString(WxKfTextMsgBean.getInstance(msgBean.getFromUserName(), "请发送图片或者文字内容!")); break; } log.info("回复信息 msg: {}", msg); // 调用接口 final String url = String.format(WxConstant.URL_CUSTOM_SEND_POST, wxService.getAccessToken()); String post = HttpUtil.post(url, msg); log.info("微信+++++异步处理+++++ end +++++ 发送结果:{}", post); } }