首页 > 其他分享 >微信公众号相关

微信公众号相关

时间:2023-10-18 16:46:13浏览次数:37  
标签:return String accessToken 微信 new 公众 JSONObject put 相关


import com.alibaba.fastjson.JSONObject;
import okhttp3.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.MessageFormat;

public class WeChatTemplateMessageSender {
    public static final String WX_APPID = "xxx";
    public static final String WX_APPSECRET = "xxx";
    public static final String WX_TEMPLATEID = "xxx";

    public static void main(String[] args) {

        String appId = WX_APPID;
        String appSecret = WX_APPSECRET;
        String openId = "xxx";
        String templateId = WX_TEMPLATEID;
        String accessToken = getAccessToken(appId, appSecret);
        System.out.println(accessToken);
        Boolean aBoolean = userIsFollowPublic(accessToken, openId);
        System.out.println(aBoolean);
        // 构造模板消息的数据
        JSONObject data = buildTemplateData();
        // 构造请求参数
        JSONObject params = new JSONObject();
        params.put("touser", openId);
        params.put("template_id", templateId);
        params.put("url", "www.baidu.com");
        params.put("data", data);
        boolean isMessageSent = sendTemplateMessage(accessToken, params);

        if (isMessageSent) {
            System.out.println("模板消息发送成功");
        } else {
            System.out.println("模板消息发送失败");
        }

        String sceneStr = "123"; // 替换为您的场景值
        int expireSeconds = 2592000; // 替换为您的二维码有效时间,单位为秒

        String ticket = generateQRCodeTicket(accessToken, sceneStr, expireSeconds);
        if (ticket != null) {
            String qrCodeUrl = getQRCodeImageUrl(ticket);
            System.out.println("二维码图片URL: " + qrCodeUrl);
        }
    }


