微信小程序订阅推送消息(JAVA)

本文详细介绍了如何通过微信API获取用户openid,包括code处理、access_token获取,以及使用Gson发送模板消息的过程。核心内容涉及openid获取、token刷新和模板消息推送的实现细节。
摘要由CSDN通过智能技术生成
想要推送订阅消息首先就需要获取每个微信用户唯一的openid,openid通过从前端传过来的code里面获取

获取openid的方法

		
		String code = req.getParameter("code");
        String url = "https://api.weixin.qq.com/sns/jscode2session";
        url += "?appid=  ";//自己的appid
        url += "&secret=   ";//自己的appSecret
        url += "&js_code=" + code;
        url += "&grant_type=authorization_code";
        url += "&connect_redirect=1";
        String res = null;
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // DefaultHttpClient();
        HttpGet httpget = new HttpGet(url);    //GET方式
        CloseableHttpResponse response = null;
        // 配置信息
        RequestConfig requestConfig = RequestConfig.custom()          // 设置连接超时时间(单位毫秒)
                .setConnectTimeout(5000)                    // 设置请求超时时间(单位毫秒)
                .setConnectionRequestTimeout(5000)             // socket读写超时时间(单位毫秒)
                .setSocketTimeout(5000)                    // 设置是否允许重定向(默认为true)
                .setRedirectsEnabled(false).build();           // 将上面的配置信息 运用到这个Get请求里
        httpget.setConfig(requestConfig);                         // 由客户端执行(发送)Get请求
        response = httpClient.execute(httpget);                   // 从响应模型中获取响应实体
        HttpEntity responseEntity = response.getEntity();
        System.out.println("响应状态为:" + response.getStatusLine());
        if (responseEntity != null) {
            res = EntityUtils.toString(responseEntity);
            System.out.println("响应内容长度为:" + responseEntity.getContentLength());
            System.out.println("响应内容为:" + res);
        }
        // 释放资源
        if (httpClient != null) {
            httpClient.close();
        }
        if (response != null) {
            response.close();
        }
        JSONObject jo = JSON.parseObject(res);
//	        String openId= jo.getString("req_id");
        String openId = jo.getString("openid");
		System.out.println("code" + code);
        System.out.println("openid" + openId);
        Map<String,Object> map = new HashMap<>();
        map.put("openId", openId);
        OutputStream out = resp.getOutputStream();
		Gson gson = new Gson();
		out.write(gson.toJson(map,Map.class).getBytes("utf-8"));
		out.close();
	    }
}

除了获取openid之外还需要获token,需要appid和secret(在微信开发端获取)

        public String getAccessToken() {
            String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+"    appid   "+"&secret="+"   secret   ";
            JSONObject jsonObject = ProgramHttpRequest.doGet(url);
            System.out.println(jsonObject.toString());
            String errCode = jsonObject.getString("expires_in");
            if (!StringUtils.isEmpty(errCode)  && !StringUtils.isEmpty(jsonObject.getString("access_token").toString())) {

//                logger.info("token获取成功,内容={}", jsonObject.toJSONString());
                String token = jsonObject.get("access_token").toString();
                return token;
            } else {
//                logger.error("token获取失败,内容={}", jsonObject.toJSONString());
                return null;
            }
       }
         public static JSONObject doGet(String url) {
//            logger.info("执行get请求开始");
            CloseableHttpClient client = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet(url);
            JSONObject jsonObject = null;
            try {
                HttpResponse httpResponse = client.execute(httpGet);
                HttpEntity entity = httpResponse.getEntity();
                if (entity != null) {
                    String result = EntityUtils.toString(entity, "UTF-8");
                    jsonObject = JSONObject.parseObject(result);
                }
//                logger.info("执行get请求结束");
            } catch (Exception e) {
//                logger.error("执行get请求异常");
                e.printStackTrace();
            } finally {
                try {
                    //        释放连接
                    httpGet.releaseConnection();
                    client.close();
                } catch (IOException e) {
//                    logger.error("执行get请求流关闭异常");
                    e.printStackTrace();
                }
            }

            return jsonObject;
        }

