You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
310 lines
14 KiB
310 lines
14 KiB
using Tiobon.Core.Model.ViewModels;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Net.Http;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Tiobon.Core.Common.Helper
|
|
{
|
|
/// <summary>
|
|
/// 微信公众号帮助类
|
|
/// </summary>
|
|
public static class WeChatHelper
|
|
{
|
|
/// <summary>
|
|
/// 新增素材/上传多媒体文件(临时)
|
|
/// http://mp.weixin.qq.com/wiki/5/963fc70b80dc75483a271298a76a8d59.html
|
|
/// 1.上传的媒体文件限制:
|
|
///图片(image) : 1MB,支持JPG格式
|
|
///语音(voice):1MB,播放长度不超过60s,支持MP4格式
|
|
///视频(video):10MB,支持MP4格式
|
|
///缩略图(thumb):64KB,支持JPG格式
|
|
///2.媒体文件在后台保存时间为3天,即3天后media_id失效
|
|
/// </summary>
|
|
/// <param name="access_token"></param>
|
|
/// <param name="type">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>
|
|
/// <param name="fileName">文件名</param>
|
|
/// <param name="inputStream">文件输入流</param>
|
|
/// <returns>media_id</returns>
|
|
public async static Task<WeChatApiDto> UploadMediaTemp(string token, string type, string fileName, Stream inputStream)
|
|
{
|
|
var url = $"http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={token}&type={type}";
|
|
using var client = new HttpClient();
|
|
using HttpContent content = new StreamContent(inputStream);
|
|
var httpResponse = await client.PostAsync(url, content);
|
|
var txt = await httpResponse.Content.ReadAsStringAsync();
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 新增素材/上传多媒体文件(永久)
|
|
/// http://mp.weixin.qq.com/wiki/5/963fc70b80dc75483a271298a76a8d59.html
|
|
/// 1.上传的媒体文件限制:
|
|
///图片(image) : 1MB,支持JPG格式
|
|
///语音(voice):1MB,播放长度不超过60s,支持MP4格式
|
|
///视频(video):10MB,支持MP4格式
|
|
///缩略图(thumb):64KB,支持JPG格式
|
|
/// </summary>
|
|
/// <param name="access_token"></param>
|
|
/// <param name="type">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>
|
|
/// <param name="fileName">文件名</param>
|
|
/// <param name="inputStream">文件输入流</param>
|
|
/// <returns>media_id</returns>
|
|
public async static Task<WeChatApiDto> UploadMedia(string token, string type, string fileName, Stream inputStream)
|
|
{
|
|
var url = $"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={token}&type={type}";
|
|
using var client = new HttpClient();
|
|
using HttpContent content = new StreamContent(inputStream);
|
|
var httpResponse = await client.PostAsync(url, content);
|
|
var txt = await httpResponse.Content.ReadAsStringAsync();
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 通过绑定票据获取公众号关注二维码
|
|
/// </summary>
|
|
/// <param name="ticket"></param>
|
|
/// <returns></returns>
|
|
public async static Task<WeChatApiDto> GetQRCodePicture(string ticket)
|
|
{
|
|
string url = $"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={ticket}";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 获取临时关注二维码
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <param name="postData">The post data.</param>
|
|
public async static Task<WeChatApiDto> GetQRCode(string token, string jsonData)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={token}";
|
|
var txt = await HttpHelper.PostAsync(url, jsonData);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 获取关注的公众号用户openid(获取所有OpenID)
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <param name="isGetAll">是否递归获取所有用户的</param>
|
|
/// <returns>List<System.String>.</returns>
|
|
public async static Task<WeChatApiDto> GetUsers(string token,bool isGetAll=false)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/user/get?access_token={token}";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
if (data.data == null) data.data = new WeChatOpenIDsDto();
|
|
if(!string.IsNullOrEmpty(data.next_openid))
|
|
await GetUsers(token, data.next_openid, data.data.openid);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 获取关注的公众号用户openid(递归)
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <param name="nextUser">The next user.</param>
|
|
/// <param name="users">The users.</param>
|
|
public async static Task GetUsers(string token, string nextUser, List<string> users)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/user/get?access_token={token}&next_openid={nextUser}";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
if (data.data != null && data.data.openid != null)
|
|
users.AddRange(data.data.openid);
|
|
if (!string.IsNullOrEmpty(data.next_openid))
|
|
await GetUsers(token, data.next_openid, data.data.openid);
|
|
}
|
|
/// <summary>
|
|
/// 获取菜单内容(获取菜单有menu外层,提交菜单不需要menu外层)
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <returns>System.String.</returns>
|
|
public async static Task<WeChatApiDto> GetMenu(string token)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/menu/get?access_token={token}";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 转换微信菜单按钮为事件的按钮
|
|
/// </summary>
|
|
public static void ConverMenuButtonForEvent(WeChatApiDto weChatApiDto)
|
|
{
|
|
foreach (var item in weChatApiDto?.menu?.button)
|
|
{
|
|
if (item.key.ObjToString().Equals("event") || item.type.ObjToString().Equals("event"))
|
|
{
|
|
var temp = item.type;
|
|
item.type = item.key;
|
|
item.key = temp;
|
|
}
|
|
if (item.sub_button != null)
|
|
{
|
|
ConverMenuButtonForEvent(item.sub_button);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 转换微信菜单按钮为事件的按钮
|
|
/// </summary>
|
|
public static void ConverMenuButtonForEvent(WeChatMenuButtonDto[] weChatMenuButtonDto)
|
|
{
|
|
foreach (var item in weChatMenuButtonDto)
|
|
{
|
|
if (item.key.ObjToString().Equals("event") || item.type.ObjToString().Equals("event"))
|
|
{
|
|
var temp = item.type;
|
|
item.type = item.key;
|
|
item.key = temp;
|
|
}
|
|
if (item.sub_button != null)
|
|
{
|
|
ConverMenuButtonForEvent(item.sub_button);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 设置菜单内容(设置菜单不需要menu外层)
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <param name="jsonMenu">The json menu.</param>
|
|
/// <returns>System.String.</returns>
|
|
public async static Task<WeChatApiDto> SetMenu(string token, string jsonMenu)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/menu/create?access_token={token}";
|
|
var txt = await HttpHelper.PostAsync(url, jsonMenu);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 删除菜单内容
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
|
|
public async static Task<WeChatApiDto> DeleteMenu(string token)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={token}";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 发送普通消息(群发所有人,单人发送也可以)
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <param name="jsonData">The json data.</param>
|
|
/// <returns>System.String.</returns>
|
|
public async static Task<WeChatApiDto> SendMsgToAll(string token, string jsonData)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={token}";
|
|
var txt = await HttpHelper.PostAsync(url, jsonData);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 发送普通消息(单个人-24小时内用户跟微信公众号有互动才会推送成功)
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <param name="jsonData">The json data.</param>
|
|
/// <returns>System.String.</returns>
|
|
public async static Task<WeChatApiDto> SendMsg(string token, string jsonData)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={token}";
|
|
var txt = await HttpHelper.PostAsync(url, jsonData);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 发送卡片消息模板
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <param name="jsonData">The json data.</param>
|
|
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
|
|
public async static Task<WeChatApiDto> SendCardMsg(string token, string jsonData)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={token}";
|
|
var txt = await HttpHelper.PostAsync(url, jsonData);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 拉取普通access_token
|
|
/// </summary>
|
|
/// <param name="appid">appid</param>
|
|
/// <param name="appsecret">appsecret</param>
|
|
/// <returns>返回token</returns>
|
|
public async static Task<WeChatApiDto> GetToken(string appid, string appsecret)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={appsecret}";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 获取微信服务器IP列表
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <returns>System.String.</returns>
|
|
public async static Task<WeChatApiDto> GetWechatIP(string token)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token={token}";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// openid获取微信用户信息
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <param name="openid">The openid.</param>
|
|
/// <returns>Dictionary<System.String, System.Object>.</returns>
|
|
public async static Task<WeChatApiDto> GetUserInfo(string token,string openid)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/user/info?access_token={token}&openid={openid}&lang=zh_CN";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// openid获取微信用户信息
|
|
/// </summary>
|
|
/// <param name="token">The openid.</param>
|
|
/// <param name="openid">The access token.</param>
|
|
public async static Task<WeChatApiDto> GetUserInfoTwo(string token,string openid)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/sns/userinfo?access_token={token}&openid={openid}&lang=zh_CN";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// code换取用户openID
|
|
/// </summary>
|
|
/// <param name="appid">The appid.</param>
|
|
/// <param name="appsecret">The appsecret.</param>
|
|
/// <param name="code">The code.</param>
|
|
/// <returns>Dictionary<System.String, System.Object>.</returns>
|
|
public async static Task<WeChatApiDto> GetOpenidByCode(string appid, string appsecret, string code)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={appsecret}&code={code}&grant_type=authorization_code";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
/// <summary>
|
|
/// 获取模板消息
|
|
/// </summary>
|
|
/// <param name="token">The token.</param>
|
|
/// <returns>Dictionary<System.String, System.Object>.</returns>
|
|
public async static Task<WeChatApiDto> GetTemplate(string token)
|
|
{
|
|
string url = $"https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token={token}";
|
|
var txt = await HttpHelper.GetAsync(url);
|
|
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
|
return data;
|
|
}
|
|
}
|
|
}
|
|
|