    /**
     * 发送模板消息
     * @param accessToken
     * @param params
     * @return
     */
    public static Boolean sendTemplateMessage(String accessToken, JSONObject params) {
        // 发送消息请求
        OkHttpClient client = new OkHttpClient();
        RequestBody body = RequestBody.create(MediaType.get("application/json; charset=utf-8"), params.toString());
        Request request = new Request.Builder()
                .url("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken)
                .post(body)
                .build();

        try (Response response = client.newCall(request).execute()) {
            String s = response.body().string();
            System.out.println(s);
            if (s.contains("\"errcode\":0")) {
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        return false;
    }

    /**
     * 获取accessToken
     * @param appId
     * @param appSecret
     * @return
     */
    public static String getAccessToken(String appId, String appSecret) {
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
        String accessToken = "";

        try {
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");

            int responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                // 解析返回的JSON数据,获取access_token
                // 注意:实际开发中,建议使用JSON解析库来解析JSON数据
                String jsonString = response.toString();
                int startIndex = jsonString.indexOf("\"access_token\":\"") + 16;
                int endIndex = jsonString.indexOf("\",\"expires_in\"");
                accessToken = jsonString.substring(startIndex, endIndex);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return accessToken;
    }


    /**
     * 用户是否关注公众号
     * @param token
     * @param openid
     * @return
     */
    public static Boolean userIsFollowPublic(String token, String openid) {
        Integer subscribe = 0;
        String url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN";
        url = MessageFormat.format(url, token, openid);
        try {
            URL urlGet = new URL(url);
            HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
            http.setRequestMethod("GET"); // 必须是get方式请求
            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            http.setDoOutput(true);
            http.setDoInput(true);
            http.connect();
            InputStream is = http.getInputStream();
            int size = is.available();
            byte[] jsonBytes = new byte[size];
            is.read(jsonBytes);
            String message = new String(jsonBytes, "UTF-8");
            JSONObject demoJson = JSONObject.parseObject(message);
            subscribe = demoJson.getIntValue("subscribe"); // 此字段为关注字段  关注为1 未关注为0
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 1 == subscribe;
    }

    private static JSONObject buildTemplateData() {
        JSONObject data = new JSONObject();

        JSONObject first = new JSONObject();
        first.put("value", "Hello, World!");
        first.put("color", "#173177");

        JSONObject keyword1 = new JSONObject();
        keyword1.put("value", "Keyword 1");
        keyword1.put("color", "#173177");

        JSONObject keyword2 = new JSONObject();
        keyword2.put("value", "Keyword 2");
        keyword2.put("color", "#173177");

        JSONObject keyword3 = new JSONObject();
        keyword3.put("value", "Keyword 3");
        keyword3.put("color", "#173177");

        JSONObject keyword4 = new JSONObject();
        keyword4.put("value", "Keyword 4");
        keyword4.put("color", "#173177");

        JSONObject keyword5 = new JSONObject();
        keyword5.put("value", "Keyword 5");
        keyword5.put("color", "#173177");

        JSONObject remark = new JSONObject();
        remark.put("value", "This is a sample template message.");
        remark.put("color", "#173177");

        data.put("first", first);
        data.put("keyword1", keyword1);
        data.put("keyword2", keyword2);
        data.put("keyword3", keyword3);
        data.put("keyword4", keyword4);
        data.put("keyword5", keyword5);
        data.put("remark", remark);

        return data;
    }


    /**
     * 生成公众号二维码
     * @param accessToken
     * @param sceneStr
     * @param expireSeconds
     * @return
     */
    public static String generateQRCodeTicket(String accessToken, String sceneStr, int expireSeconds) {
        OkHttpClient client = new OkHttpClient();
        RequestBody body = RequestBody.create(MediaType.get("application/json; charset=utf-8"), getRequestBody(sceneStr, expireSeconds));
        Request request = new Request.Builder()
                .url("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + accessToken)
                .post(body)
                .build();
        try (Response response = client.newCall(request).execute()) {
            String s = response.body().string();
            System.out.println(s);
            JSONObject jsonObject = JSONObject.parseObject(s);
            String ticket = jsonObject.getString("ticket");
            if (ticket != null && !ticket.isEmpty()) {
                return ticket;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String getQRCodeImageUrl(String ticket) {
        return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;
    }

    public static String getRequestBody(String sceneStr, int expireSeconds) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("expire_seconds", expireSeconds);
        jsonObject.put("action_name", "QR_STR_SCENE");
        JSONObject actionInfo = new JSONObject();
        JSONObject scene = new JSONObject();
        scene.put("scene_str", sceneStr);
        actionInfo.put("scene", scene);
        jsonObject.put("action_info", actionInfo);
        return jsonObject.toString();
    }

}

标签:return,String,accessToken,微信,new,公众,JSONObject,put,相关
From: https://www.cnblogs.com/mengzhao/p/17772721.html

相关文章

  • 如何注册微信小程序
    前言因为最近沉迷和朋友们一起下班去打麻将,他们推荐了一个计分的小程序,就不需要每局都转账或者用扑克牌记录了,但是这个小程序不仅打开有广告,各个页面都植入了广告,用起来十分不适。于是我就心里暗自下定决心,一定要撸一个没有广告的小程序。一周后,这个小程序发布了。欢迎大家参观......
  • 如何注册微信小程序
    前言因为最近沉迷和朋友们一起下班去打麻将,他们推荐了一个计分的小程序,就不需要每局都转账或者用扑克牌记录了,但是这个小程序不仅打开有广告,各个页面都植入了广告,用起来十分不适。于是我就心里暗自下定决心,一定要撸一个没有广告的小程序。一周后,这个小程序发布了。欢迎大家参观......
  • pytorch 量化相关参考
    ref:https://blog.csdn.net/znsoft/article/details/130788437importtorchimporttorch.quantizationclassM(torch.nn.Module):def__init__(self):super(M,self).__init__()self.quant=torch.quantization.QuantStub()#静态量化时量化桩......
  • 易语言关于微信收款监控软件写法的思考
    想写微信收款监控,正规途径是企业认证申请sdk。可是这个确实是有门槛的,好像每年都要交不少的钱,好像是,具体我也不记得了。如果能够监控收款,就可以利用微信写自动成交工具。很多卖虚拟的,就可以实现自动发卡。所以很多人就想走其他的捷径,看能不能绕过官方,自己监控。最简单的......
  • 微信小程序分包体积优化建议
    代码包体积优化启动性能优化最直接的手段是降低代码包大小,代码包大小直接影响了下载耗时,影响用户启动小程序时的体验。开发者可以采取以下手段优化代码包体积:1.合理使用分包加载推荐所有小程序使用使用分包加载是优化小程序启动耗时效果最明显的手段。建议开发者按照功......
  • Qt SQL API相关操作
    作者:苏丙榅链接:https://subingwen.cn/qt/qt-db/?highlight=sql来源:爱编程的大丙著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。另外,推荐野火关于sqlite 的文档:https://doc.embedfire.com/linux/qt/embed/zh/latest/ebf_qt/senior/qt_sqlite.html......
  • PHP微信墙制作,开源
    注意:由于微信官网不定时会更新,其中模拟登陆以及爬取数据的方式可能会失效,最近这12个月里,就有两次更新导致此功能需要重写。服务端源码->github地址传送门思路其实实现思路就是通过模拟登陆的方式登录到微信平台,然后通过正则表达式获取指定的内容放到数据库里面,同时这个操作要......
  • c# RSA相关 加密 签名 PEM - XML互相转换
    安装nugetPortable.BouncyCastleusingOrg.BouncyCastle.Asn1.Pkcs;usingOrg.BouncyCastle.Asn1.X509;usingOrg.BouncyCastle.Crypto;usingOrg.BouncyCastle.Crypto.Parameters;usingOrg.BouncyCastle.Math;usingOrg.BouncyCastle.Pkcs;usingOrg.BouncyCastle.Se......
  • 编码相关总结
    编码相关总结一:基础字符集:字符的集合,如ASCII是英文字符集,Unicode是最全的字符集,GB2312是汉字字符集。编码方式:字符集的字节表示方式,定义了一个字符用几个字节,用那些字节(码点)表示这个字符。关系:一个字符集至少有一种编码方式,如Unicode有utf-8和utf-16等编码方式......
  • 微信小程序自定义 底部状态栏 闪烁
    微信小程序底部状态栏,自定义组件时,会出现闪烁情况,这个没有办法结局https://blog.csdn.net/weixin_44221219/article/details/130790315?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-130790315-blog-121462603.235^v3......