/// <summary>
/// 高级接口获取的用户信息。
/// 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID
/// (加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。
/// 公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
/// </summary>
public class UserJson : BaseJsonResult
{
/// <summary>
/// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
/// </summary>
public int subscribe { get; set; }
/// <summary>
/// 用户的标识,对当前公众号唯一
/// </summary>
public string openid { get; set; }
/// <summary>
/// 用户的昵称
/// </summary>
public string nickname { get; set; }
/// <summary>
/// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
/// </summary>
public int sex { get; set; }
/// <summary>
/// 用户的语言,简体中文为zh_CN
/// </summary>
public string language { get; set; }
/// <summary>
/// 用户所在城市
/// </summary>
public string city { get; set; }
/// <summary>
/// 用户所在省份
/// </summary>
public string province { get; set; }
/// <summary>
/// 用户所在国家
/// </summary>
public string country { get; set; }
/// <summary>
/// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
/// </summary>
public string headimgurl { get; set; }
/// <summary>
/// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
/// </summary>
public long subscribe_time { get; set; }
}
/// <summary>
/// 分组信息
/// </summary>
public class GroupJson : BaseJsonResult
{
/// <summary>
/// 分组id,由微信分配
/// </summary>
public int id { get; set; }
/// <summary>
/// 分组名字,UTF8编码
/// </summary>
public string name { get; set; }
}
/// 获取凭证接口 /// </summary> /// <param name="appid">第三方用户唯一凭证</param> /// <param name="secret">第三方用户唯一凭证密钥,既appsecret</param> string GetAccessToken(string appid, string secret);
/// <summary>
/// 获取每次操作微信API的Token访问令牌
/// </summary>
/// <param name="appid">应用ID</param>
/// <param name="secret">开发者凭据</param>
/// <returns></returns>
public string GetAccessToken(string appid, string secret)
{
//正常情况下access_token有效期为7200秒,这里使用缓存设置短于这个时间即可
string access_token = MemoryCacheHelper.GetCacheItem<string>("access_token", delegate()
{
string grant_type = "client_credential";
var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}",
grant_type, appid, secret);
HttpHelper helper = new HttpHelper();
string result = helper.GetHtml(url);
string regex = "\"access_token\":\"(?<token>.*?)\"";
string token = CRegex.GetText(result, regex, "token");
return token;
},
new TimeSpan(0, 0, 7000)//7000秒过期
);
return access_token;
}
{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
/// <summary>
/// 获取关注用户列表的Json结果
/// </summary>
public class UserListJsonResult : BaseJsonResult
{
/// <summary>
/// 关注该公众账号的总用户数
/// </summary>
public int total { get; set; }
/// <summary>
/// 拉取的OPENID个数,最大值为10000
/// </summary>
public int count { get; set; }
/// <summary>
/// 列表数据,OPENID的列表
/// </summary>
public OpenIdListData data { get; set; }
/// <summary>
/// 拉取列表的后一个用户的OPENID
/// </summary>
public string next_openid { get; set; }
}
/// <summary>
/// 列表数据,OPENID的列表
/// </summary>
public class OpenIdListData
{
/// <summary>
/// OPENID的列表
/// </summary>
public List<string> openid { get; set; }
}
/// <summary>
/// 微信用户管理的API接口
/// </summary>
public interface IUserApi
{
/// <summary>
/// 获取关注用户列表
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="nextOpenId">第一个拉取的OPENID,不填默认从头开始拉取</param>
/// <returns></returns>
List<string> GetUserList(string accessToken, string nextOpenId = null);
/// <summary>
/// 获取用户基本信息
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="openId">普通用户的标识,对当前公众号唯一</param>
/// <param name="lang">返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语</param>
UserJson GetUserDetail(string accessToken, string openId, Language lang = Language.zh_CN);
/// <summary>
/// 获取关注用户列表
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="nextOpenId">第一个拉取的OPENID,不填默认从头开始拉取</param>
/// <returns></returns>
public List<string> GetUserList(string accessToken, string nextOpenId = null)
{
List<string> list = new List<string>();
string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/get?access_token={0}", accessToken);
if (!string.IsNullOrEmpty(nextOpenId))
{
url += "&next_openid=" + nextOpenId;
}
UserListJsonResult result = JsonHelper<UserListJsonResult>.ConvertJson(url);
if (result != null && result.data != null)
{
list.AddRange(result.data.openid);
}
return list;
}
HttpHelper helper = new HttpHelper(); string content = helper.GetHtml(url);
/// <summary>
/// 检查返回的记录,如果返回没有错误,或者结果提示成功,则不抛出异常
/// </summary>
/// <param name="content">返回的结果</param>
/// <returns></returns>
private static bool VerifyErrorCode(string content)
{
if (content.Contains("errcode"))
{
ErrorJsonResult errorResult = JsonConvert.DeserializeObject<ErrorJsonResult>(content);
//非成功操作才记录异常,因为有些操作是返回正常的结果({"errcode": 0, "errmsg": "ok"})
if (errorResult != null && errorResult.errcode != ReturnCode.请求成功)
{
string error = string.Format("微信请求发生错误!错误代码:{0},说明:{1}", (int)errorResult.errcode, errorResult.errmsg);
LogTextHelper.Error(errorResult);
throw new WeixinException(error);//抛出错误
}
}
return true;
}
T result = JsonConvert.DeserializeObject<T>(content); return result;
/// <summary>
/// Json字符串操作辅助类
/// </summary>
public class JsonHelper<T> where T : class, new()
{
/// <summary>
/// 检查返回的记录,如果返回没有错误,或者结果提示成功,则不抛出异常
/// </summary>
/// <param name="content">返回的结果</param>
/// <returns></returns>
private static bool VerifyErrorCode(string content)
{
if (content.Contains("errcode"))
{
ErrorJsonResult errorResult = JsonConvert.DeserializeObject<ErrorJsonResult>(content);
//非成功操作才记录异常,因为有些操作是返回正常的结果({"errcode": 0, "errmsg": "ok"})
if (errorResult != null && errorResult.errcode != ReturnCode.请求成功)
{
string error = string.Format("微信请求发生错误!错误代码:{0},说明:{1}", (int)errorResult.errcode, errorResult.errmsg);
LogTextHelper.Error(errorResult);
throw new WeixinException(error);//抛出错误
}
}
return true;
}
/// <summary>
/// 转换Json字符串到具体的对象
/// </summary>
/// <param name="url">返回Json数据的链接地址</param>
/// <returns></returns>
public static T ConvertJson(string url)
{
HttpHelper helper = new HttpHelper();
string content = helper.GetHtml(url);
VerifyErrorCode(content);
T result = JsonConvert.DeserializeObject<T>(content);
return result;
}
}
IUserApi userBLL = new UserApi(); List<string> userList = userBLL.GetUserList(token)
/// <summary>
/// 获取用户基本信息
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="openId">普通用户的标识,对当前公众号唯一</param>
/// <param name="lang">返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语</param>
public UserJson GetUserDetail(string accessToken, string openId, Language lang = Language.zh_CN)
{
string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang={2}",
accessToken, openId, lang.ToString());
UserJson result = JsonHelper<UserJson>.ConvertJson(url);
return result;
}
private void btnGetUsers_Click(object sender, EventArgs e)
{
IUserApi userBLL = new UserApi();
List<string> userList = userBLL.GetUserList(token);
foreach (string openId in userList)
{
UserJson userInfo = userBLL.GetUserDetail(token, openId);
if (userInfo != null)
{
string tips = string.Format("{0}:{1}", userInfo.nickname, userInfo.openid);
Console.WriteLine(tips);
}
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有