JAVA微信公众号网页开发——获取公众号关注的所有用户(微信公众号粉丝)
阅读原文时间:2022年05月12日阅读:1

package com.weixin.sendmessage;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URI;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashSet;
import java.util.Set;

//控制器
public class GetOpenIdAct {

/\*\*  
 \* 获取关注用户的所有openid  
 \* @return  
 \*/  
@RequestMapping("/get\_weixin\_user.do")  
public String getWeixinUser(){  
    String access\_token=getToken();  
    Set<String> openIds=getUsers(access\_token);  
    //openIds为所有关注用户的openid

    return null;  
}

/\*\*  
 \* 获取微信公众号关注用户  
 \* 官方接口文档:https://developers.weixin.qq.com/doc/offiaccount/User\_Management/Getting\_a\_User\_List.html  
 \* @param access\_token  
 \* @return  
 \*/  
public Set<String> getUsers(String access\_token) {  
    String usersGetUrl="https://api.weixin.qq.com/cgi-bin/user/get";  
    usersGetUrl+="?access\_token="+access\_token;  
    JSONObject data=getUrlResponse(usersGetUrl);  
    Set<String>openIds=new HashSet<String>();  
    Integer total=0,count=0;  
    try {  
        total=(Integer) data.get("total");  
        count=(Integer) data.get("count");  
        //总关注用户数超过默认一万  
        if(count<total){  
            openIds.addAll(getUsers(openIds,usersGetUrl, access\_token, (String)data.get("next\_openid")));  
        }else{  
            //有关注者 json才有data参数  
            if(count>0){  
                JSONObject openIdData=(JSONObject) data.get("data");  
                JSONArray openIdArray= (JSONArray) openIdData.get("openid");  
                for(int i=0;i<openIdArray.length();i++){  
                    openIds.add((String) openIdArray.get(i));  
                }  
            }  
        }  
    } catch (JSONException e) {  
        e.printStackTrace();  
    }  
    return openIds;  
}

/\*\*  
 \* 获取access\_token  
 \*  
 \* @return  
 \*/  
public String getToken() {  
    String tokenGetUrl = "https://api.weixin.qq.com/cgi-bin/token?grant\_type=client\_credential";//微信提供获取access\_token接口地址  
    String appid = "";  
    String secret = "";

    System.out.println("~~~~~appid:" + appid);  
    System.out.println("~~~~~secret:" + secret);  
    JSONObject tokenJson = new JSONObject();  
    if (StringUtils.isNotBlank(appid) && StringUtils.isNotBlank(secret)) {  
        tokenGetUrl += "&appid=" + appid + "&secret=" + secret;  
        tokenJson = getUrlResponse(tokenGetUrl);  
        System.out.println("~~~~~tokenJson:" + tokenJson.toString());  
        try {  
            return (String) tokenJson.get("access\_token");  
        } catch (JSONException e) {  
            System.out.println("报错了");  
            return null;  
        }  
    } else {  
        System.out.println("appid和secret为空");  
        return null;  
    }  
}

private  Set<String> getUsers(Set<String>openIds,String url,String access\_token,String next\_openid) {  
    JSONObject data=getUrlResponse(url);  
    try {  
        Integer count=(Integer) data.get("count");  
        String nextOpenId=(String) data.get("next\_openid");  
        if(count>0){  
            JSONObject openIdData=(JSONObject) data.get("data");  
            JSONArray openIdArray= (JSONArray) openIdData.get("openid");  
            for(int i=0;i<openIdArray.length();i++){  
                openIds.add((String) openIdArray.get(i));  
            }  
        }  
        if(StringUtils.isNotBlank(nextOpenId)){  
            return getUsers(openIds,url, access\_token, nextOpenId);  
        }  
    } catch (JSONException e) {  
        e.printStackTrace();  
    }  
    return openIds;  
}

private JSONObject getUrlResponse(String url) {  
   CharsetHandler handler = new CharsetHandler("UTF-8");  
    try {  
        HttpGet httpget = new HttpGet(new URI(url));  
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();  
        //HttpClient  
        CloseableHttpClient client = httpClientBuilder.build();  
        client = (CloseableHttpClient) wrapClient(client);  
        return new JSONObject(client.execute(httpget, handler));  
    } catch (Exception e) {  
        e.printStackTrace();  
        return null;  
    }  
}

private static HttpClient wrapClient(HttpClient base) {  
    try {  
        SSLContext ctx = SSLContext.getInstance("TLSv1");  
        X509TrustManager tm = new X509TrustManager() {  
            public void checkClientTrusted(X509Certificate\[\] xcs,  
                                           String string) throws CertificateException {  
            }

            public void checkServerTrusted(X509Certificate\[\] xcs,  
                                           String string) throws CertificateException {  
            }

            public X509Certificate\[\] getAcceptedIssuers() {  
                return null;  
            }  
        };  
        ctx.init(null, new TrustManager\[\]{tm}, null);  
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(ctx, new String\[\]{"TLSv1"}, null,  
                SSLConnectionSocketFactory.BROWSER\_COMPATIBLE\_HOSTNAME\_VERIFIER);  
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();  
        return httpclient;

    } catch (Exception ex) {  
        return null;  
    }  
}

private class CharsetHandler implements ResponseHandler<String> {  
    private String charset;

    public CharsetHandler(String charset) {  
        this.charset = charset;  
    }

    public String handleResponse(HttpResponse response)  
            throws ClientProtocolException, IOException {  
        StatusLine statusLine = response.getStatusLine();  
        if (statusLine.getStatusCode() >= 300) {  
            throw new HttpResponseException(statusLine.getStatusCode(),  
                    statusLine.getReasonPhrase());  
        }  
        HttpEntity entity = response.getEntity();  
        if (entity != null) {  
            if (!StringUtils.isBlank(charset)) {  
                return EntityUtils.toString(entity, charset);  
            } else {  
                return EntityUtils.toString(entity);  
            }  
        } else {  
            return null;  
        }  
    }

}  

}