2026-06-08 16:57:44 +08:00
|
|
|
|
using QYZH.InteractiveMagazine.Models.Enum;
|
2026-06-03 16:09:56 +08:00
|
|
|
|
using Newtonsoft.Json;
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
2026-06-05 17:57:24 +08:00
|
|
|
|
namespace QYZH.InteractiveMagazine.Models.WeChat;
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
2026-06-03 16:09:56 +08:00
|
|
|
|
/// <summary>
|
2026-06-04 15:54:30 +08:00
|
|
|
|
/// 微信小程序初次登录输入
|
2026-06-03 16:09:56 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WeChatLoginInput
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信登录凭证(wx.login 获取的 code)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string Code { get; set; } = string.Empty;
|
2026-06-04 15:54:30 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 手机号获取凭证(getPhoneNumber 按钮回调中的 code,可选)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? PhoneCode { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信小程序快捷登录输入(通过 OpenId 登录)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WeChatQuickLoginInput
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信OpenId(初次登录后客户端缓存的 OpenId)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string OpenId { get; set; } = string.Empty;
|
2026-06-03 16:09:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 微信登录输出(含微信用户信息 + 该微信下的 Users 列表)
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WeChatLoginOutput
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 访问令牌(基于 WxUser,不绑定具体 User)
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string Token { get; set; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 微信用户信息
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public WxUserInfoOutput WxUser { get; set; } = new();
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 该微信用户下的用户列表
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-03 18:28:45 +08:00
|
|
|
|
public List<WxUserOutput> Users { get; set; } = [];
|
2026-06-02 14:10:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 微信用户信息输出(WxUser 表数据)
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public class WxUserInfoOutput
|
2026-06-02 14:10:43 +08:00
|
|
|
|
{
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// WxUser 主键Id
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public long Id { get; set; }
|
|
|
|
|
|
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信OpenId
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string OpenId { get; set; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信UnionId
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? UnionId { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 昵称
|
|
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public string? Name { get; set; }
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 头像地址
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? AvatarUrl { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 手机号
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? Phone { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 用户输出(Users 表数据,即角色/子用户)
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WxUserOutput
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// Users 主键Id
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public long Id { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 关联 WxUserId
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public long WxUserId { get; set; }
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 昵称
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? NickName { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 头像地址
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? AvatarUrl { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 积分余额
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public int Points { get; set; }
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 当前成长值
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public int GrowthPoints { get; set; }
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 用户类型: Normal, VIP
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string Type { get; set; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 状态
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string Status { get; set; } = string.Empty;
|
|
|
|
|
|
|
2026-06-03 18:28:45 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 是否上次在线用户
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool IsLastOnline { get; set; }
|
|
|
|
|
|
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 创建时间
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public DateTime CreatedAt { get; set; }
|
2026-06-10 13:47:13 +08:00
|
|
|
|
}
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 新增用户输入(在 WxUser 下创建子用户/角色)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class CreateChildUserInput
|
|
|
|
|
|
{
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 昵称
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public string Name { get; set; } = string.Empty;
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 头像地址(可选)
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public string? AvatarUrl { get; set; }
|
2026-06-02 14:10:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 微信切换用户输入
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public class WeChatSwitchUserInput
|
2026-06-02 14:10:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 目标用户ID(Users 表 Id)
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public long UserId { get; set; }
|
|
|
|
|
|
}
|
2026-06-02 14:10:43 +08:00
|
|
|
|
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信切换用户输出(JWT 基于 WxUser,切换不更换 Token)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WeChatSwitchUserOutput
|
|
|
|
|
|
{
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// <summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
/// 当前切换的用户详情
|
2026-06-02 14:10:43 +08:00
|
|
|
|
/// </summary>
|
2026-06-10 13:47:13 +08:00
|
|
|
|
public WxUserOutput User { get; set; } = new();
|
2026-06-02 14:10:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-10 13:47:13 +08:00
|
|
|
|
// ========== 微信 API 响应 DTO(不变) ==========
|
|
|
|
|
|
|
2026-06-03 16:09:56 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信 code2session 接口响应
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WxCode2SessionResponse
|
|
|
|
|
|
{
|
|
|
|
|
|
[JsonProperty("openid")]
|
|
|
|
|
|
public string? OpenId { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("session_key")]
|
|
|
|
|
|
public string? SessionKey { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("unionid")]
|
|
|
|
|
|
public string? UnionId { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("errcode")]
|
|
|
|
|
|
public int ErrCode { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("errmsg")]
|
|
|
|
|
|
public string? ErrMsg { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-04 15:54:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信获取手机号接口响应
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WxPhoneNumberResponse
|
|
|
|
|
|
{
|
|
|
|
|
|
[JsonProperty("errcode")]
|
|
|
|
|
|
public int ErrCode { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("errmsg")]
|
|
|
|
|
|
public string? ErrMsg { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("phone_info")]
|
|
|
|
|
|
public WxPhoneInfo? PhoneInfo { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信手机号信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WxPhoneInfo
|
|
|
|
|
|
{
|
|
|
|
|
|
[JsonProperty("phoneNumber")]
|
|
|
|
|
|
public string? PhoneNumber { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("purePhoneNumber")]
|
|
|
|
|
|
public string? PurePhoneNumber { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("countryCode")]
|
|
|
|
|
|
public string? CountryCode { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 微信 access_token 接口响应
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class WxAccessTokenResponse
|
|
|
|
|
|
{
|
|
|
|
|
|
[JsonProperty("access_token")]
|
|
|
|
|
|
public string? AccessToken { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("expires_in")]
|
|
|
|
|
|
public int ExpiresIn { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("errcode")]
|
|
|
|
|
|
public int ErrCode { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
[JsonProperty("errmsg")]
|
|
|
|
|
|
public string? ErrMsg { get; set; }
|
|
|
|
|
|
}
|