实现微信订阅号强制关注
绑定后,订阅号和服务号将通过unionid关联用户信息,也就是说同个openid调用服务号拉取用户信息接口和订阅号获取用户信息接口都将返回相同的unionid
具体实现步骤和原理:
2.用服务号做网页授权,拉取用户信息,获取unionid
同步订阅号用户列表和用户信息代码
获取用户列表保存或更新token
public WxToken addNewWxTokenOrUpdate(WxToken wxToken) {
WxToken token = wxTokenMapper.selectByKey(wxToken.getToken_key());
if(token != null){
token.setCreate_time(System.currentTimeMillis());
//token已存在,则更新token
wxToken.setId(token.getId());
wxTokenMapper.update(wxToken);
//如果更新的是noral_access_token,则需要删除失效的js ticket
if(WX_TOKEN_KEY.NORMAL_ACCESS_TOKEN.getKey().equals(wxToken.getToken_key())){
WxToken ticket = wxTokenMapper.selectByKey(WX_TOKEN_KEY.JSSDK_TICKET.getKey());
if(ticket != null){
wxTokenMapper.delete(ticket.getId());
}
}
}else{
token = new WxToken();
token.setExpire_seconds(wxToken.getExpire_seconds());
token.setToken_key(wxToken.getToken_key());
token.setToken_value(wxToken.getToken_value());
token.setCreate_time(System.currentTimeMillis());
wxTokenMapper.save(wxToken);
}
return wxToken;
}
public List<WxOpenid> getWxOpenidsWithoutUnionid(long page, int psize) {
QueryPager pager = new QueryPager();
pager.setPageNum(page);
pager.setNumPerPage((long)psize);
WxOpenid wxo = new WxOpenid();
wxo.setPager(pager);
return wxOpenidMapper.selectWithoutUnionid(wxo);
}
public WxToken getWxTokenByKey(String key) {
WxToken token = wxTokenMapper.selectByKey(key);
boolean isSave = false;
if(token == null || !token.isActive()){
JSONObject tokenJo = WeixinUtil.getAccessToken();
if(tokenJo != null && tokenJo.containsKey("access_token")){
if(token == null){
//保存新token
token = new WxToken();
isSave = true;
}
token.setExpire_seconds(tokenJo.getInteger("expires_in"));
token.setToken_value(tokenJo.getString("access_token"));
token.setToken_key(key);
token.setCreate_time(System.currentTimeMillis());
if(isSave){
wxTokenMapper.save(token);
}else{
wxTokenMapper.update(token);
}
}
}
return token;
}
微信订阅号事件、消息处理
其他实时服务号授权等代码就省略了。。。
下一篇:
【C++】前缀++和后缀++的区别
