7

【开源】这可能是封装微信 API 最全的 .NET SDK 了

 2 years ago
source link: https://www.cnblogs.com/rhqyz/p/15115654.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【开源】这可能是封装微信 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 Framework 4.6.1+、.NET Standard 2.0+、.NET Core 2.0+、.NET 5。
  • 支持 Windows / Linux / macOS 多平台部署。
  • 支持 System.Text.Json(默认)和 Newtonsoft.Json 两种序列化方式。
  • 异步式编程。
  • 强类型接口模型。
  • 提供拦截器功能。
  • 提供微信 API 所需的 MD5、SHA-1、SHA-256、AES、RSA 等算法工具类。
  • 提供 SourceLink,方便项目无源码调试。
  • 完整、完善、完全的微信 API 封装,同时可灵活自行扩展。

现有以下模块:

  • 公众平台(公众号、小程序、小游戏、小商店) & 开放平台模块:SKIT.FlurlHttpClient.Wechat.Api
  • 商户平台(微信支付)模块:SKIT.FlurlHttpClient.Wechat.TenpayV3
  • 企业微信(企业号)模块:SKIT.FlurlHttpClient.Wechat.Work
  • 广告平台(广点通)模块:SKIT.FlurlHttpClient.Wechat.Ads

以接入微信支付为例,其他模块的开发流程与之十分类似。

dotnet add package SKIT.FlurlHttpClient.Wechat.TenpayV3
using SKIT.FlurlHttpClient.Wechat;using SKIT.FlurlHttpClient.Wechat.TenpayV3;using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings; /* 平台证书管理器,具体用法请参见文档 */var certManager = new InMemoryCertificateManager();/* 仅列出必须配置项。也包含一些诸如超时时间、UserAgent 等的配置项 */var options = new WechatTenpayClientOptions(){    MerchantId = "微信商户号",    MerchantV3Secret = "微信商户 v3 API 密钥",    MerchantCertSerialNumber = "微信商户证书序列号",    MerchantCertPrivateKey = "-----BEGIN PRIVATE KEY-----微信商户证书私钥-----END PRIVATE KEY-----",    CertificateManager = certManager};var client = new WechatTenpayClient(options);

发送请求:

using SKIT.FlurlHttpClient.Wechat.TenpayV3;using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; /* 以 JSAPI 统一下单接口为例 */var request = new CreatePayTransactionJsapiRequest(){    OutTradeNumber = "商户订单号",    AppId = "微信 AppId",    Description = "订单描述",    ExpireTime = DateTimeOffset.Now.AddMinutes(15),    NotifyUrl = "https://example.com",    Amount = new CreatePayTransactionJsapiRequest.Types.Amount()    {        Total = 100    },    Payer = new CreatePayTransactionJsapiRequest.Types.Payer()    {        OpenId = "微信 OpenId"    }};var response = await client.ExecuteCreatePayTransactionJsapiAsync(request);if (response.IsSuccessful()){    Console.WriteLine("PrepayId:" + response.PrepayId);}else{    Console.WriteLine("HTTP 状态:" + response.RawStatus);    Console.WriteLine("错误代码:" + response.ErrorCode);    Console.WriteLine("错误描述:" + response.ErrorMessage);}

验证响应签名:

/* 一般情况下可以跳过验证响应的签名 */bool valid = client.VerifyResponseSignature(response);

生成客户端 JS-SDK 调起支付所需参数:

/* 字典结构,包含客户端 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){    /* 将 JSON 反序列化得到通知对象 */    /* 你也可以将 WechatTenpayEvent 类型直接绑定到 MVC 模型上,这样就不再需要手动反序列化 */    var callbackModel = client.DeserializeEvent(callbackJson);    if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType))    {        /* 根据事件类型,解密得到支付通知敏感数据 */        var callbackResource = client.DecryptEventResource<Events.TransactionResource>(callbackModel);        string outTradeNumber = callbackResource.OutTradeNumber;        string transactionId = callbackResource.TransactionId;        Console.WriteLine("订单 {0} 已完成支付,交易单号为 {1}", outTradeNumber, transactionId);    }}

更多使用说明请阅读项目仓库中的开发文档。

项目仓库中还包含了一个示例项目,以供开发者快速掌握本库的使用方法。


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。
  • 本库只支持微信支付 v3 版 API;盛派微信 SDK 只支持微信支付 v2 版 API(作者开了新坑似乎是想提供 v3 版支持,不过目前只封装了部分接口,进展还比较缓慢)。原则上微信官方已经停止更新 v2 版 API,现在接口只做日常维护,所以有条件的话还是应该尽快升级。如果你有使用 v2 版 API 的需求(比如企业提现、红包等几个尚未提供 v3 版 API 的接口),建议使用盛派微信 SDK。

3. 为什么不支持 .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 以下版本的技术支持。也就是说,微软已经不再为此提供安全更新,在大部分技术合规要求中这一点都是扣分项,所以建议各位开发者目标框架能升级就升级。


以上仓库地址同步更新,均可接受 Issue 或 Pull Request。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK