.NET Core 微信小程序退款步骤——(统一退款)_实用技巧

来源:脚本之家  责任编辑:小易  

开发版小程序首先说一些开zd发版小程序需要的东西:公众号(个人或者公司的均可、无需认证)微信开发者工具小程序模板(下面我会提供)第一步:公众号小程序注册类别选择小程序按照信息填写专相关资料,完成注册后以个人或者企业的身份申请属小程序均可。第二步:微信开发者工具下载第三步:在微信开发者工具内用小程序模板制作微信小程序www.zgxue.com防采集请勿采集本网。

继上一篇".NET Core 微信小程序支付——(统一下单)后",本文将实现统一退款功能,能支付就应该能退款嘛,一般涉及到钱的东西都会比较敏感,所以在设计退款流程时一定要严谨,不能出一点差错,否则你将会面临自己掏腰包的可能,下面我们来讲一讲退款的实现步骤。

退款应该场景及规则

首先,怎么样算违规?判断一款小程序是否违规,其实很简单。如果发现小程序有这些行为、内容,请勇敢地行使你的权利:带有色情内容;关于怎么举报微信小程序的方法,参照以上步骤操作就可以了,

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

您好!很高兴能为您解答, 方法/步骤 在手机上打开微信,切换到发现页面后点击小程序菜单项。接下来在打开的小程序列表中,找到要取消授权的小程序 在打开的小程序主界面,我们点击右上角的

规则

1、交易时间超过一年的订单无法提交退款;

小程序基于微信,所以离不开微信平台 只有微信用户才能用小程序 小程序做的网站类似于微官网,现在做这个开发的很多,如果你有基础,自己可以学习后尝试开发

2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号。

当然可以自己做,前提是你必须懂的代码、编码以及设计等话,你可以自己独立完成,如果你是一个编程小白的话,你可以借助第三方小程序开发工具平台,在选择开发工具平台的,建议选择带有组件拖拽

3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次

能做就是审核通不过,快站的小程序包就是论坛形式的 你可以测试下,不过需要电信资质比较麻烦啊。

    错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次

4、每个支付订单的部分退款次数不能超过50次

接口地址

接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund

相关参数

官方退款文档

文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_4&index=6

实现统一退款流程

如果业务有多处退款流程,可以将退款流程进行封装,方便多位置调用;如果公司有同主体下的不同小程序,都需要退款功能,也是可以进行封装,针对不同的小程序进行退款。

去商户后台先下载证书,退款时需要,下图是商户后台下载证书的界面:

引用包:

Senparc.Weixin.WxOpen

Senparc.Weixin.TenPay

注册公众号,小程序信息

services.AddSenparcGlobalServices(Configuration).AddSenparcWeixinServices(Configuration);IRegisterService register = RegisterService.Start(env, senparcSetting.Value).UseSenparcGlobal(false, null);register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) .RegisterTenpayV3(senparcWeixinSetting.Value, "appid");

统一退款代码实现

