init commit

This commit is contained in:
Fu Diwei
2021-05-10 15:30:00 +08:00
commit 5b13f3f558
916 changed files with 38562 additions and 0 deletions

3
docs/WechatApi/README.md Normal file
View File

@@ -0,0 +1,3 @@
# SKIT.FlurlHttpClient.Wechat.Api
*开发中,未完待续 ...*

View File

@@ -0,0 +1,27 @@
### 如何解密回调通知事件中的敏感数据?
---
> 请先自行阅读:
>
> [《微信支付开发者文档 - 开发指南:证书和回调报文解密》](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_2.shtml)
对于回调通知事件的敏感信息,微信支付平台使用了商户公钥基于 RSA 算法加密。
开发者利用本库提供的 `RsaUtil` 工具类自行解密相关字段。
此外,本库还封装了直接解密事件的扩展方法,下面给出一个示例:
```csharp
string callbackJson = "..."; // 微信支付平台发来的通知内容
var callbackModel = client.DeserializeCallback(callbackJson); // 得到通知对象
if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType))
{
var callbackResource = client.DecryptCallbackResource<Resources.TransactionResource>(callbackModel); // 得到支付通知敏感数据
string outTradeNumber = callbackResource.OutTradeNumber;
string transactionId = callbackResource.TransactionId;
}
```
完整的回调通知模型定义可以参考项目目录下的 _src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources_ 目录。

View File

