基于 Flurl.Http
的微信支付 API v3 版 .NET SDK。
GitHub 项目地址:https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat
NuGet 项目地址:https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3
前言
Flurl.Http
是一个轻量级 HTTP 库,是 .NET 中最受欢迎扩展库之一,在 NuGet 上的累计下载量超过 1200 万、日均下载量超过 5 千、GitHub 2.6k Stars(数据统计截至 2021-05-01)。与另一个流行的 HTTP 库
RestSharp
相比,Flurl.Http
底层基于System.Net.Http.HttpClient
,而RestSharp
底层则基于System.Net.HttpWebRequest
,前者在多核多线程环境下的性能基准测试中表现要远优于后者,同时也是微软官方目前推荐的 HTTP 客户端方案。
目前网络上还没有基于微信支付 v3 版 API 完整封装的 .NET 客户端(大部分只提供了基础的如支付、退款一类 API 封装),遑论开源了;这都 2021 年了,官方本身提供的示例代码还只能运行在 .NET Framework on Windows 上;就连 RSA 签名这么基础的东西都没有人封装(确切的说是因为 RSA 有很多种分块模式和填充模式,网上能找到的往往只封装了其中一种,但却未必符合微信支付的要求)。
于是萌生了自己封装一个库的想法,打算解决这几个痛点,同时也是推广一下微软官方的 System.Text.Json
。
特性
- 基于
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
两种序列化方式。 - 异步式编程。
- 强类型接口模型。
- 完整的微信支付 API 封装,支持目前(截至 2021-05-01)微信支付提供的全部 v3 版 API。
- 支持__直连商户__、__服务商__两种模式。
- 请求时__自动生成签名__,无需开发者手动干预。
- 提供了微信支付所需的 RSA、AES-GCM、SHA-256 等算法工具类。
- 提供了__调起支付签名__、解析响应敏感数据、__解析回调通知事件敏感数据__等扩展方法。
基础用法
安装:
# 通过 NuGet 安装
> Install-Package SKIT.FlurlHttpClient.Wechat.TenpayV3
# 通过 dotnet-tools 安装
> dotnet add package SKIT.FlurlHttpClient.Wechat.TenpayV3
你也可通过 Visual Studio NuGet 管理器图形化界面安装(注意搜索时需勾选“包括预发行版”)。
初始化:
using SKIT.FlurlHttpClient.Wechat;
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
var options = new WechatTenpayClientOptions()
{
MerchantId = "微信商户号",
MerchantV3Secret = "微信商户 v3 API 密钥",
MerchantCertSerialNumber = "微信商户证书序列号",
MerchantCertPrivateKey = "-----BEGIN PRIVATE KEY-----微信商户证书私钥-----END PRIVATE KEY-----"
};
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 Models.CreatePayTransactionJsapiRequest.Types.Amount()
{
Total = 1
},
Payer = new Models.CreatePayTransactionJsapiRequest.Types.Payer()
{
OpenId = TestConfigs.WechatOpenId
}
};
var response = await TestClients.Instance.ExecuteCreatePayTransactionJsapiAsync(request);