微信支付退款和退款结果查询接口简单实现(.Net 7.0)

〇、前言

相较于支付宝,微信支付对 .Net 的支持就没那么充分,官方没有提供 SDK。

但值得庆幸的是,在社区有大佬封装了 v3 版 .Net SDK。

原文链接:https://developers.weixin.qq.com/community/develop/article/doc/00020aadc384a0a5f01c3526b56813

SDK 名称:SKIT.FlurlHttpClient.Wechat.TenpayV3,支持 .NET Core / Framework,完整封装全部 v3 API。

本文也将以此 SDK 来应用,主要介绍退款和退款状态查询两个接口。

一、接入准备

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 版客户端,支持商户(直连)、合作伙伴(服务商、渠道商、机构、银行)模式,支持基础支付、代金券、商家券、委托营销、消费卡、支付有礼、银行定向促活、微信支付分、微信先享卡、支付即服务、点金计划、智慧商圈、电商收付通、平台收付通、二级商户进件、小微商户进件、消费者投诉、商户风控管理、商户违规通知、批量转账到零钱、银行组件、海关报关、融合钱包、微工卡、电子发票、电子小票、车主平台、教育续费通、校园轻松付等功能。

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 密钥", // 商户 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 退款接口

以下是退款接口的代码,其中入参仅示例了必要的字段,其他详情见官方文档。

官方文档:https://pay.weixin.qq.com/docs/merchant/apis/refund/refunds/create.html

var request = new CreateRefundDomesticRefundRequest()
{//OutTradeNumber = "商户订单号", // 【商户订单号】 原支付交易对应的商户订单号,与transaction_id二选一TransactionId = "微信订单号", // 【微信支付订单号】 原支付交易对应的微信订单号,与out_trade_no二选一// 商户自定义退款唯一标识,要做好记录,退款状态查询时入参必填OutRefundNumber = $"WX{DateTime.Now.ToString("yyyyMMddHHmmssffffff")}", Reason = "测试退款080611",//NotifyUrl = "https://...", // 回调地址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); // 【商户退款单号】 商户系统内部的退款单号,商户系统内部唯一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 退款状态查询接口

以下是退款状态查询接口的代码,入参实际上就只有一个:商户退款单号。文档中是要求直接跟在接口请求路径之后,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); // 【商户退款单号】 商户系统内部的退款单号,商户系统内部唯一Console.WriteLine("OutRefundNumber:", response.TransactionId); // 【微信支付订单号】Console.WriteLine("OutRefundNumber:", response.OutTradeNumber); // 【商户订单号】 原支付交易对应的商户订单号
}
else
{Console.WriteLine("HTTP 状态:" + response.GetRawStatus());Console.WriteLine("错误代码:" + response.ErrorCode);Console.WriteLine("错误描述:" + response.ErrorMessage);
}

2.4 接口的 Request、Response 模型的对应逻辑

下面列一下以上使用到的两个接口信息:

接口名称 接口地址 Request Response 
退款 【POST】/v3/refund/domestic/refunds CreateRefundDomesticRefundRequest CreateRefundDomesticRefundResponse
退款状态查询 【GET】/v3/refund/domestic/refunds/{out_refund_no} GetRefundDomesticRefundByOutRefundNumberRequest GetRefundDomesticRefundByOutRefundNumberResponse

由上表对照可以看出,对应的模型实际上就是以接口地址为基础的,其他接口就可以按照这个逻辑去一一对应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/778688.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手教你使用Python网络爬虫下载一本小说(附源码)

大家好,我是Python进阶者。 前言 前几天【磐奚鸟】大佬在群里分享了一个抓取小说的代码,感觉还是蛮不错的,这里分享给大家学习。一、小说下载 如果你想下载该网站上的任意一本小说的话,直接点击链接进去,如下图所示。只要将URL中的这个数字拿到就可以了,比方说这里是951,…

web渗透—文件上传

文件上传 一、原理 1、通过文件长传模块上传一句话木马;然后用蚁剑或者cknife连接 //一句话木马 <?php @eval($_POST[cmd]);?>二、过滤和绕过 1、前端验证 原理:使用js代码对文件的类型进行限制 绕过: (1)禁用Js脚本 方法1:将网站源码复制带.htm文档中;删除js代…