@@ -0,0 +1,50 @@
### 如何在 ASP.NET Core 中与 `IHttpClientFactory` 集成?
---
> 请先自行阅读:
>
> [《Microsoft Docs - 使用 IHttpClientFactory 实现复原 HTTP 请求》](https://docs.microsoft.com/zh-cn/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests)
>
> [《Microsoft Docs - 在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求》](https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests#httpclient-and-lifetime-management)
你可以在构造得到 `WechatTenpayClient` 对象后:
```csharp
client.Configure(settings =>
{
settings.HttpClientFactory = HttpClientFactory; // 赋值为依赖注入的 `IHttpClientFactory` 对象
});
```
下面给出一个使用了依赖注入的完整例子:
```csharp
using System.Net.Http;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Options;
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
public class MyWechatClientFactory
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly IOptions<WechatTenpayClientOptions> _wechatTenpayClientOptions;
public MyWechatClient(
IHttpClientFactory httpClientFactory,
IOptions<WechatTenpayClientOptions> wechatTenpayClientOptions)
{
_httpClientFactory = httpClientFactory;
_wechatTenpayClientOptions = wechatTenpayClientOptions;
}
public WechatTenpayClient CreateClient()
{
var client = new WechatTenpayClient(_wechatTenpayClientOptions.Value);
client.Configure(settings => settings.HttpClientFactory = _httpClientFactory);
return client;
}
}
```

View File

@@ -0,0 +1,46 @@
### 如何指定 JSON 序列化器?
---
> 请先自行阅读:
>
> [《Microsoft Docs - .NET 中的 JSON 序列化和反序列化(封送和拆收)》](https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-overview)
默认情况下,本库使用 `System.Text.Json` 作为 JSON 序列化器。
如果你更习惯于 `Newtonsoft.Json`,那么你可以在构造得到 `WechatTenpayClient` 对象后:
```csharp
client.Configure(settings =>
{
settings.JsonSerializer = new FlurlNewtonsoftJsonSerializer();
});
```
此外,如果你希望调整一些序列化器的配置项,那么可以:
```csharp
using System.Text.Json;
using SKIT.FlurlHttpClient.Wechat;
client.Configure(settings =>
{
var jsonOptions = FlurlSystemTextJsonSerializer.GetDefaultSerializerOptions();
jsonOptions.WriteIndented = true;
settings.JsonSerializer = new FlurlSystemTextJsonSerializer(jsonOptions);
});
```
使用 `Newtonsoft.Json` 时也是同样的:
```csharp
using Newtonsoft.Json;
using SKIT.FlurlHttpClient.Wechat;
client.Configure(settings =>
{
var jsonSettings = FlurlNewtonsoftJsonSerializer.GetDefaultSerializerSettings();
jsonSettings.Formatting = Formatting.Indented;
settings.JsonSerializer = new FlurlNewtonsoftJsonSerializer(jsonSettings);
});
```

View File

@@ -0,0 +1,9 @@
### 如何查看商户证书序列号?
---
> 请先自行阅读:
>
> [《微信支付开发者文档 - 证书/密钥/签名介绍:私钥和证书 - 声明所使用的证书》](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_1.shtml#part-3)
>
> [《微信支付开发者文档 - 常见问题:证书相关 - 如何查看证书序列号?》](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay7_0.shtml#part-5)

View File

@@ -0,0 +1,789 @@
### 如何快速找到需要调用的 API 模型类名 / 方法名?
---
本库提供的请求模型、响应模型和接口方法,三者均保持同名。
例如,发起退款的请求是 `CreateRefundDomesticRefundRequest`,响应是 `CreateRefundDomesticRefundResponse`,接口是 `CreateRefundDomesticRefundAsync()`。知道其中一个,其余两个就可以快速地推断出了。
再有,每个对象的命名与官方文档的接口地址大体保持一致。例如刚刚提到的发起退款,它的接口地址是 `[POST] /refund/domestic/refunds`,将其中的反斜杠去掉、并以大驼峰命名法的方式调整它,就可以得到前文提到的几个对象了。
另外,以 `Query` 开头的一般表示列表查询;以 `Get` 开头的一般表示获取详情;以 `Create` 开头的一般表示发起或新建操作;以 `Update``Modify` 开头的一般表示修改操作;以 `Set` 开头的一般表示设置操作。
完整的模型定义可以参考项目目录下的 _src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models_ 目录。
---
【附 1】直连商户模式 API 模型命名速查表:
注:树形结构与[微信支付开发者文档](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml)目录结构保持一致。
<details>
<summary>展开</summary>
- 平台证书
- 获取平台证书:`QueryCertificates`
- 基础支付
- JSAPI 支付
- 统一下单:`CreatePayTransactionJsapi`
- 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber`
- 关闭订单:`ClosePayTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- APP 支付
- 统一下单:`CreatePayTransactionApp`
- 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber`
- 关闭订单:`ClosePayTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- H5 支付
- 统一下单:`CreatePayTransactionH5`
- 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber`
- 关闭订单:`ClosePayTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- Native 支付
- 统一下单:`CreatePayTransactionNative`
- 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber`
- 关闭订单:`ClosePayTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- 小程序支付
- 统一下单:`CreatePayTransactionJsapi`
- 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber`
- 关闭订单:`ClosePayTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- 合单支付
- 合单 APP 下单:`CreateCombineTransactionApp`
- 合单 H5 下单:`CreateCombineTransactionH5`
- 合单 JSAPI 下单:`CreateCombineTransactionJsapi`
- 合单小程序下单:`CreateCombineTransactionJsapi`
- 合单 Native 下单:`CreateCombineTransactionNative`
- 合单查询订单:`GetCombineTransactionByCombineOutTradeNumber`
- 合单关闭订单:`CloseCombineTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单个退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- 经营能力
- 微信支付分(免确认模式)
- 创单结单合并:`CreatePayScoreServiceOrderDirectComplete`
- 微信支付分(免确认预授权模式)
- 商户预授权:`ApplyPayScorePermissions`
- 查询用户授权记录(授权协议号):`GetPayScorePermissionsByAuthorizationCode`
- 解除用户授权关系(授权协议号):`TerminatePayScorePermissionsByAuthorizationCode`
- 查询用户授权记录OpenId`GetPayScorePermissionsByOpenId`
- 解除用户授权关系OpenId`TerminatePayScorePermissionsByOpenId`
- 微信支付分(公共 API
- 创建支付分订单:`CreatePayScoreServiceOrder`
- 查询支付分订单:`GetPayScoreServiceOrderByQueryId` / `GetPayScoreServiceOrderByOutOrderNumber`
- 取消支付分订单:`CancelPayScoreServiceOrder`
- 修改订单金额:`ModifyPayScoreServiceOrder`
- 完结支付分订单:`SetPayScoreServiceOrderComplete`
- 商户发起催收扣款:`SetPayScoreServiceOrderPay`
- 同步服务订单信息:`SetPayScoreServiceOrderSync`
- 申请退款:`CreateRefundDomesticRefund`
- 查询退款:`GetRefundDomesticRefundByOutRefundNumber`
- 微信先享卡
- 预受理领卡请求:`PrepareDiscountCard`
- 增加用户记录:`AddDiscountCardUserRecord`
- 查询先享卡订单:`GetDiscountCardByOutCardCode`
- 支付即服务
- 服务人员注册:`CreateSmartGuide`
- 服务人员分配:`AssignSmartGuide`
- 服务人员查询:`QuerySmartGuides`
- 服务人员信息更新:`UpdateSmartGuide`
- 行业方案
- 智慧商圈
- 商圈积分同步:`NotifyBusinessCirclePoints`
- 商圈积分授权查询:`GetBusinessCircleUserAuthorizationByOpenId`
- 营销工具
- 代金券
- 创建代金券批次:`CreateMarketingFavorStock`
- 激活代金券批次:`StartMarketingFavorStock`
- 发放代金券批次:`SendMarketingFavorUserCoupon`
- 暂停代金券批次:`PauseMarketingFavorStock`
- 重启代金券批次:`RestartMarketingFavorStock`
- 条件查询批次列表:`QueryMarketingFavorStocks`
- 查询批次详情:`GetMarketingFavorStockByStockId`
- 查询代金券详情:`GetMarketingFavorUserCouponByCouponId`
- 查询代金券可用商户:`QueryMarketingFavorStockMerchants`
- 查询代金券可用单品:`QueryMarketingFavorStockItems`
- 根据商户号查用户的券:`QueryMarketingFavorUserCoupons`
- 下载批次核销明细:`GetMarketingFavorStockUseFlow`
- 下载批次退款明细:`GetMarketingFavorStockRefundFlow`
- 设置消息通知地址:`UpdateMarketingFavorCallback`
- 商家券
- 创建商家券:`CreateMarketingBusifavorStock`
- 查询商家券详情:`GetMarketingBusifavorStockByStockId`
- 核销用户券:`SetMarketingBusifavorCouponUsed`
- 根据过滤条件查询用户券:`QueryMarketingBusifavorUserCoupons`
- 查询用户单张券详情:`GetMarketingBusifavorUserCouponByCouponCode`
- 上传预存 Code`UploadMarketingBusifavorStockCouponCodes`
- 设置商家券事件通知地址:`UpdateMarketingBusifavorCallback`
- 查询商家券事件通知地址:`GetMarketingBusifavorCallback`
- 关联订单信息:`AssociateMarketingBusifavorCoupon`
- 取消关联订单信息:`DisassociateMarketingBusifavorCoupon`
- 修改批次预算:`UpdateMarketingBusifavorStockBudget`
- 修改商家券基本信息:`UpdateMarketingBusifavorStock`
- 申请退券:`CreateMarketingBusifavorCouponReturn`
- 使券失效:`DeactivateMarketingBusifavorCoupon`
- 营销补差付款:`CreateMarketingBusifavorSubsidyPayReceipt`
- 营销补差回退:`CreateMarketingBusifavorSubsidyReturnReceipt`
- 查询营销补差付款单详情:`GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptId`
- 委托营销
- 建立合作关系:`BuildMarketingPartnership`
- 终止合作关系:`TerminateMarketingPartnership`
- 查询合作关系列表:`QueryMarketingPartnerships`
- 消费卡
- 发放消费卡:`SendMarketingBusifavorCoupon`
- 支付有礼
- 创建全场满额送活动:`CreateMarketingPayGiftActivityUniqueThresholdActivity`
- 查询活动详情接口:`GetMarketingPayGiftActivityByActivityId`
- 查询活动发券商户号:`QueryMarketingPayGiftActivityMerchants`
- 查询活动指定商品列表:`QueryMarketingPayGiftActivityGoods`
- 终止活动:`TerminateMarketingPayGiftActivity`
- 新增活动发券商户号:`AddMarketingPayGiftActivityMerchant`
- 获取支付有礼活动列表:`QueryMarketingPayGiftActivities`
- 删除活动发券商户号:`DeleteMarketingPayGiftActivityMerchant`
- 图片上传(营销专用):`UploadMarketingMediaImage`
- 风险合规
- 消费者投诉 2.0
- 查询投诉单列表:`QueryMerchantServiceComplaints`
- 查询投诉单详情:`GetMerchantServiceComplaintByComplaintId`
- 查询投诉协商历史:`QueryMerchantServiceComplaintNegotiationHistories`
- 创建投诉通知回调地址:`CreateMerchantServiceComplaintNotification`
- 查询投诉通知回调地址:`GetMerchantServiceComplaintNotification`
- 更新投诉通知回调地址:`UpdateMerchantServiceComplaintNotification`
- 删除投诉通知回调地址:`DeleteMerchantServiceComplaintNotification`
- 提交回复:`CreateMerchantServiceComplaintResponse`
- 反馈处理完成:`SetMerchantServiceComplaintComplete`
- 商户上传反馈图片:`UploadMerchantServiceImage`
- 其他能力
- 图片上传:`UploadMerchantMediaImage`
- 视频上传:`UploadMerchantMediaVideo`
</details>
---
【附 2】服务商模式 API 模型命名速查表:
注:树形结构与[微信支付开发者文档](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/index.shtml)目录结构保持一致。
<details>
<summary>展开</summary>
- 平台证书
- 获取平台证书:`QueryCertificates`
- 商户进件
- 特约商户进件
- 提交申请单:`CreateApplyForSubMerchantApplyment`
- 查询申请单状态:`GetApplyForSubMerchantApplymentByApplymentId` / `GetApplyForSubMerchantApplymentByBusinessCode`
- 修改结算帐号:`ModifyApplyForSubMerchantSettlement`
- 查询结算账户:`GetApplyForSubMerchantSettlement`
- 基础支付
- JSAPI 支付
- 统一下单:`CreatePayPartnerTransactionJsapi`
- 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber`
- 关闭订单:`ClosePayPartnerTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- APP 支付
- 统一下单:`CreatePayPartnerTransactionApp`
- 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber`
- 关闭订单:`ClosePayPartnerTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- H5 支付
- 统一下单:`CreatePayPartnerTransactionH5`
- 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber`
- 关闭订单:`ClosePayPartnerTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- Native 支付
- 统一下单:`CreatePayPartnerTransactionNative`
- 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber`
- 关闭订单:`ClosePayPartnerTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- 小程序支付
- 统一下单:`CreatePayPartnerTransactionJsapi`
- 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber`
- 关闭订单:`ClosePayPartnerTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- 合单支付
- 合单 APP 下单:`CreateCombineTransactionApp`
- 合单 H5 下单:`CreateCombineTransactionH5`
- 合单 JSAPI 下单:`CreateCombineTransactionJsapi`
- 合单小程序下单:`CreateCombineTransactionJsapi`
- 合单 Native 下单:`CreateCombineTransactionNative`
- 合单查询订单:`GetCombineTransactionByCombineOutTradeNumber`
- 合单关闭订单:`CloseCombineTransaction`
- 申请退款:`CreateRefundDomesticRefund`
- 查询单个退款:`GetRefundDomesticRefundByOutRefundNumber`
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 下载账单:`DownloadBillFile`
- 经营能力
- 支付即服务
- 服务人员注册:`CreateSmartGuide`
- 服务人员分配:`AssignSmartGuide`
- 服务人员查询:`QuerySmartGuides`
- 服务人员信息更新:`UpdateSmartGuide`
- 点金计划
- 点金计划管理:`ChangeGoldPlanStatus`
- 商家小票管理:`ChangeGoldPlanCustomPageStatus`
- 同业过滤标签管理:`SetGoldPlanAdvertisingIndustryFilter`
- 开通广告展示:`OpenGoldPlanAdvertisingShow`
- 关闭广告展示:`CloseGoldPlanAdvertisingShow`
- 行业方案
- 电商收付通(商户进件)
- 二级商户进件:`CreateEcommerceApplyment`
- 查询申请状态:`GetEcommerceApplymentByApplymentId` / `GetEcommerceApplymentByOutRequestNumber`
- 下载平台证书:`QueryCertificates`
- 修改结算帐号:`ModifyApplyForSubMerchantSettlement`
- 查询结算账户:`GetApplyForSubMerchantSettlement`
- 电商收付通(普通支付)
- APP 下单:`CreatePayPartnerTransactionApp`
- JSAPI 下单:`CreatePayPartnerTransactionJsapi`
- 小程序下单:`CreatePayPartnerTransactionJsapi`
- H5 下单:`CreatePayPartnerTransactionH5`
- H5 下单:`CreatePayPartnerTransactionH5`
- 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber`
- 关闭订单:`ClosePayPartnerTransaction`
- 电商收付通(合单支付)
- 合单 APP 下单:`CreateCombineTransactionApp`
- 合单 H5 下单:`CreateCombineTransactionH5`
- 合单 JSAPI 下单:`CreateCombineTransactionJsapi`
- 合单小程序下单:`CreateCombineTransactionJsapi`
- 合单 Native 下单:`CreateCombineTransactionNative`
- 合单查询订单:`GetCombineTransactionByCombineOutTradeNumber`
- 合单关闭订单:`CloseCombineTransaction`
- 电商收付通(分账)
- 请求分账:`CreateEcommerceProfitSharingOrder`
- 查询分账结果:`GetEcommerceProfitSharingOrderByOutOrderNumber`
- 请求分账回退:`CreateEcommerceProfitSharingReturnOrder`
- 查询分账回退结果:`GetEcommerceProfitSharingReturnOrderByOrderId` / `GetEcommerceProfitSharingReturnOrderByOutOrderNumber`
- 完结分账:`SetEcommerceProfitSharingOrderFinish`
- 查询订单剩余待分金额:`GetEcommerceProfitSharingOrderAmounts`
- 添加分账接收方:`AddEcommerceProfitSharingReceiver`
- 删除分账接收方:`DeleteEcommerceProfitSharingReceiver`
- 电商收付通(补差)
- 请求补差:`CreateEcommerceSubsidy`
- 请求补差回退:`CreateEcommerceSubsidyReturn`
- 取消补差:`CancelEcommerceSubsidy`
- 电商收付通(退款)
- 申请退款:`CreateEcommerceRefund`
- 查询退款:`GetEcommerceRefundByRefundId` / `GetEcommerceRefundByOutRefundNumber`
- 垫付退款回补:`CreateEcommerceRefundReturnAdvance`
- 查询垫付回补结果:`GetEcommerceRefundReturnAdvance`
- 电商收付通(余额查询)
- 查询二级商户账户实时余额:`GetEcommerceFundBalance`
- 查询二级商户账户日终余额:`GetEcommerceFundDayendBalance`
- 查询电商平台账户实时余额:`GetMerchantFundBalance`
- 查询电商平台账户日终余额:`GetMerchantFundDayendBalance`
- 电商收付通(商户提现)
- 二级商户余额提现:`CreateEcommerceFundWithdraw`
- 二级商户查询提现状态:`GetEcommerceFundWithdrawByWithdrawId` / `GetEcommerceFundWithdrawByOutRequestNumber`
- 电商平台提现:`CreateMerchantFundWithdraw`
- 电商平台查询提现状态:`GetMerchantFundWithdrawByWithdrawId` / `GetMerchantFundWithdrawByOutRequestNumber`
- 按日下载提现异常文件:`GetMerchantFundWithdrawBill`
- 电商收付通(下载账单)
- 申请交易账单:`GetBillTradeBill`
- 申请资金账单:`GetBillFundflowBill`
- 申请二级商户资金账单:`GetEcommerceBillFundflowBill`
- 下载账单:`DownloadBillFile`
- 智慧商圈
- 商圈积分同步:`NotifyBusinessCirclePoints`
- 商圈积分授权查询:`GetBusinessCircleUserAuthorizationByOpenId`
- 营销工具
- 代金券
- 创建代金券批次:`CreateMarketingFavorStock`
- 激活代金券批次:`StartMarketingFavorStock`
- 发放代金券批次:`SendMarketingFavorUserCoupon`
- 暂停代金券批次:`PauseMarketingFavorStock`
- 重启代金券批次:`RestartMarketingFavorStock`
- 条件查询批次列表:`QueryMarketingFavorStocks`
- 查询批次详情:`GetMarketingFavorStockByStockId`
- 查询代金券详情:`GetMarketingFavorUserCouponByCouponId`
- 查询代金券可用商户:`QueryMarketingFavorStockMerchants`
- 查询代金券可用单品:`QueryMarketingFavorStockItems`
- 根据商户号查用户的券:`QueryMarketingFavorUserCoupons`
- 下载批次核销明细:`GetMarketingFavorStockUseFlow`
- 下载批次退款明细:`GetMarketingFavorStockRefundFlow`
- 设置消息通知地址:`UpdateMarketingFavorCallback`
- 商家券
- 创建商家券:`CreateMarketingBusifavorStock`
- 查询商家券详情:`GetMarketingBusifavorStockByStockId`
- 核销用户券:`SetMarketingBusifavorCouponUsed`
- 根据过滤条件查询用户券:`QueryMarketingBusifavorUserCoupons`
- 查询用户单张券详情:`GetMarketingBusifavorUserCouponByCouponCode`
- 上传预存 Code`UploadMarketingBusifavorStockCouponCodes`
- 设置商家券事件通知地址:`UpdateMarketingBusifavorCallback`
- 查询商家券事件通知地址:`GetMarketingBusifavorCallback`
- 关联订单信息:`AssociateMarketingBusifavorCoupon`
- 取消关联订单信息:`DisassociateMarketingBusifavorCoupon`
- 修改批次预算:`UpdateMarketingBusifavorStockBudget`
- 修改商家券基本信息:`UpdateMarketingBusifavorStock`
- 申请退券:`CreateMarketingBusifavorCouponReturn`
- 使券失效:`DeactivateMarketingBusifavorCoupon`
- 营销补差付款:`CreateMarketingBusifavorSubsidyPayReceipt`
- 营销补差回退:`CreateMarketingBusifavorSubsidyReturnReceipt`
- 查询营销补差付款单详情:`GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptId`
- 委托营销
- 建立合作关系:`BuildMarketingPartnership`
- 终止合作关系:`TerminateMarketingPartnership`
- 查询合作关系列表:`QueryMarketingPartnerships`
- 支付有礼
- 创建全场满额送活动:`CreateMarketingPayGiftActivityUniqueThresholdActivity`
- 查询活动详情接口:`GetMarketingPayGiftActivityByActivityId`
- 查询活动发券商户号:`QueryMarketingPayGiftActivityMerchants`
- 查询活动指定商品列表:`QueryMarketingPayGiftActivityGoods`
- 终止活动:`TerminateMarketingPayGiftActivity`
- 新增活动发券商户号:`AddMarketingPayGiftActivityMerchant`
- 获取支付有礼活动列表:`QueryMarketingPayGiftActivities`
- 删除活动发券商户号:`DeleteMarketingPayGiftActivityMerchant`
- 图片上传(营销专用):`UploadMarketingMediaImage`
- 资金应用
- 连锁品牌分账
- 请求分账:`CreateBrandProfitSharingOrder`
- 查询分账结果:`GetBrandProfitSharingOrderByOutOrderNumber`
- 请求分账回退:`CreateBrandProfitSharingReturnOrder`
- 查询分账回退结果:`GetBrandProfitSharingReturnOrderByOrderId` / `GetBrandProfitSharingReturnOrderByOutOrderNumber`
- 完结分账:`SetBrandProfitSharingOrderFinish`
- 查询订单剩余待分金额:`GetBrandProfitSharingOrderAmounts`
- 查询最大分账比例:`GetBrandProfitBrandConfigs`
- 添加分账接收方:`AddBrandProfitSharingReceiver`
- 删除分账接收方:`DeleteBrandProfitSharingReceiver`
- 风险合规
- 消费者开户意愿确认
- 提交申请单:`CreateApplyForSubjectApplyment`
- 撤销申请单:`CancelApplyForSubjectApplymentByApplymentId` / `CancelApplyForSubjectApplymentByBusinessCode`
- 查询申请单审核结果:`GetApplyForSubjectApplymentByApplymentId` / `GetApplyForSubjectApplymentByBusinessCode`
- 获取商户开户意愿确认状态:`GetApplyForSubjectApplymentMerchantState`
- 消费者投诉 2.0
- 查询投诉单列表:`QueryMerchantServiceComplaints`
- 查询投诉单详情:`GetMerchantServiceComplaintByComplaintId`
- 查询投诉协商历史:`QueryMerchantServiceComplaintNegotiationHistories`
- 创建投诉通知回调地址:`CreateMerchantServiceComplaintNotification`
- 查询投诉通知回调地址:`GetMerchantServiceComplaintNotification`
- 更新投诉通知回调地址:`UpdateMerchantServiceComplaintNotification`
- 删除投诉通知回调地址:`DeleteMerchantServiceComplaintNotification`
- 提交回复:`CreateMerchantServiceComplaintResponse`
- 反馈处理完成:`SetMerchantServiceComplaintComplete`
- 商户上传反馈图片:`UploadMerchantServiceImage`
- 其他能力
- 图片上传:`UploadMerchantMediaImage`
- 视频上传:`UploadMerchantMediaVideo`
</details>

View File

@@ -0,0 +1,35 @@
### 如何生成客户端调起支付时所需的参数及签名?
---
> 请先自行阅读:
>
> [《微信支付开发者文档 - 基础支付JSAPI 调起支付 API》](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml)
>
> [《微信支付开发者文档 - 基础支付APP 调起支付 API》](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml)
>
> [《微信支付开发者文档 - 基础支付:小程序调起支付 API》](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml)
你可根据官方文档的规则利用本库提供的 `RsaUtil` 工具类自行进行签名生成。
此外,本库还封装了直接生成参数及签名的扩展方法,下面给出一个示例:
```csharp
var request = new Models.CreatePayTransactionJsapiRequest()
{
OutTradeNumber = "商户订单号",
AppId = "公众号 AppId",
Description = "描述",
NotifyUrl = "回调地址",
Amount = new Models.CreatePayTransactionJsapiRequest.Types.Amount()
{
Total = 0
},
Payer = new Models.CreatePayTransactionJsapiRequest.Types.Payer()
{
OpenId = "用户 OpenId"
}
};
var response = await client.ExecuteQueryCertificatesAsync(request);
var paramMap = client.GenerateParametersForJsapiPayRequest(request.AppId, response.PrepayId);
```

View File

@@ -0,0 +1,28 @@
### 如何解密响应中的敏感数据?
---
> 请先自行阅读:
>
> [《微信支付开发者文档 - 证书/密钥/签名介绍API v3 密钥》](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay3_2.shtml)
>
> [《微信支付开发者文档 - 开发指南:敏感信息加解密》](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_3.shtml)
对于部分接口返回的敏感信息,微信支付平台可能会使用两种方式进行加密:
- 使用商户公钥基于 RSA 算法加密。
- 使用商户 API v3 密钥基于 AES-GCM 算法加密。
开发者利用本库提供的 `RsaUtil``AesUtil` 工具类自行解密相关字段。
此外,本库还封装了直接解密响应的扩展方法,下面给出一个示例:
```csharp
var request = new Models.QueryCertificatesRequest();
var response = await client.ExecuteQueryCertificatesAsync(request);
string cert = response.CertificateList.First().EncryptCertificate.CipherText; // 此时仍是密文
client.DecryptResponseEncryptedData(response);
string cert = response.CertificateList.First().EncryptCertificate.CipherText; // 此时已是明文
```

View File

@@ -0,0 +1,25 @@
### 如何验证微信响应签名?
---
> 请先自行阅读:
>
> [《微信支付开发者文档 - 开发指南:签名验证》](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml)
>
> [《微信支付开发者文档 - 平台证书:更新指引》](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay5_0.shtml)
本库已经封装了 `QueryCertificatesAsync()` 方法,供开发者获取微信支付平台证书。
每个响应对象均包含 `WechatpayTimestamp``WechatpayNonce``WechatpaySignature``WechatpaySerial` 等几个公共字段,你可根据官方文档的规则利用本库提供的 `RsaUtil` 工具类自行进行签名验证。
同时,本库也内置了验证签名的的方法,具体用法可以参考项目目录下的 _test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayResponseVerificationTests.cs_ 文件给出的测试用例。
需要注意的是,微信支付平台提供的是 PEM 格式的密钥文件,分为以下几种:
-`-----BEGIN PRIVATE KEY-----` 开头、 `-----END PRIVATE KEY-----` 结尾的是 **PKCS#8 私钥**文件。
-`-----BEGIN PUBLIC KEY-----` 开头、 `-----END PUBLIC KEY-----` 结尾的是 **PKCS#8 公钥**文件。
-`-----BEGIN CERTIFICATE-----` 开头、 `-----END CERTIFICATE-----` 结尾的是 **CER 证书**文件。
`QueryCertificatesAsync()` 方法返回的结果是 CER 证书,验证签名时需要先通过 `RsaUtil` 工具类导出 PKCS#8 公钥,再进行签名验证;当然,`RsaUtil` 也封装了直接通过 CER 证书验证签名的方法。

View File

@@ -0,0 +1,168 @@
# SKIT.FlurlHttpClient.Wechat.TenpayV3
[![NuGet Version](https://img.shields.io/nuget/v/SKIT.FlurlHttpClient.Wechat.TenpayV3.svg?sanitize=true)](https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3)
[![NuGet Download](https://img.shields.io/nuget/dt/SKIT.FlurlHttpClient.Wechat.TenpayV3.svg?sanitize=true)](https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3)
[![GitHub License](https://img.shields.io/github/license/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat)](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat/blob/main/LICENSE)
基于 `Flurl.Http` 的微信支付 API v3 版客户端。
---
## 功能:
- 基于微信支付 v3 版 API 封装。
- 支持直连商户、服务商两种模式。
- 请求时自动生成签名,无需开发者手动干预。
- 提供了微信支付所需的 RSA、AES-GCM、SHA-256 等算法工具类。
- 提供了调起支付签名、解析响应敏感数据、解析回调通知事件敏感数据等扩展方法。
- 完整微信支付 API 一览:
| | 微信 API | 商户类型 | 备注 |
| :-: | :-----------------------------: | :--------------------------: | :---------------: |
| √ | 商户进件:特约商户进件 | 服务商 | |
| √ | 基础支付JSAPI 支付 | 直连商户 & 服务商 | |
| √ | 基础支付APP 支付 | 直连商户 & 服务商 | |
| √ | 基础支付H5 支付 | 直连商户 & 服务商 | |
| √ | 基础支付Native 支付 | 直连商户 & 服务商 | |
| √ | 基础支付:小程序支付 | 直连商户 & 服务商 | |
| √ | 基础支付:合单支付 | 直连商户 & 服务商 | |
| × | <del>基础支付:付款码支付</del> | <del>直连商户 & 服务商</del> | 微信未提供 v3 API |
| √ | 经营能力:微信支付分 | 直连商户 | |
| √ | 经营能力:微信先享卡 | 直连商户 | |
| √ | 经营能力:支付即服务 | 直连商户 & 服务商 | |
| √ | 经营能力:点金计划 | 服务商 | |
| √ | 行业方案:电商收付通 | 服务商 | |
| √ | 行业方案:智慧商圈 | 直连商户 & 服务商 | |
| √ | 营销工具:代金券 | 直连商户 & 服务商 | |
| √ | 营销工具:商家券 | 直连商户 & 服务商 | |
| √ | 营销工具:委托营销 | 直连商户 & 服务商 | |
| √ | 营销工具:消费卡 | 直连商户 & 服务商 | |
| √ | 营销工具:支付有礼 | 直连商户 & 服务商 | |
| √ | 营销工具:图片上传(营销专用) | 直连商户 & 服务商 | |
| × | <del>营销工具:现金红包</del> | <del>直连商户 & 服务商</del> | 微信未提供 v3 API |
| × | <del>资金应用:企业付款</del> | <del>直连商户</del> | 微信未提供 v3 API |
| × | <del>资金应用:分账</del> | <del>直连商户</del> | 微信未提供 v3 API |
| √ | 资金应用:连锁品牌分账 | 服务商 | |
| × | <del>资金应用:服务商分账</del> | <del>服务商</del> | 微信未提供 v3 API |
| √ | 风险合规:商户开户意愿确认 | 服务商 | |
| √ | 风险合规:消费者投诉 2.0 | 直连商户 & 服务商 | |
| × | <del>其他能力:清关上报</del> | <del>直连商户</del> | 微信未提供 v3 API |
| √ | 其他能力:图片上传 | 直连商户 & 服务商 | |
| √ | 其他能力:视频上传 | 直连商户 & 服务商 | |
---
## 基础用法:
### 安装:
```shell
# 通过 NuGet 安装
> Install-Package SKIT.FlurlHttpClient.Wechat.TenpayV3
# 通过 dotnet-tools 安装
> dotnet add package SKIT.FlurlHttpClient.Wechat.TenpayV3
```
### 初始化:
```csharp
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);
```
### 请求 & 响应:
```csharp
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);
```
---
## 高级技巧
- [如何查看商户证书序列号?](./Advanced_MerchantCertSerialNumber.md)
- [如何验证微信响应签名?](./Advanced_ResponseSignatureVerification.md)
- [如何快速找到需要调用的 API 模型类名 / 方法名?](./Advanced_ModelDefinition.md)
- [如何在 ASP.NET Core 中与 `IHttpClientFactory` 集成?](./Advanced_IHttpClientFactory.md)
- [如何指定 JSON 序列化器?](./Advanced_JsonSerializer.md)
- [如何解密响应中的敏感数据?](./Advanced_ResponseDataDecryption.md)
- [如何解密回调通知事件中的敏感数据?](./Advanced_CallbackDataDecryption.md)
- [如何生成客户端调起支付时所需的参数及签名?](./Advanced_Payment.md)
---
## 常见问题
### 1. 为什么要“造轮子”?
目前网络上还没有基于微信支付 v3 版 API 封装的 .NET 客户端,遑论开源了;这都 2021 年了,官方本身提供的示例代码还只能运行在 .NET Framework on Windows 上;就连 RSA 签名这么基础的东西都没有人封装(确切的说是因为 RSA 有很多种分块模式和填充模式,网上能找到的往往只封装了其中一种,但却未必符合微信支付的要求)。
于是萌生了自己封装一个库的想法,打算解决这几个痛点,同时也是推广一下微软官方的 `System.Text.Json`
### 2. 本库与[盛派微信 SDKSenparc.Weixin](https://github.com/JeffreySu/WeiXinMPSDK)有什么区别?
- 本库只支持微信支付 v3 版 API盛派微信 SDK 只支持微信支付 v2 版 API年前作者开了新坑似乎是想提供 v3 版支持,不过目前只封装了部分接口,进展比较缓慢)。原则上官方已经停止更新 v2 版 API现在接口只做日常维护所以有条件的话还是应该尽快升级。
- 本库封装了目前微信支付官方提供的所有 API包括直连商户和服务商两种模式盛派微信 SDK 只提供了常用的 API只完整支持直连商户模式、部分支持服务商模式。
- 本库的接口模型遵循的是微软官方推荐的 C# 属性命名方式(大驼峰命名法);盛派微信 SDK 提供的是微信支付接口本身的命名方式(蛇形命名法和小驼峰命名法混杂)。
- 本库专注于 API 本身的封装;盛派微信 SDK 提供了大而全的功能,与 ASP.NET / ASP.NET Core 深度集成。
### 3. 为什么不支持企业付款、现金红包等功能?
请注意前文所描述的微信支付 API 一览表,有部分功能并非封装遗漏,而是官方尚未提供支持。
如果你确实需要这部分功能,可以考虑使用上面提到过的[盛派微信 SDKSenparc.Weixin](https://github.com/JeffreySu/WeiXinMPSDK),也很不错。
当官方更新相关的 API 后,本库也会在第一时间保持跟进。
### 4. 看了源码,发现模型定义里很多同样的代码是复制粘贴的,为什么不继承?
关于这点得吐槽微信支付提供的 API 了,很显然微信内部也是很多个 Team 在共同开发,每个 Team、甚至每个人的字段命名风格、约束条件、接口规则都大相径庭虽然号称 v3 版 API 是 “RESTful” 的,却没一个统一标准。
举个例子,以分页查询为例,看似字段相同,都由 `offset``limit` + `total_count``data` 这几个字段构成,但某些接口的 `offset``limit` 字段是可选参数,某些却是必填项;某些值从 `0` 起始,某些却是从 `1` 起始;某些接口的 `total_count``data` 字段一定会返回,某些却是一定不返回,某些只在特定条件下返回。一共七八个分页查询的接口,却有四五种分页的数据结构,这种情况下很难抽象出一个公共的基类出来。
同样一个东西在不同接口里竟然拼法不一样;同样是表示数组有的是 JSON、有的却是字符串诸如此类“奇葩”的情况很多很多。本库已经尽可能在条件允许的范围内抽象出了一些公共基类聊胜于无。