参考文档:

微信支付申请退款API文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_8_11.shtml   (最新更新时间:2022.01.05)

注意:
1、交易时间超过一年的订单无法提交退款 2、微信支付退款支持单笔交易分多次退款(不超50次),多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号 3、错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次 4、每个支付订单的部分退款次数不能超过50次 5、如果同一个用户有多笔退款,建议分不同批次进行退款,避免并发退款导致退款失败 6、申请退款接口的返回仅代表业务的受理情况,具体退款是否成功,需要通过退款查询接口获取结果 7、一个月之前的订单申请退款频率限制为:5000/min 8、同一笔订单多次退款的请求需相隔1分钟

环境

相关工具:VS2019 SQLServer2019

服务器软件:.net core 3.0

面向对象:NetCore初学者(代码只是简单实现退款功能,仅供参考,请勿在生产环境中使用,否则可能造成资金风险

1.申请退款V3

请求URL:https://api.mch.weixin.qq.com/v3/refund/domestic/refunds

请求方式:POST

当交易发生之后一年内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付金额退还给买家,微信支付将在收到退款请求并且验证成功之后,将支付款按原路退还至买家账号上。

        //微信退款
public async Task Refund()
{
//微信退费操作
var url = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds";
int money = 0;
var retParamar = new
{
//transaction_id = "",
out_trade_no = "",
out_refund_no = "",
reason = "客户申请提现,小程序退款",
amount = new
{
refund = money,
total = money,
currency = "CNY"
},
notify_url = "http://api.xxxx.com/api/pay/RefundNotifyUrl" //回调地址
};
var reqJson = JsonConvert.SerializeObject(retParamar);
var httpHandler = new HttpHandler(_mchid, _serialNo);
HttpClient client = new HttpClient(httpHandler);
var bodyJson = new StringContent(reqJson, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, bodyJson);
var respStr = await response.Content.ReadAsStringAsync();
var respResult = JsonConvert.DeserializeObject<dynamic>(respStr);
      
//处理自己业务逻辑
      //TODO...

}

2.退款回调V3

通知规则

商户退款完成后,微信会把相关退款结果和用户信息发送给清算机构,清算机构需要接收处理后返回应答成功,然后继续给异步通知到下游从业机构。

参数解密

下面详细描述对通知数据进行解密的流程:

1、用商户平台上设置的APIv3密钥 【微信商户平台—>账户设置—>API安全—>设置APIv3密钥】 ,记为key;

2、针对resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),取得对应的参数nonce和associated_data;

3、使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到JSON形式的资源对象。

注: AEAD_AES_256_GCM算法的接口细节,请参考rfc5116。微信支付使用的密钥key长度为32个字节,随机串nonce长度12个字节,associated_data长度小于16个字节并可能为空字符串。

        public dynamic RefundNotifyUrl(NotifyDto ret)
{
WxPayAPI.WxPayData res = new WxPayAPI.WxPayData();
res.SetValue("return_code", "FAIL");
res.SetValue("return_msg", "失败");
try
{
if (ret.Event_type == "REFUND.SUCCESS")//成功
{
//解密数据报文
var dataJson = AesGcmHelper.AesGcmDecryptFromBase64(_key, ret.Resource.Nonce, ret.Resource.Ciphertext, ret.Resource.Associated_data);
//转换对象接受
var data = JsonConvert.DeserializeObject<RefundCipherText>(dataJson);
//处理自己逻辑
            //TODO...

res.SetValue("return_code", "SUCCESS");
res.SetValue("return_msg", "成功");
return Content(res.ToXml());
}
else
{
_log.WriteLog("NotifyFaile:" + JsonConvert.SerializeObject(ret));
}
return Content(res.ToXml());
}
catch (Exception ex)
{
_log.WriteLog(ex.ToString());
return Content(res.ToXml());
}
}

/// <summary>
/// 退款resource
/// </summary>
public class RefundCipherText
{
  public string mchid { get; set; }
  public WxRefundAmountModel amount { get; set; }
  public string out_trade_no { get; set; }
  public string transaction_id { get; set; }
  public string refund_id { get; set; }
  public string refund_status { get; set; }
  public string user_received_account { get; set; }
  public string success_time { get; set; }

}

