.net core 微信支付-----申请退款
首先看官方文档:
请求示例:
返回参数:
这个参数太长了就不多说了,上代码:
Model:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | public class ApplyAmount { /// <summary> /// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一 /// 原支付交易对应的商户订单号 /// </summary> public string out_trade_no { set ; get ; } /// <summary> /// 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。 /// 示例值:1217752501201407033233368018 /// </summary> public string out_refund_no { set ; get ; } /// <summary> /// 若商户传入,会在下发给用户的退款消息中体现退款原因。 /// 示例值:商品已售完 /// 非必填 /// </summary> public string reason { set ; get ; } /// <summary> /// 异步接收微信支付退款结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 如果参数中传了notify_url,则商户平台上配置的回调地址将不会生效,优先回调当前传的这个地址。 /// 示例值:https://weixin.qq.com, 必须是https的网址 /// </summary> public string notify_url { set ; get ; } /// <summary> /// 退款金额实体 /// </summary> public RefundsAmountModel amount { set ; get ; } } /// <summary> /// 退款订单金额信息。 /// </summary> public class RefundsAmountModel { /// <summary> /// 退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额。 /// </summary> public int refund { set ; get ; } /// <summary> /// 原支付交易的订单总金额,币种的最小单位,只能为整数。 /// </summary> public int total { set ; get ; } /// <summary> /// 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。 /// </summary> public string currency { set ; get ; } } /// <summary> /// 退款订单金额信息。 /// </summary> public class RefundsRespAmountModel { /// <summary> /// 退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额。 /// </summary> public int refund { set ; get ; } /// <summary> /// 原支付交易的订单总金额,币种的最小单位,只能为整数。 /// </summary> public int total { set ; get ; } /// <summary> /// 现金支付金额,单位为分,只能为整数。 /// </summary> public int payer_total { set ; get ; } /// <summary> /// 退款给用户的金额,不包含所有优惠券金额。 /// </summary> public int payer_refund { set ; get ; } /// <summary> /// 应结订单金额=订单金额-免充值代金券金额,应结订单金额<=订单金额,单位为分 /// </summary> public int settlement_refund { set ; get ; } /// <summary> /// 优惠退款金额 <=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠,单位为分。 /// </summary> public int discount_refund { set ; get ; } /// <summary> /// 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。 /// </summary> public string currency { set ; get ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | public class ReturnAmount { /// <summary> /// 微信支付退款号。 /// </summary> public string refund_id { set ; get ; } /// <summary> /// 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。 /// 示例值:1217752501201407033233368018 /// </summary> public string out_refund_no { set ; get ; } /// <summary> /// 微信支付交易订单号。 /// </summary> public string transaction_id { set ; get ; } /// <summary> /// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一 /// 原支付交易对应的商户订单号 /// </summary> public string out_trade_no { set ; get ; } /// <summary> /// 枚举值: /// ORIGINAL:原路退款 /// BALANCE:退回到余额 /// OTHER_BALANCE:原账户异常退到其他余额账户 /// OTHER_BANKCARD:原银行卡异常退到其他银行卡 /// </summary> public string channel { set ; get ; } /// <summary> /// 取当前退款单的退款入账方,有以下几种情况: /// 1)退回银行卡:{银行名称}{卡类型}{ 卡尾号} /// 2)退回支付用户零钱:支付用户零钱 /// 3)退还商户:商户基本账户商户结算银行账户 /// 4)退回支付用户零钱通:支付用户零钱通。 /// </summary> public string user_received_account { set ; get ; } /// <summary> /// 退款成功时间,当退款状态为退款成功时有返回。遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒 /// </summary> public string success_time { set ; get ; } /// <summary> /// 退款受理时间。 遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。 /// </summary> public string create_time { set ; get ; } /// <summary> /// 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台-交易中心,手动处理此笔退款。 /// 枚举值: /// SUCCESS:退款成功 /// CLOSED:退款关闭 /// PROCESSING:退款处理中 /// ABNORMAL:退款异常 /// </summary> public string status { set ; get ; } /// <summary> /// 退款所使用资金对应的资金账户类型。 枚举值: /// UNSETTLED : 未结算资金 /// AVAILABLE : 可用余额 /// UNAVAILABLE : 不可用余额 /// OPERATION : 运营户 /// </summary> public string funds_account { set ; get ; } /// <summary> /// 金额详细信息。 /// </summary> public RefundsRespAmountModel amount { set ; get ; } } |
退款接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | [HttpPost( "ReturnMoney" )] public async Task<ReturnAmount> ReturnMoney() { //申请退款 var req = new ApplyAmount { out_refund_no = "" , //要退回的那个订单号 out_trade_no = "" , //当前退款的订单号。(比如你下单有个订单号,那退款是不是也要有自己的订单号) reason = "测试行不行" , //这个是退款结果通知回调,要看需求,其实退款后微信给消息的 //我们这里的通知是对系统做记录的。所以要看需不需要。 notify_url = "https:/" , amount = new RefundsAmountModel { refund = 1, total = 1, currency = "CNY" } }; var url = $ "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds" ; var client = new HttpClient( new HttpHandler()); var bodyJson = new StringContent(req.ToJson(), Encoding.UTF8, "application/json" ); var resp = await client.PostAsync(url, bodyJson); var respStr = await resp.Content.ReadAsStringAsync(); var payModel = respStr.ToObject<ReturnAmount>(); return payModel; } |
这里不能直接测了,毕竟项目已经上线了,不能在测了。我放一个以前测试测是效果图:
源码:
链接:https://pan.baidu.com/s/1CVtfbQ4mVk8saPZSZWTATg?pwd=72bb
提取码:72bb
.Net Core
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)