公众号开发(六)----发送消息

前面的博客已经可以接受消息了,现在实现互动,给用户发送各种消息。

一、发送响应(普通)消息:即在接收事件推送中返回消息,如现在把普通用户发送的消息原样返回发送给用户。只需要把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);
        }
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值