前面的博客已经可以接受消息了,现在实现互动,给用户发送各种消息。
一、发送响应(普通)消息:即在接收事件推送中返回消息,如现在把普通用户发送的消息原样返回发送给用户。只需要把touser和fromuser反过来就可以了。
1、文本消息:MsgType值为text:
if("text".equals(type)){
String toUserName = reqMsg.getToUserName();
reqMsg.setFromUserName(toUserName);
reqMsg.setMsgType("text");
reqMsg.setToUserName(fromUserName);
}
此时完整的handleMessage处理消息代码为:
/**
* 处理微信消息
* @param request request
* @param reqMsg 请求消息
* @param respMsg 回复消息
* @param remoteIp remoteIp
*/
private void handleMessage(HttpServletRequest request, WechatMsg reqMsg, String remoteIp){
String type = reqMsg.getMsgType();
String fromUserName = reqMsg.getFromUserName();
String event = reqMsg.getEvent();
String eventKey = reqMsg.getEventKey();
//event事件开始
if(type.equals("event")){
//关注事件
if("subscribe".equals(event)){
WechatUser dbWechatUser = wechatUserService.getByOpenId(fromUserName);
if(dbWechatUser == null){
//还没有关注过
System.out.println("还没有关注过");
WechatUser wechatUser = new WechatUser();
wechatUser.setCreateTime(new Date());
wechatUser.setIsDelete(false);
wechatUser.setUpdateTime(new Date());
wechatUser.setUserOpenId(fromUserName);
wechatUserService.insert(wechatUser);
}
}
//取消关注事件
if("unsubscribe".equals(event)){
WechatUser dbWechatUser = wechatUserService.getByOpenId(fromUserName);
wechatUserService.delete(dbWechatUser);
}
//扫描带参数二维码关注事件(scene_id)
if("subscribe".equals(event) && eventKey.startsWith("qrscene_")){
//去掉前缀
Long key = Long.valueOf(eventKey.replace("qrscene_", ""));
if(sceneId == key || sceneId.equals(key)){
System.out.println("扫描带参数二维码关注");
QrCodeUser dbQrCodeUser = qrCodeUserService.getByOpenId(fromUserName);
if(dbQrCodeUser == null){
//还没有记录过
QrCodeUser qrCodeUser = new QrCodeUser();
qrCodeUser.setCreateTime(new Date());
qrCodeUser.setIsDelete(false);
qrCodeUser.setOpenId(fromUserName);
qrCodeUser.setSceneId(String.valueOf(sceneId));
qrCodeUser.setUpdateTime(new Date());
qrCodeUserService.insert(qrCodeUser);
}
}
}
//扫描带参数二维码浏览(已关注)事件(scene_id)
if("SCAN".equals(event)){
Long key = Long.valueOf(eventKey);
if(sceneId == key || sceneId.equals(key)){
System.out.println(fromUserName+"扫描带参数二维码已经关注");
}
}
/*//扫描带参数二维码关注事件(scene_str)
if("subscribe".equals(event) && eventKey.startsWith("qrscene_")){
//去掉前缀
String key = eventKey.replace("qrscene_", "");
if(scendStr.equals(key)){
System.out.println("扫描带参数二维码关注(scene_str)");
QrCodeUser dbQrCodeUser = qrCodeUserService.getByOpenId(fromUserName);
if(dbQrCodeUser == null){
//还没有记录过
QrCodeUser qrCodeUser = new QrCodeUser();
qrCodeUser.setCreateTime(new Date());
qrCodeUser.setIsDelete(false);
qrCodeUser.setOpenId(fromUserName);
qrCodeUser.setSceneId(String.valueOf(sceneId));
qrCodeUser.setUpdateTime(new Date());
qrCodeUserService.insert(qrCodeUser);
}
}
}
//扫描带参数二维码浏览(已关注)事件(scene_str)
if("SCAN".equals(event)){
if(scendStr.equals(eventKey)){
System.out.println(fromUserName+"扫描带参数二维码已经关注(scene_str)");
}
}*/
}
//event事件结束
//text事件开始
if("text".equals(type)){
String toUserName = reqMsg.getToUserName();
reqMsg.setFromUserName(toUserName);
reqMsg.setMsgType("text");
reqMsg.setToUserName(fromUserName);
}
}
测试,发送文本消息正常回复,发送图片,会出现异常。下面实现图片回复功能。
2、图片消息:
二、主动发送消息:即与用户在没有发生交互事件下发送的消息(非接收推送下的消息),如用户参与拼团,成功后在定时job中主动给用户发送消息
api接口为:
/**
* 客服消息地址
*/
public static final String CUSTOMER_SERVICE_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";
/**
* 发送指定类型的消息给用户
* @param msgtype 消息类型
* @param openId 发送消息给用户
* @param content 文本内容
* @param mediaId 素材id
* @return
*/
public void sendMessage(String msgtype, String openId, String content, String mediaId) {
try {
WechatSendMsg wechatSendMsg = new WechatSendMsg();
wechatSendMsg.setTouser(openId);
if (WechatMsgTypeEnum.TEXT.getType().equals(msgtype)) { // 发送文本消息
wechatSendMsg.setMsgtype(WechatMsgTypeEnum.TEXT.getType());
WechatTextMsg wechatTextMsg = new WechatTextMsg();
wechatTextMsg.setContent(content);
wechatSendMsg.setText(wechatTextMsg);
} else if (WechatMsgTypeEnum.IMAGE.getType().equals(msgtype)) { // 发送图片消息
wechatSendMsg.setMsgtype(WechatMsgTypeEnum.IMAGE.getType());
WechatImageMsg wechatImageMsg = new WechatImageMsg();
wechatImageMsg.setMedia_id(mediaId);
wechatSendMsg.setImage(wechatImageMsg);
} else {
return;
}
String message = JSONUtils.toJSONString(wechatSendMsg, SerializerFeature.DisableCircularReferenceDetect);
AccessToken accessToken = AccessTokenMgrTask.getGroupAccessToken();
if (accessToken != null) {
String postURL = CUSTOMER_SERVICE_URL.replace("ACCESS_TOKEN", accessToken.getToken());
JSONObject jsonObject = WeixinUtil.httpRequest(postURL, "POST", message);
if (jsonObject.containsKey("errcode") && jsonObject.getInteger("errcode") != 0) {
logger.error(jsonObject.toString());
// 重试一次
redisClient.del("wechat:accesstoken:{appId}", AccessTokenMgrTask.GROUP_APPID);
accessToken = AccessTokenMgrTask.getGroupAccessToken();
if (accessToken != null) {
postURL = CUSTOMER_SERVICE_URL.replace("ACCESS_TOKEN", accessToken.getToken());
jsonObject = WeixinUtil.httpRequest(postURL, "POST", message);
if (jsonObject.containsKey("errcode") && jsonObject.getInteger("errcode") != 0) {
logger.error(jsonObject.toString());
}
}
}
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}