【开源】这可能是封装微信 API 最全的 .NET SDK 了
缘起
今年公司某个项目需要全面接入微信支付 V3 版 API。起初觉得,2014 年微信支付就已上线了 V3 版 API,这都 2021 年了,就算官方不给力,怎么着社区也该有几个造好的 .NET 的轮子了吧?于是兴冲冲地到 NuGet 上开始搜索“微信支付”四个大字,结果……
倒不是没有现成的轮子,但基本都是只包含一些简单 API(如下单、查单、退款等等),与需求不符;偶尔有一些看似封装全的,点进去一看却是基于 V2 版 API 的。
没方法,自己动手,丰衣足食!
接入了微信支付后想着,既然微信支付都有了,为啥不把公众号、小程序、企业微信之类的也接入了呢?
于是乎 SKIT.FlurlHttpClient.Wechat 这个项目就诞生了。
项目介绍
SKIT.FlurlHttpClient.Wechat 是一个基于 Flurl.Http 的微信 API HTTP 客户端。
包含以下特性
支持 .NET Frameork 4.6.1+、.NET Standard 2.0+、.NET Core 2.0+、.NET 5。
支持 Windos / Linux / macOS 多平台部署。
支持 System.Text.Json(默认)和 Netonsoft.Json 两种序列化方式。
异步式编程。
强类型接口模型。
提供拦截器功能。
提供微信 API 所需的 MD5、SHA-1、SHA-256、AES、RSA 等算法工具类。
完整、完善、完全的微信 API 封装,可灵活自行扩展。
现有以下模块
公众平台(公众号、小程序、小游戏、小商店) & 开放平台模块SKIT.FlurlHttpClient.Wechat.Api
商户平台(微信支付)模块SKIT.FlurlHttpClient.Wechat.TenpayV3
企业微信(企业号)模块SKIT.FlurlHttpClient.Wechat.Work
广告平台(广点通)模块SKIT.FlurlHttpClient.Wechat.Ads
快速开始
以接入微信支付为例,其他模块的开发流程与之十分类似。
安装dot add package SKIT.FlurlHttpClient.Wechat.TenpayV3初始化
using SKIT.FlurlHttpClient.Wechat;using SKIT.FlurlHttpClient.Wechat.TenpayV3;using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings; var certManager = ne InMemoryCertificateManager();var options = ne WechatTenpayClientOptions(){MerchantId = "微信商户号",MerchantV3Secret = "微信商户 v3 API 密钥",MerchantCertSerialNumber = "微信商户证书序列号",MerchantCertPrivateKey = "-----BEGIN PRIVATE KEY-----微信商户证书私钥-----END PRIVATE KEY-----",CertificateManager = certManager};var client = ne WechatTenpayClient(options);发送请求
using SKIT.FlurlHttpClient.Wechat.TenpayV3;using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; var request = ne CreatePayTransactionJsapiRequest(){OutTradeNumber = "商户订单号",AppId = "微信 AppId",Description = "订单描述",ExpireTime = DateTimeOffset.No.AddMinutes(15),NotifyUrl = "https://example.",Amount = ne CreatePayTransactionJsapiRequest.Types.Amount(){Total = 100},Payer = ne CreatePayTransactionJsapiRequest.Types.Payer(){OpenId = "微信 OpenId"}};var response = aait client.ExecuteCreatePayTransactionJsapiAsync(request);if (response.IsSuessful()){Console.WriteLine("PrepayId" + response.PrepayId);}else{Console.WriteLine("HTTP 状态" + response.RaStatus);Console.WriteLine("错误代码" + response.ErrorCode);Console.WriteLine("错误描述" + response.ErrorMessage);}验证响应签名
bool valid = client.VerifyResponseSignature(response);生成客户端 JS-SDK 调起支付所需参数
var paramMap = client.GenerateParametersForJsapiPayRequest(request.AppId, response.PrepayId);验签、解析并解密微信回调通知中的敏感信息
string callbackJson = "{ 微信商户平台发来的 JSON 格式的通知内容 }";string callbackTimestamp = "微信回调通知中的 Wechatpay-Timestamp 标头";string callbackNonce = "微信回调通知中的 Wechatpay-Nonce 标头";string callbackSignature = "微信回调通知中的 Wechatpay-Signature 标头";string callbackSerialNumber = "微信回调通知中的 Wechatpay-Serial 标头"; bool valid = client.VerifyEventSignature(callbackTimestamp, callbackNonce, callbackJson, callbackSignature, callbackSerialNumber);if (valid){var callbackModel = client.DeserializeEvent(callbackJson);if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType)){var callbackResource = client.DecryptEventResource(callbackModel);string outTradeNumber = callbackResource.OutTradeNumber;string transactionId = callbackResource.TransactionId;Console.WriteLine("订单 {0} 已完成支付,交易单号为 {1}", outTradeNumber, transactionId);}}
更多使用说明请阅读项目仓库中的开发文档。
项目仓库中还包含了一个示例项目,以供开发者快速掌握本库的使用方法。
FAQ 1. 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 客户端方案。
2. 本库与盛派微信 SDK(Senparc.Weixin)有什么区别?本库专注于 API 本身的封装,捎带提供了一些用于加解密、序列化的工具类,使用更灵活;盛派微信 SDK 提供了大而全的功能,可与 MVC / WebAPI 深度集成。
本库遵循微软官方推荐的 C# 属性命名方式(大驼峰命名法)对接口模型进行定义;盛派微信 SDK 提供的是微信接口本身的命名方式(蛇形命名法和小驼峰命名法混杂)。
本库封装了目前微信官方提供的所有 API;盛派微信 SDK 只提供了常用的 API。
直接原因是本库的依赖库最低支持到 .NET Frameork 4.6.1。
间接原因是为了支持跨平台的 .NET Standard 2.0,只能兼容到 .NET Frameork 4.6.1。
根本原因是微软官方已于 2016 年 1 月 12 日终止了对 .NET Frameork 4.6.1 以下版本的技术支持。也就是说,微软已经不再为此提供安全更新,在大部分技术合规要求中这一点都是扣分项,所以建议各位开发者目标框架能升级就升级。
仓库
GitHubhttps://github./fudiei/DotNetCore.SKIT.FlurlHttpClient.Wechat
Giteehttps://gitee./fudiei/DotNetCore.SKIT.FlurlHttpClient.Wechat
以上仓库地址同步更新,均可接受 Issue 或 Pull Request。