智能摘要 AI
本文介绍了如何使用社区封装的微信支付 .Net SDK(SKIT.FlurlHttpClient.Wechat.TenpayV3)实现退款和退款状态查询功能。首先需引入 SDK 并配置必要的商户信息,然后通过创建客户端对象调用相关接口。文中提供了退款和退款状态查询的代码示例,并解释了接口的 Request 和 Response 模型对应逻辑。
前言
相比支付宝,微信支付对 .Net 的支持没有那么全面,官方也没有提供 SDK。不过,好消息是,社区里有大佬封装了 v3 版 .Net SDK,方便我们使用。
SDK 名称是:SKIT.FlurlHttpClient.Wechat.TenpayV3,支持 .NET Core 和 .NET Framework,封装了所有 v3 API。
本文将基于这个 SDK,介绍退款和退款状态查询两个接口的实现。
接入准备
1.1 引入 SDK
我们需要引入的 SDK 名称是:SKIT.FlurlHttpClient.Wechat.TenpayV3,它支持 .Net Standard 2.0、.Net Framework 4.6.2-4.7.1、.Net 6.0 等版本。
NuGet 简介地址:https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3
1.2 必要的账户信息
在进行接口调用前,我们需要以下账户信息:
| 名称 | 示例 | 简介 |
|---|---|---|
| 商户号 | 110… | 10 位,数字 |
| 商户 API 证书序列号 | D566D2… | 40 位,大写字母、数字组合 |
| 商户 API v3 密钥 | gSk0EA… | 32 位,数字、大写字母、小写字母组合 |
| 商户 API 证书私钥 | —–BEGIN PRIVATE KEY—–\r\nMIIEv… | 通常为 apiclient_key.pem 文件内容 |
微信支付的商户类型有两种:普通商户和服务商。普通商户的资金直接与微信结算,而服务商的资金需要经过微信冻结和分账过程。
接口调用
2.1 创建客户端对象
首先,根据账户信息创建共用的客户端对象 client:
var manager = new InMemoryCertificateManager();
var options = new WechatTenpayClientOptions()
{
MerchantId = "商户号",
MerchantV3Secret = "商户 API v3 密钥",
MerchantCertificateSerialNumber = "商户 API 证书序列号",
MerchantCertificatePrivateKey = "-----BEGIN PRIVATE KEY-----\r\nMIIEv...Q71AG\r\n-----END PRIVATE KEY-----",
PlatformCertificateManager = manager
};
var client = new WechatTenpayClient(options);2.2 退款接口
下面是退款接口的代码示例:
var request = new CreateRefundDomesticRefundRequest()
{
TransactionId = "微信订单号",
OutRefundNumber = $"WX{DateTime.Now:yyyyMMddHHmmssffffff}",
Reason = "测试退款080611",
Amount = new CreateRefundDomesticRefundRequest.Types.Amount()
{
Total = 100,
Refund = 99,
Currency = "CNY"
}
};
var response = await client.ExecuteCreateRefundDomesticRefundAsync(request);
if (response.IsSuccessful())
{
Console.WriteLine("RefundId:", response.RefundId);
Console.WriteLine("OutRefundNumber:", response.OutRefundNumber);
Console.WriteLine("TransactionId:", response.TransactionId);
Console.WriteLine("OutRefundNumber:", response.OutTradeNumber);
}
else
{
Console.WriteLine("HTTP 状态:" + response.GetRawStatus());
Console.WriteLine("错误代码:" + response.ErrorCode);
Console.WriteLine("错误描述:" + response.ErrorMessage);
}2.3 退款状态查询接口
接下来是退款状态查询接口的代码示例:
var request = new GetRefundDomesticRefundByOutRefundNumberRequest()<br>{<br> OutRefundNumber = "WX20240806104450972506"<br>};<br>var response = await client.ExecuteGetRefundDomesticRefundByOutRefundNumberAsync(request);<br>if (response.IsSuccessful())<br>{<br> Console.WriteLine("RefundId:", response.RefundId);<br> Console.WriteLine("OutRefundNumber:", response.OutRefundNumber);<br> Console.WriteLine("OutRefundNumber:", response.TransactionId);<br> Console.WriteLine("OutRefundNumber:", response.OutTradeNumber);<br>}<br>else<br>{<br> Console.WriteLine("HTTP 状态:" + response.GetRawStatus());<br> Console.WriteLine("错误代码:" + response.ErrorCode);<br> Console.WriteLine("错误描述:" + response.ErrorMessage);<br>}2.4 接口的 Request、Response 模型的对应逻辑
以下是使用到的两个接口信息:
| 接口名称 | 接口地址 | Request | Response |
|---|---|---|---|
| 退款 | 【POST】/v3/refund/domestic/refunds | CreateRefundDomesticRefundRequest | CreateRefundDomesticRefundResponse |
| 退款状态查询 | 【GET】/v3/refund/domestic/refunds/{out_refund_no} | GetRefundDomesticRefundByOutRefundNumberRequest | GetRefundDomesticRefundByOutRefundNumberResponse |
从上表可以看出,对应的模型实际上就是以接口地址为基础的,其他接口也可以按照这个逻辑去一一对应。





评论 (0)