- 开源微信支付 v3 版 .Net SDK(支持 .NET Core / Framework,完整封装全部 v3 API)
基于 [代码]Flurl.Http[代码] 的微信支付 API v3 版 .NET SDK。 注意:本库仅支持 v3 版 API,如需 v2 版 API 请移步 SKIT.FlurlHttpClient.Wechat.TenpayV2。 [图片] [图片] [图片] [图片] [图片] GitHub 项目地址:https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat Gitee 项目地址:https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat NuGet 项目地址:https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3 前言 目前网络上还没有基于微信支付 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、.NET 6。 支持 Windows / Linux / macOS 多平台部署。 支持 [代码]System.Text.Json[代码](默认)和 [代码]Newtonsoft.Json[代码] 两种序列化方式。 异步式编程。 强类型接口模型。 支持拦截器功能。 完整、完善、完全的微信支付 API 封装,支持目前(截至 2021-12-01)微信支付提供的全部 v3 版 API。 支持直连商户、服务商两种模式。 请求时自动生成签名,无需开发者手动干预。 提供了微信支付所需的 RSA、AES、SHA-256 等算法工具类。 提供 SourceLink,方便项目无源码调试。 提供了生成 JS-SDK/APP 调起支付参数及签名、加密请求敏感数据、解析响应敏感数据、解析回调通知事件敏感数据等扩展方法。 基础用法 安装: [代码]# 通过 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 manager = new InMemoryCertificateManager(); /* 仅列出必须配置项。也包含一些诸如超时时间、UserAgent 等的配置项 */ var options = new WechatTenpayClientOptions() { MerchantId = "微信商户号", MerchantV3Secret = "微信商户 v3 API 密钥", MerchantCertificateSerialNumber = "微信商户证书序列号", MerchantCertificatePrivateKey = "-----BEGIN PRIVATE KEY-----微信商户证书私钥-----END PRIVATE KEY-----", PlatformCertificateManager = manager }; 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 = 100 }, Payer = new Models.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); } } [代码] 更多使用说明请阅读项目仓库中的开发文档。 项目仓库中还包含了一个示例项目,以供开发者快速掌握本库的使用方法。 高级技巧 点此查看完整文档。
2022-07-21 - 视频号关联小商店/小程序
更新:以下内容适用于微信8.0.6版本前的设备,微信8.0.6版本后的设备详见指引 一、视频号关联商店的作用 [图片][图片] 二、关联条件 「小商店」 当前视频号的超级管理员为小商店的超级管理员当前视频号的超级管理员为小商店的成员「小程序」 当前视频号和小程序的主体一致当前视频号和小程序的超级管理员一致视频号的管理员为小程序的推广者(可在mp后台交易组件模块设置)三、如何上架直播 请完成视频号关联小商店/小程序步骤后,前往查看视频号直播关联小商店/小程序指引 四、视频号关联小商店/小程序步骤的详细说明 [图片][图片] 更多资讯,欢迎到【交流专区】微信小商店主页发帖和寻找答案。
2021-06-11 - 1.02.1907160版本上传开放平台,提交代码报85045?
用1.02.1907160开发工具上传开放平台,提交代码报错[代码]{[代码][代码]"errcode"[代码][代码]:85045,[代码][代码]"errmsg"[代码][代码]:[代码][代码]"some path in ext_json not exist hint: [liDiLa06453064]"[代码][代码]}[代码]用旧的1.02.1904090开发工具上传开放平台,提交代码正常[代码]{[代码][代码]"errcode"[代码][代码]:0,[代码][代码]"errmsg"[代码][代码]:[代码][代码]"ok"[代码][代码]}[代码] post的数据是一模一样,请问是哪里配置问题?或是BUG?
2019-08-12