知識(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步中使用getForObject
和postForObject
函數(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)案例查看更多
相關(guān)閱讀
- 網(wǎng)站建設(shè)專業(yè)品牌
- 網(wǎng)絡(luò)公司
- 網(wǎng)站建設(shè)需要多少錢
- 小程序商城
- 云南網(wǎng)站建設(shè)首選
- 報(bào)廢車管理
- 小程序定制開發(fā)
- 小程序設(shè)計(jì)
- 網(wǎng)站開發(fā)哪家好
- 百度自然排名
- 跳轉(zhuǎn)小程序
- 網(wǎng)站排名
- 網(wǎng)站搭建
- web前端
- 云南小程序被騙蔣軍
- 汽車報(bào)廢回收軟件
- 云南手機(jī)網(wǎng)站建設(shè)
- 北京小程序制作
- 楚雄網(wǎng)站建設(shè)公司
- 云南建站公司
- 云南網(wǎng)絡(luò)營(yíng)銷
- 報(bào)廢車管理系統(tǒng)
- 大理小程序開發(fā)
- 云南網(wǎng)站建設(shè)費(fèi)用
- 汽車報(bào)廢系統(tǒng)
- 網(wǎng)站小程序
- 小程序技術(shù)
- 汽車拆解管理軟件
- 云南小程序開發(fā)報(bào)價(jià)
- 云南網(wǎng)站維護(hù)