缘起

今年公司某个项目需要全面接入微信支付 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 等算法工具类。

  • 完整、完善、完全的微信 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);}}

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

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


 

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。

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


 

仓库

  • GitHub:https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat

  • Gitee:https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat

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

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

  1. 封装微信小程序api请求地址

    封装微信小程序api请求地址 const API_BASE_URL = 'http://localhost:8080/test/api/'; module.exports = {IndexUrlNew ...

  2. [开源]一个基于Flurl.Http的微信API库

    公司项目要接入微信支付,公众号管理.当拿到微信提供的示例,还是.NET Framework版.现在 .NET 7都发布了好不好. 然后在NuGet上就找到了这个微信API库.使用体验很棒.它就是SKI ...

  3. v3 微信api 请求微信_企业微信API使用基本教程

    在企业微信创建自建应用 1.登录企业微信后台,在"应用管理>自建"中点击"创建应用",填写应用信息创建. API配置表参数值获取 1.corpid:企业I ...

  4. “熊孩子”乱敲键盘攻破 Linux 桌面;苹果开源代码被发现包含兼容微信的代码;网传蚂蚁启用OKR替代KPI | EA周报...

    EA周报 2021年1月22日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 周报看点 1.Flutter 在鸿蒙系统上成功运行 2."熊孩子"乱 ...

  5. 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?

    一.前言 最近通过python实现了发送消息给企业微信的功能,参考链接: [Jenkins学习 ]如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果? http ...

  6. puking java_GitHub - pukingli/mpsdk4j: JAVA微信公平台开发SDK,没有复杂的功能,一切源于微信API,愿你会喜欢使用。...

    MPSDK4J 目录 1.引言 双11是一个令不少人狂欢的日子,今天你买了么?或许在那XXX亿的曲线中能找到你的影子哟,呵~,不过这与俺无关了,只是借用这个双11来纪念一下而已.从事微信公众平台开发也 ...

  7. MPSDK4J 是JAVA微信公平台开发SDK,没有复杂的功能,一切源于微信API,愿你会喜欢使用。-- 题记

    MPSDK4J 是JAVA微信公平台开发SDK,没有复杂的功能,一切源于微信API,愿你会喜欢使用.-- 题记 1.介绍 MPSDK4J,非常直观的阐述了此项目的意义所在.没错,它就是JAVA语言环境 ...

  8. 企业微信API使用基本教程(企业微信的api接口)

    在企业微信创建自建应用 1.登录企业微信后台,在"应用管理>自建"中点击"创建应用",填写应用信息创建. API配置表参数值获取 1.corpid:企业I ...

  9. java欢迎词,企业微信API:成员个性化新客户欢迎语的nodejs实现

    目标: 在企业微信上只能设置统一的新客户欢迎语,因此我们通过API来实现为对每个成员设置个性化欢迎语. 实现环境: 白码低代码平台(该平台是低代码代发平台,提供企业微信API,可直接调用,减少前期配置 ...

最新文章

  1. python执行命令并返回结果集_Python接口测试结果集实现封装比较
  2. 学习JS的正则表达式
  3. Dreamweaver cs3快捷键大全
  4. 预训练再次跨界!百度提出ERNIE-GeoL,地理位置-语言联合预训练!
  5. 为什么线程池里的方法会执行两次_新手一看就懂的线程池
  6. oracle查询学生人数语句,Oracle期末复习题-带答案
  7. Centos KVM 基本安装过程
  8. UTF-8 encode decode 集合
  9. Java-实现图书管理系统
  10. 【Proteus仿真】自动量程(范围<10V)切换数字电压表
  11. C语言实现简单的电子通讯录
  12. win7禁用驱动签名验证_如何在64位Windows 8或10上禁用驱动程序签名验证(以便可以安装未签名的驱动程序)...
  13. adobe scout cc 2015中文版下载(附使用教程)
  14. 部暑nginx digest auth
  15. 插入mysql数据库时间相差14个小时
  16. EMUI10android系统下载,华为EMUI11系统正式版安装包
  17. “请输入的月份“判断季节
  18. 反编译apk获得源代码
  19. EPC总承包的概念理解
  20. Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】

热门文章

  1. 案例部署——GlusterFS分布式文件系统群集
  2. 关于开发中怎么找问题并且解决思路(实操)
  3. Apache Tomcat安装和配置(Windows环境xia)
  4. Python+Neo4j构建时光网TOP100电影知识图谱
  5. 菊次郎的夏天.mp3
  6. Bluetooth Profile Specification之(HFP篇)4.2 免提控制之服务级别连接释放和登记状态传输、信号强度传输、漫游状态指示
  7. 端到端与点到点到底是什么?
  8. Prolific PL2303 usb 转串口Win8 Win8.1驱动
  9. 逻辑值分类True False
  10. Redis中五大基本数据类型和三种特殊数据类型详解