基于 Flurl.Http 的微信支付 v3 版 .Net SDK(开源)
发布于 4 年前 作者 jing52 1120 次浏览 来自 分享

基于 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
  • 支持__直连商户__、__服务商__两种模式。
  • 请求时__自动生成签名__,无需开发者手动干预。
  • 提供了微信支付所需的 RSAAES-GCMSHA-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);

高级技巧

点此查看完整文档

回到顶部