全网最完整 C# 版微信SDK开源了 !
The following article is from Dotnet 工具箱 Author 工具箱
前言
基于 Flurl.Http 的微信 HTTP API SDK,目前已包含公众平台、开放平台、商户平台、企业微信、广告平台、对话开放平台等模块。
C# 版微信 SDK
SKIT.FlurlHttpClient.Wechat,可能是全网最完整的 C# 版微信 SDK,封装全部已知的微信 API,包含微信公众平台(订阅号+服务号+小程序+小游戏+小商店+视频号)、微信开放平台、微信商户平台(微信支付+微企付)、企业微信、微信广告平台、微信智能对话开放平台等模块,可跨平台。
基于 Flurl.Http 的微信 HTTP API SDK,目前已包含公众平台、开放平台、商户平台、企业微信、广告平台、对话开放平台等模块。
功能特性
基于 Flurl.Http
,可与 IHttpClientFactory
集成。
支持 .NET Framework 4.6.1+、.NET Standard 2.0+、.NET Core 2.0+、.NET 5+。
支持 Windows / Linux / macOS 多平台部署。
支持 System.Text.Json
(默认)和 Newtonsoft.Json
两种序列化方式。
强类型接口模型。
全异步式编程。
提供 SourceLink 调试符号文件。
完整、完善、完全的微信 HTTP API 封装。
包含功能模块,公众平台(公众号、小程序、视频号)+ 开放平台模块, 商户平台(微信支付)模块,商户平台(微信支付)模块,企业微信(企业号)模块,广告平台(广点通)模块,对话开放平台(微信智能对话)模块,腾讯微企付模块。
关于 SKIT.FlurlHttpClient.Wechat 的问题
1、为什么要"造轮子"?
这都 2023 年了,官方本身提供的示例代码还只能运行在 .NET Framework on Windows 上;就连 RSA 签名这么基础的东西都没有人封装(确切地说是因为 RSA 有很多种分块模式和填充模式,网上能找到的往往只封装了其中一种,但却未必符合微信的要求);
全网很难找到一个封装微信 API 尽可能全的 .NET SDK,开源的项目有不少,但作者能坚持下去的不多。
于是萌生了自己封装一个库的想法,打算解决这几个痛点,同时也是推广一下微软官方的 System.Text.Json。
2、这个库与盛派微信 SDK有什么区别?
注:盛派微信 SDK 是由苏震巍先生发起的国内知名的 .NET 开源项目。
本库专注于 API 本身的封装,捎带提供了一些用于加解密、序列化的工具类,使用起来更加灵活,不限任何框架或项目类型;盛派微信 SDK 提供了大而全的功能,与 MVC / WebAPI 深度集成。
本库的接口模型遵循的是微软官方推荐的 C# 属性命名方式(帕斯卡命名法);盛派微信 SDK 提供的是微信接口本身的命名方式(蛇形命名法和驼峰命名法混杂)。
本库封装了目前微信官方提供的几乎所有 API(极个别不支持的已在各模块文档中列出具体原因);盛派微信 SDK 只提供了常用的 API。
3、Flurl.Http 是什么?
Flurl.Http 是一个轻量级 HTTP 库,是 .NET 中最受欢迎扩展库之一,在 NuGet 上的累计下载量超过 1700 万、日均下载量超过 6 千、GitHub 2.6k Stars(数据统计截至 2021-06-01)。
与另一个流行的 HTTP 库 RestSharp 相比,Flurl.Http 底层基于 System.Net.Http.HttpClient,而 RestSharp 底层则基于 System.Net.HttpWebRequest,前者在多核多线程环境下的性能基准测试中表现要远优于后者,同时也是微软官方目前推荐的 HTTP 客户端方案。
注:微软官方关于 System.Net.HttpWebRequest 与 System.Net.Http.HttpClient 的说明:
《Microsoft Docs - HttpWebRequest 类(Systen.Net)》 《Microsoft Docs - HttpClient 类(Systen.Net.Http)》
4、为什么不支持 .NET Framework 4.0 / .NET Framework 4.5?
直接原因是本项目的依赖库最低支持到 .NET Framework 4.6.1。
间接原因是为了支持跨平台的 .NET Standard 2.0,只能兼容到 .NET Framework 4.6.1。
根本原因是微软官方已于 2016 年 1 月 12 日终止了对 .NET Framework 4.6.1 以下版本的技术支持(详情请阅读官方公告)。也就是说,微软已经不再为此提供安全更新,在大部分技术合规要求中这一点都是扣分项,所以建议各位开发者目标框架能升级就升级。
5、源码发现模型定义里很多同样的代码是复制粘贴的,为什么不使用面向对象中的继承?
关于这点得吐槽微信提供的 API 了,很显然微信内部也是很多个 Team 在共同开发,每个 Team、甚至每个人的字段命名风格、约束条件、接口规则都大相径庭。就连微信支付虽然 v3 版 API 号称是 “RESTful” 的,却也没个统一标准。
举个例子,以分页查询为例,看似字段相同,都由 offset、cursor、page、limit + data、total_count、next_cursor 这几个字段构成,但某些接口的 offset、cursor、page、limit 字段是可选参数,某些却是必填项;某些 page 值从 0 起始,某些却是从 1 起始;某些接口的 data、total_count、next_cursor 字段一定会返回,某些却是一定不返回,某些只在特定条件下返回。一共十几个分页查询的接口,却有七八种分页的数据结构,这种情况下很难抽象出一个公共的基类出来。
除此之外,同样一个东西在不同接口里竟然拼法不一样;同样是表示数组有的是 JSON、有的却是字符串;诸如此类"奇葩"的情况很多很多。
本项目已经尽可能在条件允许的范围内抽象出了一些公共基类、并封装了各种奇怪场景下的自定义 JsonConverter。
6、所有 API 都经过了测试吗?
由于微信的产品业务线众多,很多业务也需要前置条件才能继续,截至目前本项目已封装超过 2000 余个 API,虽然同时也编写了若干单元测试用例,但与数量庞大的 API 相比仍远远不够。
本项目严格按照微信官方提供的开发文档进行封装,并利用自动化工具保证封装结果的正确。但微信的文档本身质量很低,所以存在错误在所难免。
因为微信更新 API 很频繁,对于微信支付或企业微信这种有提供官方更新日志的,本项目会定期查阅更新;其他平台经常会悄悄地更新一波、让所有人懵逼。如果你在使用中遇到了因接口或模型定义错误而产生的问题,欢迎提出 Issue。
C# 对接示例
nuget 安装 SKIT.FlurlHttpClient.Wechat.Api
# 通过 NuGet 安装>
Install-Package SKIT.FlurlHttpClient.Wechat.Api
对 SDK 进行初始化
using SKIT.FlurlHttpClient.Wechat;
using SKIT.FlurlHttpClient.Wechat.Api;
var options = new WechatApiClientOptions()
{
AppId = "微信 AppId",
AppSecret = "微信 AppSecret",
ImmeDeliveryAppKey = "即时配送相关服务 AppKey,不用则不填",
ImmeDeliveryAppSecret = "即时配送相关服务 AppSecret,不用则不填",
MidasOfferId = "米大师(虚拟支付 1.0)相关服务 OfferId,不用则不填",
MidasOfferIdV2 = "米大师(虚拟支付 2.0)相关服务 OfferId,不用则不填",
MidasAppKey = "米大师(虚拟支付 1.0)相关服务 AppKey,不用则不填",
MidasAppKeyV2 = "米大师(虚拟支付 2.0)相关服务 AppKey,不用则不填"
};
var client = new WechatApiClient(options);
请求和响应
using SKIT.FlurlHttpClient.Wechat.Api;
using SKIT.FlurlHttpClient.Wechat.Api.Models;
/* 以公众号获取用户信息接口为例 */
var request = new CgibinUserInfoRequest()
{
AccessToken = "微信 AccessToken",
OpenId = "微信 OpenId"
};
var response = await client.ExecuteCgibinUserInfoAsync(request);
if (response.IsSuccessful())
{
Console.WriteLine("昵称:" + response.Nickname);
Console.WriteLine("头像:" + response.HeadImageUrl);
}
else
{
Console.WriteLine("错误代码:" + response.ErrorCode);
Console.WriteLine("错误描述:" + response.ErrorMessage);
}
项目地址
https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat
- EOF -
看完本文有收获?请转发分享给更多人
推荐关注「DotNet」,提升.Net技能
点赞和在看就是最大的支持❤️