Living-Dream 系列笔记 第75期

CF126B 朴素解法:求出原字符串的最长 border,并 kmp 匹配出出现在中间的最长 border,若没有则不断缩短 border 的长度,直到中间存在。若 border 长度减到了 \(0\),则无解。 我们通过画图来探索优化方式。如图,蓝色部分为原串的最长 border,红色部分为蓝色部分的最长 bor…

Salesforce常见的100+个业内术语!(系列二)

在上周的文章中,我们开启了Salesforce业内术语的科普和盘点,并介绍了各领域通用的一些术语。前文指路👉Salesforce常见的100+个业内术语!(系列一) 本篇文章将继续与学习者们分享Salesforce Admin和Sales领域的专业术语。 Admin领域的术语 CRED 全称:Create, Read, Edit…

【日记】为啥家族原发性高血压的人还喜欢喝酒啊……(442 字)

正文今天跟人吵了一下午架,因为有一张报表换了新表,所有人都不知道怎么报。上级行一个想法,我一个想法。吵完都发现对方说得有道理,于是决定明天问省分行。难绷。草台班子。鱼儿说他最近喜欢上了喝酒。我们劝他的同时,我想起来前两天和斯逛超市。本来我觉得高兴,也想着拿…

navicat [IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (0)

1.情景展示 使用navicat连接SQL Server数据库,报错信息如下: [IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (0)2.解决方案 方案1 找到Navicat的安装路径,然后找到sqlncli_x64.msi文件并安装,安装成功后重启Navicat重新进行连接,看是否…

python绘制圆柱体

import os import randomimport numpy as np import matplotlib.pyplot as plt #合成管道数据集def plot_cylinder(center, radius, height, num_points=100):# 生成圆柱体的侧面点坐标theta = np.linspace(0, 2*np.pi, num_points)intervalZ = np.floor(height/0.05)indx2 = […

ComfyUI插件:efficiency-nodes-comfyui节点

前言: 学习ComfyUI是一场持久战, efficiency-nodes-comfyui是提高工作流创造效率的工具,包含效率节点整合工作流中的基础功能,比如Efficient Loader节点相当于Load Checkpoint+Clip set layer+Load VAE等等的合集,并且该插件提供了更加简便快捷的X/Y对比图,能够使测评工作…

6 大推荐给开发者的无代码工具

通过这篇文章了解——为什么开发者也需要使用无代码?以及 6 个推荐给开发者的最佳无代码开发工具。在不断发展的软件开发领域,无代码工具正迅速普及。 最初,这些工具是为非技术背景的业务用户设计的,而如今,它们对开发者来说也同样不可或缺。 无代码工具结合了效率、灵活性…

Creo 文件小版本:文件后缀出现.1/.2/.3

1.保存文件的小版本:文件保存后不会覆盖原文件,而是产生新的副本文件,且文件名后缀为(**1/***.2/***.3)样式。此功能能够在特殊情况找回先前版本,但会造成文件夹臃肿,可根据自身实际情况和习惯进行设置。设置方法:配置编辑器---save file iterations --- no/yes。

pbootcms网站后台关闭验证码后, 无法登录问题解决方法

最近闲来无事, 在后台将pbootcms的登录验证码关闭了(全局配置 - 配置参数 -安全配置 -后台验证码) 结果问题来了, 第二天登录后台一直提示验证码不能为空。 这不是自己给自己找事吗! 现在想输入验证码,也没有地方输入。 从程序上解决吧 apps\admin\controller\IndexCont…

Spring Boot 中使用 JSON Schema 来校验复杂JSON数据

JSON是我们编写API时候用于数据传递的常用格式,那么你是否知道JSON Schema呢? 在数据交换领域,JSON Schema 以其强大的标准化能力,为定义和规范 JSON 数据的结构与规则提供了有力支持。通过一系列精心设计的关键字,JSON Schema 能够详尽地描述数据的各项属性。然而,仅凭 …