获取用户列表的OPENID

获取用户

参考文档 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();

获取用户的详情信息

参考文档: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId

定义一个用户详情实体类,用来接收微信接口返回的用户基础信息

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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注