小程序获取公众号用户表
一,微信获取公众号用户信息api接口循序
1,获取access_token
https请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
微信公众平台获取access_token(详情)
2,获取openid列表
https请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
微信公众平台获取openid列表(详情)
3,获取用户信息
https请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID
微信公众平台获取用户基本信息(UnionID机制)(详情)
二,代码实现
创建GzhAccessToken实体类
GzhAccessToken实体类代码
package com.platform.entity.templateMessage;
import java.io.Serializable;
/**
* AccessToken对象
*/
public class GzhAccessToken implements Serializable {
// 获取到的凭证
private String access_token;
// 凭证有效时间,单位:秒
private Integer expires_in;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public Integer getExpires_in() {
return expires_in;
}
public void setExpires_in(Integer expires_in) {
this.expires_in = expires_in;
}
}
创建GzhUser实体类
package com.platform.entity.templateMessage;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 公众号用户信息表实体
* 表名 app_user
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class GzhUser implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;//id
//用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
private Integer subscribe;
//用户的标识,对当前公众号唯一
private String openid;
//用户昵称
private String nickname;
//用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
private Integer sex;
//省份
private String province;
//用户所在城市
private String city;
//国家
private String country;
//用户头像
private String headimgurl;
//用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
private Date subscribe_time;
//只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
private String unionid;
//公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
private String remark;
//用户所在的分组ID(兼容旧的用户分组接口)
private Integer groupid;
//用户被打上的标签ID列表
private List<Integer> tagid_list;
//返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENEPROFILE LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他
private String subscribe_scene;
//二维码扫码场景(开发者自定义)
private Integer qr_scene;
//二维码扫码场景描述(开发者自定义)
private String qr_scene_str;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getSubscribe() {
return subscribe;
}
public void setSubscribe(Integer subscribe) {
this.subscribe = subscribe;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getHeadimgurl() {
return headimgurl;
}
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl;
}
public Date getSubscribe_time() {
return subscribe_time;
}
public void setSubscribe_time(Date subscribe_time) {
this.subscribe_time = subscribe_time;
}
public String getUnionid() {
return unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Integer getGroupid() {
return groupid;
}
public void setGroupid(Integer groupid) {
this.groupid = groupid;
}
public List<Integer> getTagid_list() {
return tagid_list;
}
public void setTagid_list(List<Integer> tagid_list) {
this.tagid_list = tagid_list;
}
public String getSubscribe_scene() {
return subscribe_scene;
}
public void setSubscribe_scene(String subscribe_scene) {
this.subscribe_scene = subscribe_scene;
}
public Integer getQr_scene() {
return qr_scene;
}
public void setQr_scene(Integer qr_scene) {
this.qr_scene = qr_scene;
}
public String getQr_scene_str() {
return qr_scene_str;
}
public void setQr_scene_str(String qr_scene_str) {
this.qr_scene_str = qr_scene_str;
}
}
遍历查询公众号用户列表,和通过公众号用户openid发送模板消息
package com.platform.api;
import com.alibaba.fastjson.JSONObject;
import com.platform.entity.ColorScheme;
import com.platform.entity.Item;
import com.platform.entity.Commodity;
import com.platform.entity.Notification;
import com.platform.entity.templateMessage.*;
import com.platform.service.*;
import com.platform.util.CommonUtil;
import com.platform.util.WX_TemplateMessage;
import com.platform.utils.R;
import com.platform.utils.ResourceUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import static com.platform.client.TokenThread.gzhAccessToken;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* GzhUserController
*
*/
@RestController
@RequestMapping("/api")
public class ApiGzhUserController {
@Autowired
private GzhUserService gzhUserService;
@Autowired
private NotificationService notificationService;
@Autowired
private ItemService itemService;
@Autowired
private ColorSchemeService colorSchemeService;
@Autowired
private CommodityService commodityService;
/**
* 导入公众号用户列表列表
*/
@RequestMapping(value ="/gzhuser" ,method = RequestMethod.GET)
public R infoGzhUser() {
//创建一个微信模板信息工具类
WX_TemplateMessage wx_templateMessage=new WX_TemplateMessage();
//获取ACCESS_TOKEN
String access_token=gzhAccessToken.getAccess_token();
//String access_token="18_ti5Upa3aguDh3P64JqWp-vnP4Q-TMAspeLe_J7cUtkJ-78a7NsGiKSZjdzmo0vMMhZIQQAFri6MVORS2mNVJQgIhtD2DmhOxzF8MdDidJ9WhMxLRMkJYBJQPr7-14OhbvVbbwE-leDjbtz64GSWcABABNR";
//String nextOpenid="ohZH01H7pLcBcJlTWn4eZ8wefnlQ";
String nextOpenid="";
//用户openid列表信息
OpenIdList openIdList = null;
//公众号总关注量
int total=0;
//当前查询条数
int count=10000;
for (;count>=10000;) {//用户关注量达到10000以上时进行循环,直到查询的条数小于10000时,结束循环
synchronized (this) {
try {
//循环获取用户openid列表
do {
//微信公众号获取用户列表信息接口地址
String requestUrl = null;
// 判断某字符串是否为空或长度为0或由空白符
if (StringUtils.isBlank(nextOpenid)) {
requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", access_token);
} else {
requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", access_token)
+ "&next_openid=NEXT_OPENID".replace("NEXT_OPENID", nextOpenid);
}
//将url返回结果给openIdList对象
CloseableHttpClient httpCilent = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(requestUrl);
HttpResponse httpResponse = httpCilent.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
String entity = EntityUtils.toString(httpResponse.getEntity());
openIdList = JSONObject.parseObject(entity, OpenIdList.class);
//当前查询的条数
count=openIdList.getCount();
}
//判断返回的数组是否为null和错误编码是否为0
if (openIdList != null && openIdList.getErrcode() == 0) {
//获取用户openid列表对象
WxOpenidInfo wxOpenidInfo = openIdList.getData();
//用户openid列表对象不为空
if (wxOpenidInfo != null) {
//用户openid列表赋给list集合
List<String> openids = wxOpenidInfo.getOpenid();
//list 集合不为null和大小大于0
if (openids != null && openids.size() > 0) {
//查询用户信息通过每个openid
for (String openid : openids) {
//查询当前openid是否保存到数据库中,如果为空就在公众号查询并保存到数据库中
if (gzhUserService.queryByOpenId(openid) == null) {
String getUserUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", access_token)
+ "&openid=OPENID".replace("OPENID", openid);
JSONObject sessionData = CommonUtil.httpsRequest(getUserUrl, "GET", null);
GzhUser gzhUser = new GzhUser();
//gzhUser.setSubscribe(sessionData.getInteger("subscribe"));//用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
gzhUser.setOpenid(sessionData.getString("openid"));//用户的标识,对当前公众号唯一
//gzhUser.setNickname(sessionData.getString("nickname"));//用户昵称
//setSex(sessionData.getInteger("sex"));//用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
//gzhUser.setProvince(sessionData.getString("province"));//省份
//setCity(sessionData.getString("city"));//城市
//gzhUser.setCountry(sessionData.getString("country"));//国家
//gzhUser.setHeadimgurl(sessionData.getString("headimgurl"));//头像
//gzhUser.setSubscribe_time(sessionData.getDate("subscribe_time")); //用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
gzhUser.setUnionid(sessionData.getString("unionid"));//只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
//gzhUser.setRemark(sessionData.getString("remark"));//公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
//gzhUser.setGroupid(sessionData.getInteger("groupid"));//用户所在的分组ID(兼容旧的用户分组接口)
gzhUserService.save(gzhUser);
/* //将url返回结果给openIdList对象
CloseableHttpClient httpCilent1 = HttpClients.createDefault();
HttpGet httpGet1 = new HttpGet(getUserUrl);
// 传输的类型
httpGet1.addHeader("Content-Type", "application/json");
HttpResponse httpResponse1 = httpCilent1.execute(httpGet1);
if (httpResponse1.getStatusLine().getStatusCode() == 200) {
// 使用Apache提供的工具类进行转换成字符串
String entity = EntityUtils.toString(httpResponse1.getEntity(), "UTF-8");
GzhUser gzhUser = JSONObject.parseObject(entity, GzhUser.class);
System.out.println("+++++++++++++"+gzhUser.getNickname());
//保存公众号用户
gzhUserService.save(gzhUser);
}*/
}
}
}
//拉取列表的最后一个用户的OPENID
nextOpenid = openIdList.getNext_openid();
}
} else {
openIdList.setErrcode(40000);
openIdList.setErrmsg("获取关注用户列表失败");
return R.error(openIdList.getErrcode(), openIdList.getErrmsg());
}
}
while (openIdList.getCount() == 10000);
} catch (Exception e) {
//LOG.error("获取用户列表失败",e);
openIdList.setErrcode(40000);
openIdList.setErrmsg("获取用户列表失败");
return R.error(openIdList.getErrcode(), openIdList.getErrmsg());
}
}
}
return R.ok("公众号用户表导入成功");
}
//缺货到货提醒
@RequestMapping(value ="/sandmessage" ,method = RequestMethod.GET)
public R sandTemplateMessage() {
WX_TemplateMessage wx_templateMessage=new WX_TemplateMessage();
//获取ACCESS_TOKEN
String access_token=gzhAccessToken.getAccess_token();
System.out.println("++++++++++++++"+access_token);
//String access_token="18_hdx3bBv-TRj461zE-IoLSBHWUhxm1DEAdrW6Wf3Tj6BtXqoNfbJYqCH9LSkRl_-klX03lFvbEYz5WWiGXk_q38bEoWKgs99i587WLn48vkp30TxeNtNOjzMkf9f9FNsElNaOzRQKM9Hv5z-PMSBiAFAHNW";
//pagepath
String pagepath="/pages/productDetails/productDetails?colorId=";
//公众号推送模板id
String templateId="eCfitkX6-Lx1-BlpmZQ2iyNuqBY5LEf8cEyNafoepG4";
//查询通知中有库存的列表
Map<String, Object> pss = new HashMap<>();
List<Notification> notificationList = notificationService.queryArrivalList(pss);
for (Notification notification : notificationList) {
//通过通知中的用户id查询到用户公众号openid
Integer userId = notification.getUserId();
//用户在公众号里的openid
String openid=gzhUserService.queryByUserId(userId);
Item item = itemService.queryObject(notification.getItemId());
ColorScheme colorScheme = colorSchemeService.queryObject(notification.getColorId());
Commodity commodity=commodityService.queryObject(item.getCommodityId());
//商品路径
pagepath=pagepath+notification.getColorId();
//模板数据
Map<String,TemplateData> m = new HashMap<>();
TemplateData templateData=new TemplateData();
//标题
templateData.setValue("您好,您关注的商品已到货,请及时抢购。");
templateData.setColor("#E43C52");
TemplateData templateData1=new TemplateData();
//订单号
templateData1.setValue("暂未下单");
templateData1.setColor("#000000");
//商品
TemplateData templateData2=new TemplateData();
templateData2.setValue(commodity.getBrand()+item.getColorName());
templateData2.setColor("#000000");
/* //测试结果
TemplateData templateData3=new TemplateData();
templateData3.setValue("");
templateData3.setColor("#000000");*/
//测试结尾
TemplateData templateData4=new TemplateData();
templateData4.setValue("请及时购买");
templateData4.setColor("#E43C52");
m.put("first",templateData);
m.put("keyword1",templateData1);
m.put("keyword2",templateData2);
// m.put("keyword3",templateData3);
m.put("remark",templateData4);
/**
*发送模板信息
* m 发送内容
* openid 发送公众号用户的openid
* access_token 登录凭证
* pagepath 小程序跳转测试
* templateId 公众号模板id
*/
wx_templateMessage.sendTemplateMessage(m,openid,access_token,pagepath,templateId);
}
return R.ok();
}
}