前言
相較于支付寶,微信支付對 .Net 的支持就沒那么充分,官方?jīng)]有提供 SDK。
但值得慶幸的是,在社區(qū)有大佬封裝了 v3 版 .Net SDK。
原文鏈接:https://developers.weixin.qq.com/community/develop/article/doc/00020aadc384a0a5f01c3526b56813。
SDK 名稱:SKIT.FlurlHttpClient.Wechat.TenpayV3,支持 .NET Core / Framework,完整封裝全部 v3 API。
本文也將以此 SDK 來應(yīng)用,主要介紹退款和退款狀態(tài)查詢兩個接口。
一、接入準(zhǔn)備
1.1 引入 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。
簡介:基于 Flurl.Http 的微信支付 API v3 版客戶端,支持商戶(直連)、合作伙伴(服務(wù)商、渠道商、機(jī)構(gòu)、銀行)模式,支持基礎(chǔ)支付、代金券、商家券、委托營銷、消費(fèi)卡、支付有禮、銀行定向促活、微信支付分、微信先享卡、支付即服務(wù)、點(diǎn)金計劃、智慧商圈、電商收付通、平臺收付通、二級商戶進(jìn)件、小微商戶進(jìn)件、消費(fèi)者投訴、商戶風(fēng)控管理、商戶違規(guī)通知、批量轉(zhuǎn)賬到零錢、銀行組件、海關(guān)報關(guān)、融合錢包、微工卡、電子發(fā)票、電子小票、車主平臺、教育續(xù)費(fèi)通、校園輕松付等功能。
1.2 必要的賬戶信息
關(guān)于微信的服務(wù)商和普通商戶:
普通商戶
資金由微信直接與商戶結(jié)算,不涉及資金凍結(jié)和分賬;
可獨(dú)立申請,可自行通過接口進(jìn)行支付、退款等操作;
適合大型企業(yè)或品牌商戶,有自己技術(shù)團(tuán)隊和支付系統(tǒng)。
服務(wù)商
資金會先被微信凍結(jié),服務(wù)商發(fā)起分賬后微信才進(jìn)行分賬;
可免費(fèi)申請不限個數(shù)的子商戶,但服務(wù)商的商戶號需要每年支付認(rèn)證費(fèi)用;
自身不能直接收款,需通過申請的“特約商戶”才能收款;
“特約商戶”可以像普通商戶一樣收款,但退款接口必須由服務(wù)商發(fā)起;
適合于提供支付解決方案給多個特約商戶的第三方機(jī)構(gòu),特別是那些需要處理多商戶分賬或收取服務(wù)費(fèi)的復(fù)雜場景。
特別注意:特約商戶,也就是服務(wù)商下邊的子商戶,是沒有權(quán)限直接調(diào)用退款接口的,只能根據(jù)服務(wù)商的賬戶信息加上子商戶號來。
二、接口調(diào)用
2.1 根據(jù)賬戶信息創(chuàng)建共用客戶端對象
var manager = new InMemoryCertificateManager();
var options = new WechatTenpayClientOptions()
{
MerchantId = "商戶號", // 商戶號
MerchantV3Secret = "商戶 API v3 密鑰", // 商戶 API v3 密鑰
MerchantCertificateSerialNumber = "商戶 API 證書序列號", // 商戶 API 證書序列號
MerchantCertificatePrivateKey = "-----BEGIN PRIVATE KEY-----\r\nMIIEv ... ... Q71AG\r\n-----END PRIVATE KEY-----", // 商戶 API 證書私鑰
PlatformCertificateManager = manager
};
var client = new WechatTenpayClient(options);
2.2 退款接口
以下是退款接口的代碼,其中入?yún)H示例了必要的字段,其他詳情見官方文檔。
官方文檔:https://pay.weixin.qq.com/docs/merchant/apis/refund/refunds/create.html
var request = new CreateRefundDomesticRefundRequest()
{
//OutTradeNumber = "商戶訂單號", // 【商戶訂單號】 原支付交易對應(yīng)的商戶訂單號,與transaction_id二選一
TransactionId = "微信訂單號", // 【微信支付訂單號】 原支付交易對應(yīng)的微信訂單號,與out_trade_no二選一
// 商戶自定義退款唯一標(biāo)識,要做好記錄,退款狀態(tài)查詢時入?yún)⒈靥?/p>
OutRefundNumber = $"WX{DateTime.Now.ToString("yyyyMMddHHmmssffffff")}",
Reason = "測試退款080611",
//NotifyUrl = "https://...", // 回調(diào)地址
Amount = new CreateRefundDomesticRefundRequest.Types.Amount()
{
Total = 100, // 單位:分
Refund = 99, // 單位:分
Currency = "CNY" // 【退款幣種】 目前只支持人民幣:CNY。
},
};
//string json = Json_Object.ObjectToJsonstr(request);
var response = await client.ExecuteCreateRefundDomesticRefundAsync(request);
if (response.IsSuccessful())
{
Console.WriteLine("RefundId:", response.RefundId); // 【微信支付退款號】 微信支付退款號
Console.WriteLine("OutRefundNumber:", response.OutRefundNumber); // 【商戶退款單號】 商戶系統(tǒng)內(nèi)部的退款單號,商戶系統(tǒng)內(nèi)部唯一
Console.WriteLine("TransactionId:", response.TransactionId); // 【微信支付訂單號】
Console.WriteLine("OutRefundNumber:", response.OutTradeNumber); // 【商戶訂單號】 原支付交易對應(yīng)的商戶訂單號
}
else
{
Console.WriteLine("HTTP 狀態(tài):" + response.GetRawStatus());
Console.WriteLine("錯誤代碼:" + response.ErrorCode);
Console.WriteLine("錯誤描述:" + response.ErrorMessage);
}
2.3 退款狀態(tài)查詢接口
以下是退款狀態(tài)查詢接口的代碼,入?yún)嶋H上就只有一個:商戶退款單號。文檔中是要求直接跟在接口請求路徑之后,SDK 中是封裝到 Request 模型中。
官方文檔:https://pay.weixin.qq.com/docs/merchant/apis/refund/refunds/query-by-out-refund-no.html
var request = new GetRefundDomesticRefundByOutRefundNumberRequest()
{
OutRefundNumber = "WX20240806104450972506",
};
//string json = Json_Object.ObjectToJsonstr(request);
var response = await client.ExecuteGetRefundDomesticRefundByOutRefundNumberAsync(request);
if (response.IsSuccessful())
{
Console.WriteLine("RefundId:", response.RefundId); // 【微信支付退款號】 微信支付退款號
Console.WriteLine("OutRefundNumber:", response.OutRefundNumber); // 【商戶退款單號】 商戶系統(tǒng)內(nèi)部的退款單號,商戶系統(tǒng)內(nèi)部唯一
Console.WriteLine("OutRefundNumber:", response.TransactionId); // 【微信支付訂單號】
Console.WriteLine("OutRefundNumber:", response.OutTradeNumber); // 【商戶訂單號】 原支付交易對應(yīng)的商戶訂單號
}
else
{
Console.WriteLine("HTTP 狀態(tài):" + response.GetRawStatus());
Console.WriteLine("錯誤代碼:" + response.ErrorCode);
Console.WriteLine("錯誤描述:" + response.ErrorMessage);
}
2.4 接口的 Request、Response 模型的對應(yīng)邏輯
下面列一下以上使用到的兩個接口信息:
由上表對照可以看出,對應(yīng)的模型實際上就是以接口地址為基礎(chǔ)的,其他接口就可以按照這個邏輯去一一對應(yīng)。
轉(zhuǎn)載本文請注明原文鏈接:https://www.cnblogs.com/hnzhengfy/p/18339226/Wecha_refunds
該文章在 2024/8/8 8:56:32 編輯過