通过微信接口获取用户信息主要分为以下几个步骤:
a、获取公众号的access_token
b、通过查询所有用户OPenid接口获取所有用户。
string url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + access_token;
c、通过获取用户openid,然后通过openid获取用户数据
d、把用户信息添加到数据库中。
1、参数化查询以及添加用户信息到数据库方法
public void AddToDataBase(UserJson userInfo) { using (SqlConnection conn = new SqlConnection(connStrings)) { conn.Open(); // openid, subscribe, nickname, sex, language, city, province, country, headimgurl, subscribetime, remark=""; string cmdText = @"insert into UserInfo values(@openid,@subscribe,@nickname,@sex,@language,@city, @province,@country,@headimgurl,@subscribetime,@remark)"; SqlCommand cmd = new SqlCommand(cmdText, conn); cmd.Parameters.AddWithValue("@openid",userInfo.openid); cmd.Parameters.AddWithValue("@subscribe",userInfo.subscribe ); cmd.Parameters.AddWithValue("@nickname",userInfo.nickname); cmd.Parameters.AddWithValue("@sex", userInfo.sex); cmd.Parameters.AddWithValue("@language",userInfo.language ); cmd.Parameters.AddWithValue("@city", userInfo.city); cmd.Parameters.AddWithValue("@province",userInfo.province); cmd.Parameters.AddWithValue("@country", userInfo.country); cmd.Parameters.AddWithValue("@headimgurl",userInfo.headimgurl); cmd.Parameters.AddWithValue("@subscribetime",userInfo.subscribe_time); cmd.Parameters.AddWithValue("@remark", userInfo.remark); int res = cmd.ExecuteNonQuery(); } }
2、通过Openid调用微信接口获取用户数据
public void GetUserInfo(string openid) { string url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN"; string result = HttpGet(url, ""); // json 反序列化为对象 JavaScriptSerializer serializer = new JavaScriptSerializer(); UserJson UserInfo = serializer.Deserialize<UserJson>(result); //通过这种方法反序列化,不出因为出现特殊字符而出错 AddToDataBase(UserInfo); }
3、获取所有openid
string url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + access_token; string openidList = HttpGet(url, ""); List<string> list = new List<string>(); JavaScriptSerializer serializer = new JavaScriptSerializer(); UserListJsonResult result = serializer.Deserialize<UserListJsonResult>(openidList); //通过这种方法,反序列化成功 // UserListJsonResult result = JsonHelper.GetObjFromJson<UserListJsonResult>(openidList);
4、添加用户数据到数据库所需的类
/// <summary> /// 获取关注用户列表的Json结果 /// </summary> public class UserListJsonResult { /// <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> /// 高级接口获取的用户信息。 /// 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID /// (加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。 /// 公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。 /// </summary> public class UserJson { /// <summary> /// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。 /// </summary> public string subscribe { get; set; } /// <summary> /// 用户的标识,对当前公众号唯一 /// </summary> public string openid { get; set; } /// <summary> /// 用户的昵称 /// </summary> public string nickname { get; set; } /// <summary> /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 /// </summary> public string 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 string subscribe_time { get; set; } public string remark { get; set; } }