调用微信接口时需要发送的post请求

本文详细介绍了如何通过GET和POST请求调用微信公众号API来获取access_token及进行接口调用的过程,包括使用Java实现的代码示例。

文章转载自大佬https://blog.youkuaiyun.com/a1786223749/article/details/80787379

1.使用get请求获取access_token

2.使用post请求发送json获取接口json

private AccessToken getAccessToken(String appId, String appSecret) {
        NetWorkUtil netHelper = new NetWorkUtil();
        /**
         * 接口地址为https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,其中grant_type固定写为client_credential即可。
         */
        String Url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appId, appSecret);
        //此请求为https的get请求,返回的数据格式为{"access_token":"ACCESS_TOKEN","expires_in":7200}
        String result = netHelper.getHttpsResponse(Url, "");
        System.out.println("获取到的access_token="+result);

        //使用FastJson将Json字符串解析成Json对象
        JSONObject json = JSON.parseObject(result);
        AccessToken token = new AccessToken();
        token.setTokenName(json.getString("access_token"));
        token.setExpireSecond(json.getInteger("expires_in"));
        return token;
    }
private AccessToken postAccessToken(AccessToken token) {
        NetWorkUtil netHelper = new NetWorkUtil();
        /**
         * 接口地址为https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,其中grant_type固定写为client_credential即可。
         */
        String Url = String.format("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s", token.getTokenName());
        //此请求为https的get请求,返回的数据格式为{"access_token":"ACCESS_TOKEN","expires_in":7200}
        String result = netHelper.getHttpsResponse(Url, "POST");
        System.out.println("获取到的json"+result);

        //使用FastJson将Json字符串解析成Json对象
        JSONObject json = JSON.parseObject(result);
        return token;
    }
