言之切 發表於 2019-11-12 15:49:00

JAVA微信公众号网页开发——获取公众号关注的所有用户(微信公众号粉丝)

<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">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;
<br>//控制器
public class GetOpenIdAct {

    /**
   * 获取关注用户的所有openid
   * @return
   */
    @RequestMapping("/get_weixin_user.do")
    public String getWeixinUser(){
      String access_token=getToken();
      Set&lt;String&gt; 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&lt;String&gt; 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&lt;String&gt;openIds=new HashSet&lt;String&gt;();
      Integer total=0,count=0;
      try {
            total=(Integer) data.get("total");
            count=(Integer) data.get("count");
            //总关注用户数超过默认一万
            if(count&lt;total){
                openIds.addAll(getUsers(openIds,usersGetUrl, access_token, (String)data.get("next_openid")));
            }else{
                //有关注者 json才有data参数
                if(count&gt;0){
                  JSONObject openIdData=(JSONObject) data.get("data");
                  JSONArray openIdArray= (JSONArray) openIdData.get("openid");
                  for(int i=0;i&lt;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) &amp;&amp; StringUtils.isNotBlank(secret)) {
            tokenGetUrl += "&amp;appid=" + appid + "&amp;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;
      }
    }




    privateSet&lt;String&gt; getUsers(Set&lt;String&gt;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&gt;0){
                JSONObject openIdData=(JSONObject) data.get("data");
                JSONArray openIdArray= (JSONArray) openIdData.get("openid");
                for(int i=0;i&lt;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&lt;String&gt; {
      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() &gt;= 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;
            }
      }

    }
}
</pre>
</div>
<p>  </p>

</div>
<div id="MySignature" role="contentinfo">
   



-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
                         (蓝奏云官网如果有地址失效了,可以私信我,后续看到会补充)<br><br>
来源:https://www.cnblogs.com/pxblog/p/11842578.html
頁: [1]
查看完整版本: JAVA微信公众号网页开发——获取公众号关注的所有用户(微信公众号粉丝)