欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

批量獲取微信公眾號(hào)用戶openID及用戶信息 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 公眾號(hào)相關(guān) >

批量獲取微信公眾號(hào)用戶openID及用戶信息

發(fā)表時(shí)間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):65

本文代碼基于微信開發(fā)文檔-用戶管理-獲取用戶列表一節(jié)開發(fā)

在使用代碼之前請(qǐng)確認(rèn)你已閱讀并理解上面文檔提到的相關(guān)知識(shí)。

文章目錄

      • 1、工具類的構(gòu)建
      • 2、數(shù)據(jù)實(shí)體類的構(gòu)建
      • 3、批量獲取用戶openid
      • 4、批量獲取用戶信息

1、工具類的構(gòu)建

首先創(chuàng)建如下代碼到RestTemplateUtil.java文件中,RestTemplateUtil這個(gè)類將幫助我們解析微信服務(wù)器發(fā)送過來的數(shù)據(jù)

import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;

public class RestTemplateUtil {
    public static RestTemplate getInstance() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());
        return restTemplate;
    }
}

class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
    public WxMappingJackson2HttpMessageConverter(){
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.TEXT_PLAIN);
        mediaTypes.add(MediaType.TEXT_HTML);
        setSupportedMediaTypes(mediaTypes);
    }
}

獲取微信公眾號(hào)access_token的函數(shù),需要使用fastjson工具包,LOGGER為日志輸出類,注意:如果不是測(cè)試公眾號(hào)的話,請(qǐng)確保請(qǐng)求的IP地址在公眾號(hào)IP白名單中,否則無法獲取access_token,access_token一般7200秒后過期。

/**
 * @param appid 微信公眾號(hào)appid
 * @param secret 微信公眾號(hào)sectet
 * @return 微信公眾號(hào)access_token
 */
public String getWxAccessToken(String appid, String secret){
    RestTemplate restTemplate = RestTemplateUtil.getInstance();
    try {
        JSONObject jsonObject = restTemplate.getForObject(String.format("https://api.weixin.qq.com/cgi-bin/token?" +
                "grant_type=client_credential&appid=%s&secret=%s", appid, secret), JSONObject.class);
        if(jsonObject.get("access_token") == null){
            throw new Exception(jsonObject.get("errcode").toString() + ":" + jsonObject.get("errmsg"));
        }else {
            return jsonObject.get("access_token").toString();
        }
    }catch (Exception e){
        LOGGER.error(e.getMessage());
    }
    return "";
}

2、數(shù)據(jù)實(shí)體類的構(gòu)建

需要準(zhǔn)備三個(gè)實(shí)體類,一個(gè)保存openID列表,一個(gè)保存用戶信息,一個(gè)保存用戶信息列表,保存openID的實(shí)體類看起來如下所示:
在這里插入圖片描述
相對(duì)應(yīng)的,我們構(gòu)造出如下實(shí)體類:

public class WxUsersListEntity {
    int total;
    int count;
    openidList data;
    String next_openid;

    public class openidList{
        List<String> openid;
		//get and set method
		...
    }
	
	//get and set method
	...
}

同理:
保存用戶信息的實(shí)體類看起來像這樣:
在這里插入圖片描述

相對(duì)應(yīng)的,我們構(gòu)造出如下實(shí)體類:

public class WxUserMsgEntity {
    public int subscribe;
    public String openid;
    public String nickname;
    public String headimgurl;
    public String unionid;
    
    //get and set method
	...
}

你可以只挑你感興趣的內(nèi)容來保存,這里我只保存以上5條信息。這里提示一下,如果你需要將用戶信息保存到數(shù)據(jù)庫(kù),格外注意nickname,他是utf8mb4編碼。如果要將nickname保存到數(shù)據(jù)庫(kù),你有兩種選擇:

  • 將數(shù)據(jù)庫(kù)修改到支持utf8mb4來保存,參考這里
  • 過濾掉nickname中的emoji表情來保存,參考這里

最后是保存用戶信息列表的類,他看起來是這樣:
在這里插入圖片描述
所以構(gòu)造的實(shí)體類是這樣:

public class WxUserMsgList{
   public List<WxUserMsgEntity> user_info_list;

    //get and set method
	...
}

3、批量獲取用戶openid

準(zhǔn)備好以上的內(nèi)容后,就可以開始按照微信文檔中的邏輯編寫代碼了。首先我們來獲取用戶的openid列表,該函數(shù)返回的是一個(gè)保存所有用戶openid的List。

public List<String> getUsersOpenID(String access_token){
    RestTemplate restTemplate = RestTemplateUtil.getInstance();
    List<String> usersOpenID = new ArrayList<>();
    WxUsersListEntity wxUsersListEntity = new WxUsersListEntity();

    //獲取所有微信用戶的openID
    wxUsersListEntity = restTemplate.getForObject(String.format("https://api.weixin.qq.com/cgi-bin/user/get?" +
            "access_token=%s",access_token), WxUsersListEntity.class);
    usersOpenID.addAll(wxUsersListEntity.getData().getOpenid());

    while(wxUsersListEntity.getCount() == 10000){
        wxUsersListEntity = restTemplate.getForObject(String.format("https://api.weixin.qq.com/cgi-bin/user/get?" +
                "access_token=%s&next_openid=%s", access_token, wxUsersListEntity.getNext_openid()), WxUsersListEntity.class);

        if(wxUsersListEntity.getCount() == 0) {
            break;
        }else {
            usersOpenID.addAll(wxUsersListEntity.getData().getOpenid());
        }
    }
    return usersOpenID;
}

4、批量獲取用戶信息

之后根據(jù)用戶openid的List去獲取用戶的信息,函數(shù)如下:

/**
 * 根據(jù)列表中的openID返回用戶信息,最大不超過100(因?yàn)槲⑿欧?wù)器最多一次只支持拉取100條)
 * @param openIDs
 * @return 微信用戶信息列表
 */
public List<WxUserMsgEntity> getUsersMsg(List<String> openIDs, String access_token) throws Exception {
    if(openIDs.size() > 100) { throw new Exception("openIDs too long, must less or equals 100");}

    JSONObject request = new JSONObject();
    JSONArray openidList = new JSONArray();

    for(String s:openIDs){
        JSONObject openId = new JSONObject();
        openId.put("lang", "zh_CN");
        openId.put("openid", s);
        openidList.add(openId);
    }
    
    request.put("user_list", openidList);

    RestTemplate restTemplate = RestTemplateUtil.getInstance();

    WxUserMsgList list = restTemplate.postForObject(String.format("https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=%s", access_token),
    request, WxUserMsgList.class);

    return list.getUser_info_list();
}

在3,4步中使用getForObjectpostForObject函數(shù)的時(shí)候,我沒有考慮獲取出錯(cuò)的情況,但是我在獲取access_token的函數(shù)中給出了處理出錯(cuò)情況的示例,即:先將數(shù)據(jù)接收到JSONObject中,判斷是否有我們需要的字段,沒有的話說明出現(xiàn)了錯(cuò)誤。如果沒有出錯(cuò),你可以使用JSONObject的public <T> T toJavaObject(Class<T> clazz)函數(shù)將JSONObject轉(zhuǎn)為數(shù)據(jù)實(shí)體類處理。

以上我們就完成了批量獲取微信用戶openID及用戶信息的目標(biāo),如果使用過程中出現(xiàn)問題,可以在文章下評(píng)論,我會(huì)及時(shí)回復(fù),讓后來者不踩坑。

相關(guān)案例查看更多