然后就可以推送消息了,模板id也是从开发平台获取

       //发送订阅消息
        RestTemplate restTemplate = new RestTemplate();
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+getAccessToken();
        //拼接推送的模版
        String openId = (String) maps.get("mobile");
        WxMssVo wxMssVo = new WxMssVo();
        wxMssVo.setTouser(openId);//用户的openid(要发送给那个用户,通常这里应该动态传进来的)
        wxMssVo.setTemplate_id("   订阅消息模板id  ");//订阅消息模板id
//        wxMssVo.setPage("pages/index/index");

        Map<String, TemplateData> hashMap = new HashMap<>(4);
        Map<String,Object> map = new HashMap<>();
        TemplateData templateData = new TemplateData();
        templateData.setValue( (String)maps.get("user"));
        DBSession session = DataBaseUtil.getHibernateSession();
        String name5 = (String) maps.get("user");
        String phrase4 = (String) maps.get("opinion");
        if ("pass".equals(phrase4)) {
			phrase4 = "通过";
		}else if("back".equals(phrase4)){
			phrase4 = "驳回";
		}
       //我要获取当前的日期
        Date date = new Date();
        //设置要获取到什么样的时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //获取String类型的时间
        String createdate = sdf.format(date);
        //这里是发送消息的内容,map里面的key值必须和设置推送模板消息一致
        hashMap.put("name5",new TemplateData(name5));
        hashMap.put("phrase4",  new TemplateData(phrase4));
        hashMap.put("date3", new TemplateData(createdate));
        //TODO
        hashMap.put("thing7", new TemplateData("您有一条消息请查看"));//消息内容    先写死后续在修改
   
        wxMssVo.setData(hashMap);
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVo, String.class);
        
        return responseEntity.getBody();

	}

//推送模板消息key值的官方规定
在这里插入图片描述
发送消息的实体

public class WxMssVo {
	
	private String touser;//用户openid
	private String template_id;//订阅消息模版id
    private String page = "pages/index/index";//默认跳到小程序首页
    private Map<String, TemplateData> data;//推送文字
    private DateFormat creatdate;
    
    public DateFormat getCreatdate() {
		return creatdate;
	}
	public void setCreatdate(DateFormat creatdate) {
		this.creatdate = creatdate;
	}
	
    
    public String getTouser() {
		return touser;
	}
	public void setTouser(String touser) {
		this.touser = touser;
	}
	public String getTemplate_id() {
		return template_id;
	}
	public void setTemplate_id(String template_id) {
		this.template_id = template_id;
	}
	public String getPage() {
		return page;
	}
	public void setPage(String page) {
		this.page = page;
	}
	public Map<String, TemplateData> getData() {
		return data;
	}
	public void setData(Map<String, TemplateData> hashMap) {
		this.data = hashMap;
	}
    @Override
	public String toString() {
		return "WxMssVo [touser=" + touser + ", template_id=" + template_id
				+ ", page=" + page + ", data=" + data + ", creatdate="
				+ creatdate + "]";
	}
	
}
public class TemplateData {
	private String value;
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public TemplateData(String value) {
        this.value = value;
    }
    public TemplateData() {
    }
}

总结一下所需参数:
openid,从前端传过来的code里面获取
模板id,在微信开发平台中设置推送消息模板的时候获取
appid,微信开发平台中获取
secret,微信开发平台中获取

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中实现小程序消息推送,你可以按照以下步骤进行操作: 1. 创建一个Vo类来封装传送的参数。你可以使用Lombok库来简化代码,例如创建一个名为TemplateDataVo的类,其中包含一个value属性用于封装消息内容。 2. 创建一个名为WxMssVo的类,用于封装小程序推送所需的数据。该类应包含以下属性: - touser:用户的openid - template_id:模板id - page:跳转路径(默认为小程序首页) - data推送消息内容,使用Map<String, TemplateDataVo>来封装 3. 在WxMssVo类中定义好属性后,你可以将其提供给Java的其他代码调用,或者提供一个接口供外界传入openid并推送相应的消息。 总结起来,你需要定义好Vo类来封装传送的参数,包括消息内容、用户openid、模板id等。然后,你就可以通过调用相关代码或提供接口来实现小程序消息推送功能。123 #### 引用[.reference_title] - *1* [java编写微信小程序消息提醒推送](https://blog.csdn.net/weixin_55823910/article/details/130558549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [java实现小程序订阅消息推送(附源码)](https://blog.csdn.net/qq_41940721/article/details/119945990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值