接口 https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=@access_token
返回参数及输入参数说明链接官网 http://mp.weixin.qq.com/wiki/1/8a5ce6257f1d3b2afb20f83e72b72ce9.html
直接贴方法咯
/// <summary>
/// 批量获取用户基本信息
/// </summary>
/// <param name="accessTokenOrAppId"></param>
/// <param name="userList"></param>
/// <param name="timeOut"></param>
/// <returns></returns>
public static BatchGetUserInfoJson BatchGetUserInfo(string accessTokenOrAppId, List<BatchGetUserInfoData> userList, int timeOut = Config.TIME_OUT)
{
return ApiHandlerWapper.TryCommonApi(accessToken =>
{
string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token={0}",
accessToken);
var data = new
{
user_list = userList,
};
return CommonJsonSend.Send<BatchGetUserInfoJson>(accessToken, url, data, timeOut: timeOut);
}, accessTokenOrAppId);
}
/// </summary>
public class UserInfoJson : WxJsonResult
{
/// <summary>
/// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
/// </summary>
public int subscribe { get; set; }
public string openid { get; set; }
public string nickname { get; set; }
public int sex { get; set; }
public string language { get; set; }
public string city { get; set; }
public string province { get; set; }
public string country { get; set; }
public string headimgurl { get; set; }
public long subscribe_time { get; set; }
public string unionid { get; set; }
public string remark { get; set; }
public int groupid { get; set; }
}
/// <summary>
/// 批量获取用户基本信息返回结果
/// </summary>
public class BatchGetUserInfoJson : WxJsonResult
{
public List<UserInfoJson> user_info_list { get; set; }
}
WxJsonResult Json返回结果(用于菜单接口)
<pre name="code" class="csharp"> public class WxJsonResult
{
public ReturnCode errcode { get; set; }
public string errmsg { get; set; }
/// <summary>
/// 为P2P返回结果做准备
/// </summary>
public virtual object P2PData { get; set; }
}
ReturnCode 枚举返回码 顺便把批量返回语言的枚举Language <pre name="code" class="csharp">也贴了
<pre name="code" class="csharp"> /// <summary>
/// 返回码(JSON)
/// </summary>
public enum ReturnCode
{
系统繁忙此时请开发者稍候再试 = -1,
请求成功 = 0,
获取access_token时AppSecret错误或者access_token无效 = 40001,
不合法的凭证类型 = 40002,
不合法的OpenID = 40003,
不合法的媒体文件类型 = 40004,
不合法的文件类型 = 40005,
不合法的文件大小 = 40006,
不合法的媒体文件id = 40007,
不合法的消息类型 = 40008,
不合法的图片文件大小 = 40009,
不合法的语音文件大小 = 40010,
不合法的视频文件大小 = 40011,
不合法的缩略图文件大小 = 40012,
不合法的APPID = 40013,
不合法的access_token = 40014,
不合法的菜单类型 = 40015,
不合法的按钮个数1 = 40016,
不合法的按钮个数2 = 40017,
不合法的按钮名字长度 = 40018,
不合法的按钮KEY长度 = 40019,
不合法的按钮URL长度 = 40020,
不合法的菜单版本号 = 40021,
不合法的子菜单级数 = 40022,
不合法的子菜单按钮个数 = 40023,
不合法的子菜单按钮类型 = 40024,
不合法的子菜单按钮名字长度 = 40025,
不合法的子菜单按钮KEY长度 = 40026,
不合法的子菜单按钮URL长度 = 40027,
不合法的自定义菜单使用用户 = 40028,
不合法的oauth_code = 40029,
不合法的refresh_token = 40030,
不合法的openid列表 = 40031,
不合法的openid列表长度 = 40032,
不合法的请求字符不能包含uxxxx格式的字符 = 40033,
不合法的参数 = 40035,
不合法的请求格式 = 40038,
不合法的URL长度 = 40039,
不合法的分组id = 40050,
分组名字不合法 = 40051,
缺少access_token参数 = 41001,
缺少appid参数 = 41002,
缺少refresh_token参数 = 41003,
缺少secret参数 = 41004,
缺少多媒体文件数据 = 41005,
缺少media_id参数 = 41006,
缺少子菜单数据 = 41007,
缺少oauth_code = 41008,
缺少openid = 41009,
access_token超时 = 42001,
refresh_token超时 = 42002,
oauth_code超时 = 42003,
需要GET请求 = 43001,
需要POST请求 = 43002,
需要HTTPS请求 = 43003,
需要接收者关注 = 43004,
需要好友关系 = 43005,
多媒体文件为空 = 44001,
POST的数据包为空 = 44002,
图文消息内容为空 = 44003,
文本消息内容为空 = 44004,
多媒体文件大小超过限制 = 45001,
消息内容超过限制 = 45002,
标题字段超过限制 = 45003,
描述字段超过限制 = 45004,
链接字段超过限制 = 45005,
图片链接字段超过限制 = 45006,
语音播放时间超过限制 = 45007,
图文消息超过限制 = 45008,
接口调用超过限制 = 45009,
创建菜单个数超过限制 = 45010,
回复时间超过限制 = 45015,
系统分组不允许修改 = 45016,
分组名字过长 = 45017,
分组数量超过上限 = 45018,
不存在媒体数据 = 46001,
不存在的菜单版本 = 46002,
不存在的菜单数据 = 46003,
解析JSON_XML内容错误 = 47001,
api功能未授权 = 48001,
用户未授权该api = 50001,
参数错误invalid_parameter = 61451,
无效客服账号invalid_kf_account = 61452,
客服帐号已存在kf_account_exsited = 61453,
/// <summary>
/// 客服帐号名长度超过限制(仅允许10个英文字符,不包括@及@后的公众号的微信号)(invalid kf_acount length)
/// </summary>
客服帐号名长度超过限制 = 61454,
/// <summary>
/// 客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)
/// </summary>
客服帐号名包含非法字符 = 61455,
/// <summary>
/// 客服帐号个数超过限制(10个客服账号)(kf_account count exceeded)
/// </summary>
客服帐号个数超过限制 = 61456,
无效头像文件类型invalid_file_type = 61457,
系统错误system_error = 61450,
日期格式错误 = 61500,
日期范围错误 = 61501,
//新加入的一些类型,以下文字根据P2P项目格式组织,非官方文字
发送消息失败_48小时内用户未互动 = 10706,
发送消息失败_该用户已被加入黑名单_无法向此发送消息 = 62751,
发送消息失败_对方关闭了接收消息 = 10703,
对方不是粉丝 = 10700
}
/// <summary>
/// 语言
/// </summary>
public enum Language
{
/// <summary>
/// 中文简体
/// </summary>
zh_CN,
/// <summary>
/// 中文繁体
/// </summary>
zh_TW,
/// <summary>
/// 英文
/// </summary>
en
}
参数 BatchGetUserInfoData类
<pre name="code" class="csharp"> public class BatchGetUserInfoData
{
/// <summary>
/// 用户的标识,对当前公众号唯一
/// 必填
/// </summary>
public string openid { get; set; }
/// <summary>
/// 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN
/// 非必填
/// </summary>
public Language lang { get; set; }
}
HB类ApiHandlerWapper
/// <summary>
/// 针对AccessToken无效或过期的自动处理类
/// </summary>
public static class ApiHandlerWapper
{
/// <summary>
/// 使用AccessToken进行操作时,如果遇到AccessToken错误的情况,重新获取AccessToken一次,并重试。
/// 使用此方法之前必须使用AccessTokenContainer.Register(_appId, _appSecret);或JsApiTicketContainer.Register(_appId, _appSecret);方法对账号信息进行过注册,否则会出错。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="fun"></param>
/// <param name="accessTokenOrAppId">AccessToken或AppId。如果为null,则自动取已经注册的第一个appId/appSecret来信息获取AccessToken。</param>
/// <param name="retryIfFaild">请保留默认值true,不用输入。</param>
/// <returns></returns>
public static T TryCommonApi<T>(Func<string, T> fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : WxJsonResult
{
string appId = null;
string accessToken = null;
if (accessTokenOrAppId == null)
{
appId = AccessTokenContainer.GetFirstOrDefaultAppId();
if (appId == null)
{
throw new WeixinException("尚无已经注册的AppId,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!");
}
}
else if (ApiUtility.IsAppId(accessTokenOrAppId))
{
if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId))
{
throw new WeixinException("此appId尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!");
}
appId = accessTokenOrAppId;
}
else
{
//accessToken
accessToken = accessTokenOrAppId;
}
T result = null;
try
{
if (accessToken == null)
{
var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, false);
accessToken = accessTokenResult.access_token;
}
result = fun(accessToken);
}
catch (ErrorJsonResultException ex)
{
if (retryIfFaild
&& appId != null
&& ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效)
{
//尝试重新验证
var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, true);//强制获取并刷新最新的AccessToken
accessToken = accessTokenResult.access_token;
result = TryCommonApi(fun, appId, false);
}
else
{
throw;
}
}
return result;
}
/// <summary>
/// 使用AccessToken进行操作时,如果遇到AccessToken错误的情况,重新获取AccessToken一次,并重试
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <param name="fun">第一个参数为accessToken</param>
/// <param name="retryIfFaild"></param>
/// <returns></returns>
[Obsolete("请使用TryCommonApi()方法")]
public static T Do<T>(Func<string, T> fun, string appId, string appSecret, bool retryIfFaild = true)
where T : WxJsonResult
{
T result = null;
try
{
var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret, false);
result = fun(accessToken);
}
catch (ErrorJsonResultException ex)
{
if (retryIfFaild && ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效)
{
//尝试重新验证
var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret, true);
result = Do(fun, appId, appSecret, false);
}
}
return result;
}
}
类
AccessTokenContainer 里面包含ApiHandlerWapper 检验方法
<pre name="code" class="csharp"> /// <summary>
/// 返回已经注册的第一个AppId
/// </summary>
/// <returns></returns>
public static string GetFirstOrDefaultAppId()
{
return ItemCollection.Keys.FirstOrDefault();
}
这些感觉都是没用的代码,也不删了, 就是为第一个方法做反射,return 出
BatchGetUserInfoJson对象