All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.belerweb.social.weixin.api.User Maven / Gradle / Ivy

There is a newer version: 0.0.5
Show newest version
package com.belerweb.social.weixin.api;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.http.NameValuePair;

import com.belerweb.social.API;
import com.belerweb.social.bean.Result;
import com.belerweb.social.weixin.bean.GetFollowersResult;

/**
 * 网页授权获取用户基本信息
 * 
 * 如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。利用用户信息,可以实现体验优化、用户来源统计、帐号绑定、
 * 用户身份鉴权等功能
 * 。请注意,“获取用户基本信息接口是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页授权的方式获取用户基本信息,则无需消息交互,只是用户进入到公众号的网页
 * ,就可弹出请求用户授权的界面,用户授权后,就可获得其基本信息(此过程甚至不需要用户已经关注公众号。)”
 * 
 * 本接口是通过OAuth2.0来完成网页授权的,是安全可靠的,关于OAuth2.0的详细介绍,可以参考OAuth2.0协议标准。在微信公众号请求用户网页授权之前,
 * 开发者需要先到公众平台网站中配置授权回调域名。
 */
public class User extends API {

  protected User(Weixin weixin) {
    super(weixin);
  }

  /**
   * 拉取用户信息(需scope为 snsapi_userinfo)。适用于网页授权的用户。
   * 
   * 如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
   * 
   * @param accessToken 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
   * @param openId 用户的唯一标识
   */
  public Result snsapiUserInfo(String accessToken,
      String openId) {
    List params = new ArrayList();
    weixin.addParameter(params, "access_token", accessToken);
    weixin.addParameter(params, "openid", openId);
    String json = weixin.get("https://api.weixin.qq.com/sns/userinfo", params);
    return Result.parse(json, com.belerweb.social.weixin.bean.User.class);
  }

  /**
   * 获取用户基本信息,适用于已关注公众帐号的用户。
   * 
   * 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。
   * 公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
   * 
   * @param accessToken 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
   * @param openId 用户的唯一标识
   */
  public Result userInfo(String accessToken, String openId) {
    List params = new ArrayList();
    weixin.addParameter(params, "access_token", accessToken);
    weixin.addParameter(params, "openid", openId);
    String json = weixin.get("https://api.weixin.qq.com/cgi-bin/user/info", params);
    return Result.parse(json, com.belerweb.social.weixin.bean.User.class);
  }

  /**
   * 获取所欲关注者列表,包含用户详细信息,该接口采用循环多次获取用户详细信息的方式。如果关注者太多可能会很慢。还会超过微信API调用次数限制。请谨慎调用。建议只在第一次同步关注着信息时调用。
   */
  public Result> getFollowUsers() {
    return getFollowUsers(weixin.getAccessToken().getToken());
  }

  /**
   * 获取所欲关注者列表,包含用户详细信息,该接口采用循环多次获取用户详细信息的方式。如果关注者太多可能会很慢。还会超过微信API调用次数限制。请谨慎调用。建议只在第一次同步关注着信息时调用。
   * 
   * @param accessToken 调用接口凭证
   */
  public Result> getFollowUsers(String accessToken) {
    List users =
        new ArrayList();
    Result followersResult = getFollowers(accessToken);
    if (followersResult.success()) {
      for (String openId : followersResult.getResult().getOpenIds()) {
        Result userResult = userInfo(accessToken, openId);
        if (userResult.success()) {
          users.add(userResult.getResult());
        } else {
          return new Result>(userResult.getError());
        }
      }

      return new Result>(users);
    }
    return new Result>(followersResult.getError());
  }

  /**
   * 获取所欲关注者列表
   */
  public Result getFollowers() {
    return getFollowers(weixin.getAccessToken().getToken());
  }

  /**
   * 获取所欲关注者列表
   * 
   * @param accessToken 调用接口凭证
   */
  public Result getFollowers(String accessToken) {
    GetFollowersResult result = new GetFollowersResult();
    List openIds = new ArrayList();
    Result followers = getFollowers(accessToken, null);
    while (followers.success()) {
      for (String openId : followers.getResult().getOpenIds()) {
        openIds.add(openId);
      }
      String nextOpenid = followers.getResult().getNextOpenid();
      if (StringUtils.isBlank(nextOpenid) || followers.getResult().getTotal() == openIds.size()) {
        break;
      }
      followers = getFollowers(accessToken, nextOpenid);
    }
    if (!followers.success()) {
      return new Result(followers.getError());
    }
    result.setTotal(openIds.size());
    result.setCount(openIds.size());
    result.setOpenIds(openIds);
    return new Result(result);
  }

  /**
   * 获取关注者列表
   * 
   * 公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成。一次拉取调用最多拉取10000个关注者的OpenID
   * ,可以通过多次拉取的方式来满足需求。
   * 
   * 文档地址:http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表
   * 
   * @param accessToken 调用接口凭证
   * @param openId 第一个拉取的OPENID,不填默认从头开始拉取
   */
  public Result getFollowers(String accessToken, String openId) {
    List params = new ArrayList();
    weixin.addParameter(params, "access_token", accessToken);
    weixin.addNotNullParameter(params, "next_openid", openId);
    String json = weixin.get("https://api.weixin.qq.com/cgi-bin/user/get", params);
    return Result.parse(json, GetFollowersResult.class);
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy