Java调用微信消息通知(订阅功能,也记录下java的进行GET与POST请求)

这段时间了解了一下微信小程序的订阅功能,用一篇文章记录下,首先需要了解下微信小程序的具体信息

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html

首先根据这个文档我们需要先带着appid和secret,这两个参数是之前用户授权腾讯小程序的手生成的,这时候再去请求腾讯的接口

此处根据第一个接口请求,grant_type是固定的,此处查看说明文档。

在Java代码中去请求该接口

public Map dealData(){
        Map map = new HashedMap();
        //1.根据cod去请求微信接口
        String resulturl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=XXXXXXXXXXX";
        //请求的http接口
        String param=resulturl;	//请求的发送的参数
        System.out.println(param);
        try {
            URL url = new URL(param);
            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            /**设置URLConnection的参数和普通的请求属性****start***/
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            conn.setRequestProperty("content-type","application/json");
            /**设置URLConnection的参数和普通的请求属性****end***/
            //设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
            //最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
            //post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("GET");//GET和POST必须全大写
            /**GET方法请求*****start*/
            conn.connect();
            /**GET方法请求*****end*/
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            while ((str = br.readLine()) != null) {
                str=new String(str.getBytes(),"UTF-8");//解决中文乱码问题
                JSONObject parseObject = JSONArray.parseObject(str);
                //调用腾讯接口返回回来的openid
                String access_token = (String) parseObject.get("access_token");
                //调用腾讯接口返回回来的openid
                Integer expires_in = (Integer)  parseObject.get("expires_in");
                map.put("access_token",access_token);
                map.put("expires_in",expires_in);
            }
            //关闭流
            is.close();
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

这里我设置的是请求腾讯接口,获得access_token和expires_in 也就是过期时间,

通过拿到这两个参数,这时候再进行下一步请求。

查看腾讯说明文档  https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html

第二步,需要POST请求腾讯接口,来进行消息通知发送

参考代码:

/***
     *
     *
     * 处理第二次请求腾讯接口
     *
     */
    public Map dealPostData(String template_id,JSONObject data,String access_token,String openid){
        // String template_id = "AAAAAAAAAAAAA";
        Map map = new HashedMap();
        //1.根据cod去请求微信接口
        String resulturl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+access_token;
        //请求的http接口
        String param=resulturl;	//请求的发送的参数
        System.out.println(param);
        try {
            URL url = new URL(param);
            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            OutputStreamWriter out = null ;
            /**设置URLConnection的参数和普通的请求属性****start***/
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            conn.setRequestProperty("content-type","application/json");
            /**设置URLConnection的参数和普通的请求属性****end***/
            //设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
            //最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
            //post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("POST");//GET和POST必须全大写

            //json格式的请求数据封装
            JSONObject params = new JSONObject();
            //params.put("access_token",access_token);
            params.put("touser",openid);
            params.put("template_id",template_id);
            params.put("page","/page/index/index");
            params.put("data",data);
            System.out.println(params.toString());

            //获取URLConnection对象对应的输出流并开始发送参数
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            //添加参数
            out.write(params.toString());
            out.flush();

            /**POST方法请求*****start*/
            conn.connect();
            /**POST方法请求*****end*/

            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            while ((str = br.readLine()) != null) {
                str=new String(str.getBytes(),"UTF-8");//解决中文乱码问题
                JSONObject parseObject = JSONArray.parseObject(str);
                map.put("result",parseObject);
            }
            //关闭流
            is.close();
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

其中的data数据,这两个只是两个工具类,具体在代码中的调用

 //2、进行消息通知
        JSONObject templateData = new JSONObject();
        Map thing1value = new HashedMap();
        thing1value.put("value",myPayStubs.getJobTitle());
        templateData.put("thing1",thing1value);

        Map amount2value = new HashedMap();
        amount2value.put("value",myPayStubs.getJobBmbackprice()+myPayStubs.getMonthPay());
        templateData.put("amount2",amount2value);

        JSONObject data = templateData;
        String template_id = "AAAAAAAAAAAAA";
        //1.先get请求到access_token
        Map map = dealData();
        //2.拿到access_token
        String access_token = (String) map.get("access_token");
        //3.根据access_token
        Map postmap = dealPostData(template_id,data,access_token,sysUserEntity.getOpenid());
        System.out.println("result:"+postmap.get("result"));

其中的template_id就是自己在小程序段设置的消息通知的模板的ID,最后需要在小程序端设置消息接收提醒,当调用该接口时候就能收到消息提醒

(注:其中的thing1,amount2都是设置的键值对的键值,模板中会根据thing1,amount2去取值)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值