publicbool RefundProduct(OrdOrderProduct ordOrderProduct, PayOrderMstParam payOrderMstParam, OrdOrderPayItem ordOrderPayItem, string appID, DateTime thisTime, ref string errMsg){ try { OrdOrderPayMst refPay = null; if (!PayOrderManager.CreatePayOrderMST(payOrderMstParam, thisTime, ref refPay, ref errMsg)) { errMsg = "生成退款单出错!" + errMsg; return false; } var PayInfo = Senparc.Weixin.Config.SenparcWeixinSetting.Items[appID]; string AppID = PayInfo.WxOpenAppId; string AppSecret = PayInfo.WxOpenAppSecret; string Mch_id = PayInfo.TenPayV3_MchId;//商户号 string Mch_key = PayInfo.TenPayV3_Key;//商户密钥 string notifyUrl = string.Format(PayInfo.TenPayV3_TenpayNotify, "RefundNotifyUrl"); var timeStamp = TenPayV3Util.GetTimestamp(); var nonceStr = TenPayV3Util.GetNoncestr(); //支付源单号 string outTradeNo = ordOrderPayItem.PayNo;//商户订单号/支付单号 refPay.PayNoSource = ordOrderPayItem.PayNo; //退款单号 string outRefundNo = refPay.PayNo;//新退款单号 //支付时的总金额 int totalFee = (int)(ordOrderPayItem.PayPrice * 100); //退款金额 int refundFee = (int)(refPay.PayPrice * 100); string opUserId = PayInfo.TenPayV3_MchId; var dataInfo = new TenPayV3RefundRequestData(AppID, Mch_id, Mch_key, null, nonceStr, null, outTradeNo, outRefundNo, totalFee, refundFee, opUserId, null, notifyUrl: notifyUrl); //Logger.Info($"PayInfo={PayInfo.SerializeObject()}"); //Logger.Info($"dataInfo={dataInfo.SerializeObject()}"); //var basePath = AppContext.BaseDirectory; //var certPath = Path.Combine(basePath, "Config/apiclient_cert.p12"); //var cert = @"D:\projects\orderapi.trydou.com\Config\apiclient_cert.p12";//根据自己的证书位置修改 //var password = Mch_id;//默认为商户号,建议修改 //配置好证书地址,V3自动识别 var result = TenPayV3.Refund(dataInfo); refPay.PayResult = result.SerializeObject(); //Logger.Info("提交退款申请:" + refPay.PayResult); if (result.return_code.ToUpper() == "SUCCESS" && result.result_code.ToUpper() == "SUCCESS") { using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { //业务处理 //提交事务 scope.Complete(); } return true; } else { errMsg = result.err_code_des; Logger.Error(string.Format("提交退款失败,退款单号={0},关联订单号={1},关联产品={2},退款result={3}", refPay.PayNo, refPay.RelationNo, refPay.RelationNos, refPay.PayResult)); } } catch (Exception ex) { errMsg = ex.Message; Logger.Error(string.Format("提交退款异常:Message={0},StackTrace={1}", ex.Message, ex.StackTrace)); } return false; }

注:注意退款接口的参数,如:金额,退款地址等,确保参数正确,一般微信会收到退款的请求指令,微信处理成功后,会异步回调退款的接口给服务器。

退款统一回调处理

直接上代码如下:

/// <summary>/// 退款回调/// </summary>[HttpPost("RefundNotifyUrl")]public ActionResult RefundNotifyUrl(){ ResponseResult result = new ResponseResult(); ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); try { var mch_key = Senparc.Weixin.Config.SenparcWeixinSetting.TenPayV3_Key; if (return_code.ToUpper() == "SUCCESS") { //string result_code = resHandler.GetParameter("result_code"); //string appId = resHandler.GetParameter("appid"); //string mch_id = resHandler.GetParameter("mch_id"); //string nonce_str = resHandler.GetParameter("nonce_str"); string req_info = resHandler.GetParameter("req_info"); var decodeReqInfo = TenPayV3Util.DecodeRefundReqInfo(req_info, mch_key); var decodeDoc = XDocument.Parse(decodeReqInfo); var refundNotifyXml = decodeDoc.SerializeObject(); //获取接口中需要用到的信息 string out_trade_no = decodeDoc.Root.Element("out_trade_no").Value; string out_refund_no = decodeDoc.Root.Element("out_refund_no").Value; string transaction_id = decodeDoc.Root.Element("transaction_id").Value; string refund_id = decodeDoc.Root.Element("refund_id").Value; int total_fee = int.Parse(decodeDoc.Root.Element("total_fee").Value); int refund_fee = int.Parse(decodeDoc.Root.Element("refund_fee").Value); RefundNotifyParam param = new RefundNotifyParam() { PayNo = out_trade_no,//商户订单号 PayPrice = ((float)refund_fee.ToInt() / 100).ToDecimal(),//退款金额 Out_refund_no = out_refund_no,//商户退款单号 TransactionNo = transaction_id,//微信订单号 Refund_id = refund_id, //微信退款单号 }; Logger.Info(string.Format("退款回调参数,return_code={0},return_msg={1},refundNotifyXml={2}", return_code, return_msg, refundNotifyXml)); result = Service.RefundNotifyUrl(param); if (result.errno != 0) { //回调处理逻辑失败 Logger.Error(string.Format("退款回调业务处理失败:退款单号{0},{1}", param.Out_refund_no, result.errmsg)); } else { Logger.Info(string.Format("退款回调业务处理成功,退款单号:{0}", param.Out_refund_no)); string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return Content(xml, "text/xml"); } } else { //错误的订单处理 Logger.Error(string.Format("退款回调失败,return_code={0},return_msg={1}", return_code, return_msg)); } } catch (Exception ex) { Logger.Error(string.Format("退款回调异常:Message={0},StackTrace={1}", ex.Message, ex.StackTrace)); } return Content("fail", "text/xml");}

注:如果业务处理退款成功后,请返回结果告诉微信SUCCESS,否则微信也会按规则不停发送退款回调给服务器,直到次数用完为止,具体查看上面规则文档。

总结

以上所述是小编给大家介绍的.NET Core 微信小程序退款步骤——(统一退款),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对真格学网网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

1、登录微信,下方有一个【发现】。2、点击【发现】,可以看到【小程序】。3、点击【小程序】,进入小程序界面。4、右上角有一个放大镜的标志,点击搜索你要找的小程序名。5、点击你搜索到的小程序,就关注成功了内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 微信小程序支付及退款流程详解
  • 小程序微信退款功能实现方法详解【基于thinkphp】
  • .net连接池的问题详解
  • asp.net发邮件示例
  • asp.net实现获取客户端详细信息
  • asp.net gridview与checkbox全选、全不选实现代码
  • .net连接oracle数据库的实现代码
  • asp.net中的url过滤实现代码
  • .net泛型通用函数的特殊问题的解决方法
  • asp.net mvc实现无组件上传图片实例介绍
  • 详解.net core中的数据保护组件
  • 值得收藏的asp.net基础学习笔记
  • 如何在手机微信中关注一些微信小程序
  • 怎么自己做一个微信小程序
  • 微信小程序可以用自己的服务器吗?
  • 微信小程序可以用自己的服务器么
  • 怎么举报微信小程序
  • 怎么给微信小程序授权位置信息
  • 微信小程序怎么做网站
  • 微信小程序可以自己做吗
  • 微信小程序上可以做论坛吗?
  • 微信小程序可以自己免费做吗
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧net core 微信小程序支付——(统一下单)微信小程序支付及退款流程详解小程序微信退款功能实现方法详解【基于thinkphp】.net连接池的问题详解asp.net发邮件示例asp.net实现获取客户端详细信息asp.net gridview与checkbox全选、全不选实现代码.net连接oracle数据库的实现代码asp.net中的url过滤实现代码.net泛型通用函数的特殊问题的解决方法asp.net mvc实现无组件上传图片实例介绍详解.net core中的数据保护组件值得收藏的asp.net基础学习笔记java正则表达式 pattern和matche未将对象引用设置到对象的实例 (asp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net汉字转拼音和获取汉字首字asp.net对路径"xxxxx"模拟qq心情图片上传预览示例获取ashx得到的内容(已处理好的数据)asp.net core中间件设置教程(7)asp.net通过httpmodule自动在url地址上添asp.net更新指定记录的方法repeater控件动态变更列(header,item和foasp.net 图片的读写入库实现代码获取客户端ip地址c#/vb.net各自实现代码vs2008 安装失败的总结与分享asp.net程序编译调试时偶尔出现访问被拒绝
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved