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去取值)

 

调用微信发送消息,可以使用微信开放平台提供的API接口。以下是使用Java调用微信API发送消息的基本步骤: 1.注册微信开发者账号,并创建自己的应用程序,获取应用程序的AppID和AppSecret。 2.通过Java代码获取微信的Access Token,使用Access Token可以调用微信API。 3.构造消息内容,包括消息类型、接收者、内容等信息。 4.使用Java的HttpURLConnection或HttpClient等工具发送POST请求,将消息发送给微信API。 5.解析微信API返回的结果,判断消息是否发送成功。 以下是Java代码示例,用于发送文本消息: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class WeChatAPIUtil { // 获取Access Token的URL private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; // 发送消息的URL private static final String SEND_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN"; /** * 获取Access Token * @param appId 应用程序的AppID * @param appSecret 应用程序的AppSecret * @return Access Token */ public static String getAccessToken(String appId, String appSecret) { String accessToken = null; String url = ACCESS_TOKEN_URL.replace("APPID", appId).replace("APPSECRET", appSecret); try { URL accessTokenUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) accessTokenUrl.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); connection.connect(); InputStream inputStream = connection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder responseBuilder = new StringBuilder(); String line = null; while ((line = bufferedReader.readLine()) != null) { responseBuilder.append(line); } String response = responseBuilder.toString(); accessToken = response.substring(response.indexOf("access_token") + 15, response.indexOf(",", response.indexOf("access_token")) - 1); } catch (IOException e) { e.printStackTrace(); } return accessToken; } /** * 发送消息 * @param accessToken Access Token * @param openId 接收者的OpenID * @param content 消息内容 * @return 是否发送成功 */ public static boolean sendMessage(String accessToken, String openId, String content) { boolean result = false; String url = SEND_MESSAGE_URL.replace("ACCESS_TOKEN", accessToken); String message = "{\"touser\":\"" + openId + "\",\"msgtype\":\"text\",\"text\":{\"content\":\"" + content + "\"}}"; try { URL sendMessageUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) sendMessageUrl.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestProperty("Content-Type", "application/json;charset=utf-8"); connection.connect(); OutputStream outputStream = connection.getOutputStream(); outputStream.write(message.getBytes("UTF-8")); outputStream.flush(); outputStream.close(); InputStream inputStream = connection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder responseBuilder = new StringBuilder(); String line = null; while ((line = bufferedReader.readLine()) != null) { responseBuilder.append(line); } String response = responseBuilder.toString(); if (response.indexOf("errcode") == -1) { result = true; } } catch (IOException e) { e.printStackTrace(); } return result; } } ``` 使用示例: ```java public class Test { public static void main(String[] args) { // 公众号的AppID和AppSecret String appId = "your app id"; String appSecret = "your app secret"; // 接收者的OpenID String openId = "receiver's open id"; // 获取Access Token String accessToken = WeChatAPIUtil.getAccessToken(appId, appSecret); // 发送消息 boolean result = WeChatAPIUtil.sendMessage(accessToken, openId, "Hello, World!"); // 判断是否发送成功 if (result) { System.out.println("消息发送成功!"); } else { System.out.println("消息发送失败!"); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值