public class NetWorkUtil {
	/**
     * 发起HTTPS请求
     * @param reqUrl
     * @param requestMethod
     * @return 相应字符串
     */
    public String getHttpsResponse(String reqUrl, String requestMethod) {
        URL url;
        InputStream is;
        PrintWriter pw = null;
        String result ="";

        try {
            url = new URL(reqUrl);
            HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

            TrustManager[] tm = {xtm};
            SSLContext ctx = SSLContext.getInstance("TLS");
            ctx.init(null, tm, null);

            con.setSSLSocketFactory(ctx.getSocketFactory());
            con.setHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String arg0, SSLSession arg1) {
                    return true;
                }
            });

            con.setDoInput(true); //允许输入流,即允许下载
            con.setDoOutput(true);//允许输出

            //在android中必须将此项设置为false
            con.setDoOutput(true); //允许输出流,即允许上传
            con.setUseCaches(false); //不使用缓冲
            if (null != requestMethod && !requestMethod.equals("")) {
                con.setRequestMethod(requestMethod); //使用指定的方式
                con.setRequestProperty("contentType", "application/json");
                pw = new PrintWriter(new OutputStreamWriter(con.getOutputStream(),"utf-8"));
                String jsonstr = "{\"action_name\": \"QR_LIMIT_STR_SCENE\",\"action_info\": {\"scene\": {\"scene_str\": \"bookshelf_001\"}}}";
                JSONObject json = JSONObject.fromObject(jsonstr);
                //发送的post请求内容
                pw.print(json);
                pw.flush();
            } else {
                con.setRequestMethod("GET"); //使用get请求
            }
            
            is = con.getInputStream();   //获取输入流,此时才真正建立链接
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader bufferReader = new BufferedReader(isr);
            String inputLine;
            while ((inputLine = bufferReader.readLine()) != null) {
                result += inputLine + "\n";
            }
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    X509TrustManager xtm = new X509TrustManager() {
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }
    };
}
<think>我们参考提供的引用材料,特别是引用[2]中的示例代码,该代码展示了如何通过企业微信API发送应用消息(包括群发消息)。用户的问题是如何通过微信API发送群聊消息,但需要注意的是:1.引用中提到的API是企业微信API,而非个人微信。如果用户想发送个人微信的群聊消息,官方并没有提供公开的API,通常需要通过非官方的方式(如逆向工程)实现,但这样做存在风险且可能违反微信的使用条款。2.企业微信API可以方便地向企业内部成员或客户群发送消息。引用[2]的代码直接使用了企业微信的“发送应用消息”接口,并指定接收人为“@all”(即企业内所有成员),也可以指定特定的群聊(通过设置群聊id)。根据用户的问题,我们假设用户是希望在企业微信发送群聊消息(因为个人微信API不开放)。因此,解决方案如下:###企业微信发送群聊消息的步骤1.**获取access_token**:调用企业微信API需要先获取access_token,通过企业ID(corpid)和应用凭证密钥(corpsecret)来获取。详见引用[2]中的第一步。2.**构造请求**:使用获取到的access_token,调用消息发送接口,并构造JSON格式的请求体。3.**指定接收人**:发送到群聊可以通过以下方式:-指定群聊的chatid:在请求体中设置`"touser":""`(空字符串),然后使用`"chatid":"群聊ID"`。-或者,在群聊中添加一个企业微信应用(机器人),然后指定应用id(agentid),并向该应用所在的群发送消息(此可以将`touser`设置为`@all`或指定群内成员,但这样并不是直接发给群,而是通过应用发给群内成员)。注意:企业微信的“发送应用消息”接口实际上是将消息作为应用消息发送给指定的人或群。如果要将消息发送到群聊,可以使用以下两种方法:-方法一:直接发送给群聊(需要知道群聊的chatid)[官方文档说明]。请求体示例:```json{"chatid":"群聊ID","msgtype":"text","agentid":1000002,//应用id"text":{"content":"你的快递已到,请携带工卡前往邮件中心领取。"}}```但是注意,在引用[2]的示例中,并没有使用chatid,而是使用了touser。官方文档中说明,可以同指定touser、toparty、totag,或者指定chatid。因此,要发送给群聊,我们使用chatid参数。-方法二:通过应用消息的形式发送给群内的成员(即消息会出现在群聊中)。此,需要将消息发送给群内所有成员(touser为群内成员的列表),但这样每个成员都会收到一条消息,并不是发到群里。所以,正确做法是发送到群聊应该使用chatid。###示例代码以下是使用企业微信API发送群聊消息的示例代码(Python):```pythonimportrequestsimportjson#1.获取access_tokencorpid="你的企业ID"corpsecret="你的应用凭证密钥"#构造获取access_token的URLurl=f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}"response=requests.get(url)access_token=response.json().get('access_token')#2.发送群聊消息send_url=f"https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token={access_token}"#或者使用消息发送接口(注意:发送到群聊的另一个接口是'appchat/send',但引用[2]使用的是'message/send',这里需要根据企业微信的文档)#根据企业微信文档,发送应用消息到群聊(使用chatid)应该使用'message/send'接口,但参数中包含chatid,而不是使用'appchat/send'接口。但注意,在最新的企业微信文档中,发送群聊消息推荐使用'appchat/send'接口。#但为了统一,我们参考最新的企业微信文档:#官方文档:https://work.weixin.qq.com/api/doc/90000/90135/90248(发送应用消息)中说明,可以使用touser、toparty、totag,或者chatid(群聊)。所以,我们可以使用message/send接口,并指定chatid。#这里提供使用chatid的方式,使用message/send接口:data={"chatid":"群聊ID",#这里替换为你的群聊ID"msgtype":"text","agentid":1000002,#这里替换为你的应用agentid"text":{"content":"Hello,这是一条发送到群聊的消息。"}}#或者,如果你希望使用新的appchat/send接口(该接口专门用于发送群聊消息),则:#注意:appchat/send接口的URL和参数稍有不同,但引用[2]中并没有使用这个接口。#由于引用[2]使用的是message/send接口,并且可以发送给群聊(通过chatid),所以我们采用这种方式。#发送请求ret=requests.post(send_url,json.dumps(data))print(ret.text)```###重要说明1.**获取群聊ID**:群聊ID可以通过企业微信API(如创建群聊或获取群聊列表)来获取。2.**应用agentid**:在应用的管理后台可以看到。3.**权限**:确保该应用有发送消息的权限,并且被添加到需要发送的群聊中。###注意事项-企业微信API文档地址为:https://work.weixin.qq.com/api/doc-个人微信的群聊消息发送没有官方API,因此以上解决方案仅适用于企业微信。###相关问题1.如何获取企业微信的群聊ID?2.除了文本消息,企业微信还支持哪些消息类型?3.如何创建企业微信应用并获取corpid和corpsecret?4.企业微信API调用频率限制是多少?希望以上信息能够帮助您。</think> ### 企业微信群聊消息发送解决方案(Python示例) 根据企业微信官方API文档[^2]和引用材料,发送群聊消息的核心步骤如下: #### 一、前置条件 1. **获取企业信息**: - `corpid`:企业ID(在[企业微信后台-我的企业]查看) - `corpsecret`:应用凭证密钥(在[应用管理]创建应用后获取) 2. **权限配置**: - 目标群聊需包含应用可见成员 - 应用需开启`发送消息`API权限 #### 二、发送流程 ```python import requests import json # 1. 获取access_token (有效期7200秒) corpid = "企业ID" corpsecret = "应用凭证密钥" token_url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}" token_res = requests.get(token_url).json() access_token = token_res['access_token'] # 关键凭证 # 2. 构造群聊消息请求体 msg_url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}" # ▼ 关键参数说明 ▼ # chatid: 群聊ID(可通过"获取群聊列表"API获取) # agentid: 应用ID(在应用管理界面查看) # msgtype: 消息类型(text/image/file等) payload = { "chatid": "群聊ID", # ★ 替换为实际群ID "msgtype": "text", # 文本消息 "agentid": 1000002, # ★ 替换为应用ID "text": { "content": "您好,这是通过API发送的群聊消息\n支持换行符和<a href=\"https://example.com\">超链接</a>" }, "safe": 0 # 0=非保密消息 } # 3. 发送POST请求 response = requests.post(msg_url, json=payload).json() print(response) # 成功返回: {"errcode":0, "errmsg":"ok"} ``` #### 三、不同消息类型示例 1. **图文消息**: ```python payload = { "chatid": "群聊ID", "msgtype": "news", "agentid": 1000002, "news": { "articles": [ { "title": "重要通知", "description": "本周五下午2点召开全员会议", "url": "https://meeting.qq.com", "picurl": "https://example.com/cover.jpg" } ] } } ``` 2. **文件消息**(需先上传媒体文件): ```python # 先通过/media/upload接口获取media_id payload = { "chatid": "群聊ID", "msgtype": "file", "agentid": 1000002, "file": { "media_id": "上传文件返回的media_id" } } ``` > 官方文档参考:[企业微信-发送应用消息](https://work.weixin.qq.com/api/doc/90000/90135/90236) #### 四、常见错误码 | 错误码 | 说明 | 解决方案 | |--------|-----------------------|----------------------------| | 40058 | 非法的chatid | 检查群聊ID是否正确 | | 40014 | 无效access_token | 重新获取access_token | | 60011 | 应用不在可见范围 | 检查应用可见性设置 | | 41054 | 缺少msgtype参数 | 确认消息类型参数 | ### 相关问题 1. 如何通过API获取企业微信群聊ID列表? 2. 发送文件消息如何预先上传媒体文件? 3. 如何给企业微信群聊中的指定成员发送@消息? 4. 企业微信API发送消息的频率限制是多少? [^1]: 企业微信API支持多种消息类型 [^2]: 应用消息发送的核心实现代码 [^3]: 完整业务流程示例(天气通知场景)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值