java实现微信公众号群发文本消息

微信开发平台:微信公众号开发文档

废话不多说,直接上代码

1、Controller层调用代码

	/**
	 * 群发消息
	 * @param user
	 * @return
	 */
	@RequestMapping(value="/groupMessage",method=RequestMethod.POST,produces ="application/json;charset=utf-8")
	public JSONObject Message(@RequestBody(required=false)JSONObject obje) {
    
    
		JSONObject result=new JSONObject();
		logger.info("-----------开始群发------------");
		String content=obje.getString("content");//群发内容
		Integer code=wechatMsg.GroupMessage(wechatMsg.getToken(),content);//群发消息
		if(code==0) {
    
    
			result.put("code",0);
			result.put("data","群发成功");
		}else {
    
    
			result.put("code",1201);
			result.put("data","微信群发消息失败");
		}
		return result;
	}

2、工具类WechatMsg代码,下面以群发文本消息为例,如果是实现群发文本消息(群发其它消息,如图片视频等,请参考微信公众号开发文档),可以直接复制,只需要修改XXX的地方代码就可以了

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.demo.entity.DataEntity;
@Component
public class WechatMsg {
    
    	
	/**
	 * 获取token
	 * 
	 * @return token
	 */
	public String getToken() {
    
    
		// 授予形式
		String grant_type = "client_credential";
		//应用ID
		String appid = "XXXXXXXXXXXXXXXXXXXXXXXXX";
		//密钥
		String secret = "XXXXXXXXXXXXXXXXXXXXXXXXX";
		// 接口地址拼接参数
		String getTokenApi = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grant_type + "&appid=" + appid
				+ "&secret=" + secret;
		String tokenJsonStr = doGetPost(getTokenApi, "GET", null);
		JSONObject tokenJson = JSONObject.parseObject(tokenJsonStr);
		String token = tokenJson.get("access_token").toString();
		System.out.println("获取到的TOKEN : " + token);
		return token;
	}
	/***
	 * 群发文本消息
	 * @param token
	 */
	public Integer GroupMessage(String token,String content) {
    
    
		// 接口地址
		String sendMsgApi = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token="+token;		
		 //整体参数map
        Map<String, Object> paramMap = new HashMap<String, Object>();
        //相关map
        Map<String, Object> dataMap1 = new HashMap<String, Object>();
        Map<String, String> dataMap2 = new HashMap<String, String>();
        dataMap1.put("is_to_all",true);//用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据tag_id发送给指定群组的用户
        dataMap1.put("tag_id",1);//群发到的标签的tag_id,参见用户管理中用户分组接口,若is_to_all值为true,可不填写tag_id
        dataMap2.put("content",content);//要推送的内容
        paramMap.put("filter",dataMap1);//用于设定图文消息的接收者
        paramMap.put("text", dataMap2);//文本内容
        paramMap.put("msgtype","text");//群发的消息类型,图文消息为mpnews,文本消息为text,语音为voice,音乐为music,图片为image,视频为video,卡券为wxcard
        String back=doGetPost(sendMsgApi,"POST",paramMap);
        System.out.println("群发返回:"+back);
        JSONObject jsonObject =JSONObject.parseObject(back);//String转JSONObject,
        Integer re=jsonObject.getInteger("errcode");
        return re;
	}
    /**
     * 调用接口 post
     * @param apiPath
     */
    public String doGetPost(String apiPath,String type,Map<String,Object> paramMap){
    
    
        OutputStreamWriter out = null;
        InputStream is = null;
        String result = null;
        try{
    
    
            URL url = new URL(apiPath);// 创建连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setInstanceFollowRedirects(true);
            connection.setRequestMethod(type) ; // 设置请求方式
            connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式
            connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
            connection.connect();
            if(type.equals("POST")){
    
    
                out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
                out.append(JSON.toJSONString(paramMap));
                out.flush();
                out.close();
            }
            // 读取响应
            is = connection.getInputStream();
            int length = (int) connection.getContentLength();// 获取长度
            if (length != -1) {
    
    
                byte[] data = new byte[length];
                byte[] temp = new byte[512];
                int readLen = 0;
                int destPos = 0;
                while ((readLen = is.read(temp)) > 0) {
    
    
                    System.arraycopy(temp, 0, data, destPos, readLen);
                    destPos += readLen;
                }
                result = new String(data, "UTF-8"); // utf-8编码
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                is.close();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
        return  result;
    }
}

3、如果你的需求是群发,那么到这里就结束了,如果需求是分组发(也就是is_to_all设为false时),需要先获取标签id,可以调用下面方法获取标签id,获取到的标签id填入上面代码中的tag_id变量。注意:下面代码中name的value值不能和公众号中已存在的标签名一样,调用下面代码成功后才能在公众号生成新标签

/**
	 * 调用这个方法获取标签ID后,还要在公众号上给标签添加用户
	 * @param token
	 * @return
	 */
	public Integer getTab(String token) {
    
    
		String sendMsgApi = "https://api.weixin.qq.com/cgi-bin/tags/create?access_token="+token;
		//整体参数map
        Map<String, Object> paramMap = new HashMap<String, Object>();
        //相关map
        Map<String, Object> dataMap1 = new HashMap<String, Object>();
        dataMap1.put("name","test6");//这里写你要创建的标签名
        paramMap.put("tag",dataMap1);
		String back=doGetPost(sendMsgApi,"POST",paramMap);
		System.out.println("请求获取标签接口返回:"+back);
		JSONObject jsonObject =JSONObject.parseObject(back).getJSONObject("tag");//String转JSONObject,
		Integer id=-1;//设id初始值为-1,如果最后返回id还是-1,代表获取标签失败
		if(jsonObject!=null) {
    
    
			id=jsonObject.getInteger("id");
		}
		return id;
	}

有什么不懂或建议可以直接评论,我会尽快解决

猜你喜欢

转载自blog.csdn.net/qq_41936224/article/details/111193337