获取用户
参考文档 https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html
调用接口可以获取公众号粉丝的openid列表,我们先创建对应的实体类用来接收接口返回的数据。
namespace WeiXinFrame.Models
{
//[https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html](https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html)
public class UserOpenidInfo
{
public int total { set; get; }
public int count { set; get; }
public UserOpenidInfoData data { set; get; }
}
public class UserOpenidInfoData
{
public string[] openid { set; get; }
public string next_openid { set; get; }
}
}
Code language: JavaScript (javascript)
编写帮助类,用来获取openid列表
public class UserHelper
{
public static UserOpenidInfo GetUserInfos()
{
try
{
var token = TokenHelper.GetTokenInfo();
var url = string.Format(WeiXinAPI.UserList, token.access_token);
string json = string.Empty;
json = HttpHelper.HttpGet(url);
return JsonHelper.DeserializeJson<UserOpenidInfo>(json);
}
catch (Exception)
{
throw;
}
}
}
Code language: PHP (php)
调用方式:通过openid 获取用户列表信息
UserOpenidInfo userInfos = UserHelper.GetUserInfos();
获取用户的详情信息
定义一个用户详情实体类,用来接收微信接口返回的用户基础信息
public class UserDetail
{
public int subscribe { set; get; }
public string openid { set; get; }
public string nickname { set; get; }
public int sex { set; get; }
public string language { set; get; }
public string city { set; get; }
public string province { set; get; }
public string country { set; get; }
public string headimgurl { set; get; }
public string subscribe_time { set; get; }
public string unionid { set; get; }
public string remark { set; get; }
public int groupid { set; get; }
public string tagid_list { set; get; }
public string subscribe_scene { set; get; }
public int qr_scene { set; get; }
public string qr_scene_str { set; get; }
}
Code language: JavaScript (javascript)
在UserHelper中新增方法,传入openid获取单个用户详情
public static UserDetail GetUserDetail(string openid)
{
try
{
var token = TokenHelper.GetTokenInfo();
var url = string.Format(WeiXinAPI.UserInfo, token.access_token, openid);
string json = string.Empty;
json = HttpHelper.HttpGet(url);
return JsonHelper.DeserializeJson<UserDetail>(json);
}
catch (Exception)
{
throw;
}
}
Code language: PHP (php)
修改按钮点击事件:先获取所有openid列表,循环遍历每个openid去拉取用户详情
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
UserOpenidInfo userInfos = UserHelper.GetUserInfos();
List<UserDetail> userDetails = new List<UserDetail>();
for (int i = 0; i < userInfos.data.openid.Count(); i++)
{
UserDetail userDetail = UserHelper.GetUserDetail(userInfos.data.openid[i]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Code language: PHP (php)
显示用户信息列表
微信提供批量获取用户详情的接口,一次最多获取100个用户信息。 先在WeiXinAPI类增加批量获取用户信息接口地址
public static string UserInfoBatch = "[https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token={0}](https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token={0})";
Code language: PHP (php)
修改按钮点击事件,循环获取每个openid对应的用户详情,添加到集合,最后绑定到DataGrid进行展示
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
UserOpenidInfo userInfos = UserHelper.GetUserInfos();
List<UserDetail> userDetails = new List<UserDetail>();
for (int i = 0; i < userInfos.data.openid.Count(); i++)
{
UserDetail userDetail = UserHelper.GetUserDetail(userInfos.data.openid[i]);
userDetails.Add(userDetail);
}
this.userDetails.ItemsSource = userDetails;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Code language: PHP (php)
修改MainWindow的XAML,给DataGrid设置名称、关闭自动生成列,手动定义需要展示的字段
<Window x:Class="WeiXin.MainWindow"
xmlns="[http://schemas.microsoft.com/winfx/2006/xaml/presentation](http://schemas.microsoft.com/winfx/2006/xaml/presentation)"
xmlns:x="[http://schemas.microsoft.com/winfx/2006/xaml](http://schemas.microsoft.com/winfx/2006/xaml)"
xmlns:d="[http://schemas.microsoft.com/expression/blend/2008](http://schemas.microsoft.com/expression/blend/2008)"
xmlns:mc="[http://schemas.openxmlformats.org/markup-compatibility/2006](http://schemas.openxmlformats.org/markup-compatibility/2006)"
xmlns:local="clr-namespace:WeiXin"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="150"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="50"/>
<RowDefinition Height="50"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="1">
<Button Content="获取用户列表" Width="150" HorizontalAlignment="Left" Height="50" Click="Button_Click"/>
</StackPanel>
</Grid>
<DataGrid Grid.Row="1" Name="userDetails" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding nickname}" Header="昵称"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding sex}" Header="性别"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding city}" Header="城市"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding headimgurl}" Header="头像"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding groupid}" Header="分组ID"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
Code language: HTML, XML (xml)
加载微信头像
在用户详情实体类UserDetail里新增bitmapImageHead属性,用来把头像url转为BitmapImage对象,用于界面图片绑定
public string headimgurl { set; get; }
public BitmapImage bitmapImageHead
{
get
{
return new BitmapImage(new Uri(this.headimgurl));
}
}
Code language: JavaScript (javascript)
修改datagrid部分代码,隐藏原来显示头像链接的文本列,新增模板列,使用Image控件展示头像图片
<DataGridTextColumn Binding="{Binding headimgurl}" Visibility="Hidden" Header="头像">
</DataGridTextColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<Label>头像</Label>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding bitmapImageHead}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Code language: HTML, XML (xml)
批量获取用户基本信息
开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。 接口调用请求说明 http请求方式: POST https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN
在JsonHelper中新增序列化方法
public static string SerializeObject(object obj)
{
return JsonConvert.SerializeObject(obj);
}
Code language: PHP (php)
在HttpHelper中新增HttpPost方法,用来发送POST请求提交JSON数据
public static string HttpPost(string Url,string postDataStr)
{
WebRequest request = WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/json";
byte[] buf = Encoding.UTF8.GetBytes(postDataStr);
byte[] byteArray = System.Text.Encoding.Default.GetBytes(postDataStr);
request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
request.GetRequestStream().Write(buf, 0, buf.Length);
WebResponse response = request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
Code language: PHP (php)
修改按钮点击事件,组装批量查询的请求参数,调用POST接口批量拉取用户信息
private void Button_Click(object sender, RoutedEventArgs e)
{
UserOpenidInfo userInfos = UserHelper.GetUserInfos();
var param = new { user_list = userInfos.data.openid.Select(m=>new { openid=m }) };
var res =HttpHelper.HttpPost("[https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=](https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=)" + TokenHelper.GetTokenInfo().access_token, JsonHelper.SerializeObject(param));
}
Code language: JavaScript (javascript)