Asp.Net Core3.0 微信退款的更多相关文章

  1. 2019年第一天——使用Visual Studio 2019 Preview创建第一个ASP.Net Core3.0的App

    一.前言: 全文翻译自:https://www.talkingdotnet.com/creating-first-asp-net-core-3-0-app-visual-studio-2019/ Vi ...

  2. asp.net core3.0 mvc 用 autofac

    好久没有写文章了,最近在用.net core3.0,一些开发中问题顺便记录: 1.首先nuget引入 Autofac Autofac.Extensions.DependencyInjection 2. ...

  3. asp.net 5.0微信支付

    (原文出自:http://lib.csdn.net/article/wechat/46329) 微信支付官方坑太多,我们来精简 我把官方的代码,打包成了 an.wxapi.dll. 里面主要替换了下注 ...

  4. Postman 调试请求Asp.Net Core3.0 WebApi几种常见的Get/Post/Put/Delete请求

    这里就直接截图了,如下(很简单的操作): 1:Get几种请求 2:Post 3:Put 4:Delete  最后,虽然简单,代码还是给放一下(这里只是抛砖引玉的作用,自己可以根据自身的业务需要来做进一 ...

  5. ASP.NET Core3.0 中的运行时编译

    运行时编译 通过 Razor 文件的运行时编译补充生成时编译. 当 .cshtml 文件的内容发生更改时,ASP.NET Core MVC 将重新编译 Razor 文件 . 通过 Razor 文件的运 ...

  6. 如何使用Serilog.AspNetCore记录ASP.NET Core3.0的MVC属性

    这是Serilog系列的第三篇文章. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Serilog记录所选的终结点属性 第3部分-使用Serilog.Asp ...

  7. Asp.net Core3.0 跨域配置

    原文:http://www.zilaohu.cn/Jie/Detail_Jie?ID=78840a04-55b8-4988-80b2-f964fd822d63 下面配置后:被拒绝的域请求后,可以进入方 ...

  8. 探索Asp net core3中的 项目文件、Program.cs和通用host(译)

    引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版 ...

  9. Core3.1 微信v3 JSAPI支付 退款

    1.前言 上一篇写了<Core3.1 微信v3 JSAPI支付>,这个属于v3的接口规则,现在研究了下退款的接口我写的时候它属于v2接口规则文档.但凡微信支付文档里面写清楚点我也不会在这里 ...

  10. 在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)

    我们的富文本编辑器不能没有图片上传尤其是截图上传,下面我来教大家怎么实现MarkDown富文本编辑器截图上传和图片上传. 1.配置编辑器到html页 <div id="test-edi ...

随机推荐

  1. 用文字“画出”状态图:用 AI+Mermaid.js 解决对象状态变化的处理问题

    什么是状态图 状态图用于描述对象在其生命周期内的状态变化及其处理,例如业务办理流程.病情处置等. 什么是Mermaid Mermaid.js是一个开源项目,它允许你通过简单的语法来绘制图表. 无论你是 ...

  2. Educational Codeforces Round 65 (Rated for Div

    D - Bicolored RBS 给定一个括号序列,现在你必须对每一个括号涂成蓝色或红色,要求使得涂完后的红色括号和蓝色括号序列都必须是合法的括号序列,设红色括号形成的的括号序列的深度为\(dep_ ...

  3. Javascript 常用封装(二)

    1.字符串占位宽度 计算占位宽度:字符串的占位宽度除了涉及到具体的字符串内容,还与字体大小有关,可以将其放入Dom中来获取实际占位宽度 //计算字符串的占位宽度 function getTextWid ...

  4. arcpy获取polygon内环

    当使用arcpy获取polygon几何的时候,不能像ao一样获取到内外环,只能获取到单个部件.而part返回的即是一个点组了. 所以只能通过None对象进行分割,确定部件内的内外环.一个part内,只 ...

  5. 共建共荣金融生态!金融级数字底座“源启”与GoldenDB数据库完成互认证

    近日,中电金信金融级数字底座"源启"顺利与金篆信科GoldenDB分布式数据库完成互认证.GoldenDB数据库安全稳定运行在"源启"之上,整体性能表现卓越,进 ...

  6. 如何在 Linux 中使用 grep 命令的排除功能

    来自grep 是一种强大的命令行工具,用于在一个或多个输入文件中搜索与正则表达式匹配的行,并将匹配的行标准输出.在本文中介绍如何在使用 grep 搜索时排除一个或多个单词或目录.   排除单词或多个条 ...

  7. Qt数据库应用10-通用数据库设置

    一.前言 做过了众多的项目,只要是用了数据库的项目,基本上还有一个需求就是,提供一个界面用来初始化数据库,相当于恢复出厂设置的数据,一般恢复出厂设置需要复位的是配置文件.数据库文件.布局文件这几种,其 ...

  8. MySql 建表出现的问题 : [ERR] 1064 - You have an error in your SQL syntax; check the manual.......

    使用 MySql 建表出现的问题 在使用 Navicat Premium 运行 sql 语句进行建表时,MySQL 报错如下: 1064 - You have an error in your SQL ...

  9. Web端IM系统:RainbowChat-Web v4.0发布

    关于RainbowChat-Web ► RainbowChat-Web详细介绍:http://www.52im.net/thread-2483-1-1.html► 历史版本更新记录:http://ww ...

  10. 解决git clone 速度慢的问题

    解决git clone 速度慢的问题 1.原因 git clone特别慢是因为github.global.ssl.fastly.net域名被限制了. 只要找到这个域名对应的ip地址,然后在hosts文 ...