手机版

NET Core微信小程序退款步骤——(统一退款)

时间:2021-08-20 来源:互联网 编辑:宝哥软件园 浏览:

跟随前一篇文章。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?章=9 _ 4索引=6

实现统一退款流程

如果业务中有多个退款流程,可以封装退款流程,方便多位置调用;如果公司在同一个科目下有不同的小程序,需要退款功能,或者可以打包退款给不同的小程序。

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

参考包:

森帕克。Weixin.WxOpen

森帕克。微信.财付通

注册微信官方账号,小程序信息

服务。添加服务(配置)。添加服务(配置);IRegisterService register=注册服务.开始(env,senparcSetting .值)。UseSenparcGlobal(false,null);注册使用SenparcWeixin(senparcweixin设置).值,senparcSetting .价值。)registerstenpayv3(senparcWeixinseting .Value,' appid ');

统一退款代码实现

公共bool RefAnD ProducT(order ProducT OrdOrderProducT,PayOrderMstParam,OrdOrderMstParam,ordOrderPayItem,OrdOrderPayItem,string appID,DateTime thisTime,ref string errMsg){ try { OrdOrderPayMst ref pay=null;if(!付款订单管理器CreatePayOrderMST(payOrderMstParam,thisTime,ref refPay,ref errMsg)) { errMsg='生成退款单出错!'错误信息返回false} var PayInfo=Senparc .微信。配置。senparcweixinseting。项目[AppID];字符串AppID=PayInfo .wxopenapappid字符串AppSecret=PayInfo .WxOpenAppSecret字符串Mch_id=PayInfo .TenPayV3 _ MchId//商户号字符串Mch_key=PayInfo .TenPayV3 _ Key//商户密钥字符串notifyUrl=字符串。格式(支付信息.TenPayV3_TenpayNotify,' RefAnDnotifyURl ');var时间戳=TenPayV3Util .GetTimestamp();var nonceStr=TenPayV3Util .GetNoncestr();//支付源单号字符串outTradeNo=ordOrderPayItem .工资号;//商户订单号/支付单号refPay .付款来源=订单付款项目.工资号;//退款单号字符串outRefundNo=refPay .工资号;//新退款单号//支付时的总金额int TotalFee=(int)(orderPayItem).支付价格* 100);//退款金额int RefrendFee=(int)(RefPay .支付价格* 100);字符串opUserId=PayInfo .tenpay v3 _ MchIdvar dataInfo=new tenpay v3 refundrequestdata(AppID,Mch_id,Mch_key,null,nonceStr,null,outTradeNo,outRefundNo,totalFee,refundFee,opUserId,null,notifyrl : notifyrl//记录器.信息($'PayInfo={PayInfo .serializeObject()} ');//记录器.信息($'dataInfo={dataInfo .serializeObject()} ');//var basePath=AppContext .BaseDirectory//var certPath=路径组合(基本路径,' Config/API client _ cert。p12’);//var cert=@ ' d : \ project \ order API。试试阿斗。com \ Config \ API client _ cert。' p12 ';//根据自己的证书位置修改//var password=Mch _ id;//默认为商户号,建议修改//配置好证书地址,V3自动识别定义变量结果=TenPayV3 .退款(DataInfo);refPay .PayResult=结果. SerializeObject();//记录器.信息('提交退款申请:' refPay .支付结果);if (result.return_code .ToOpper()==' SUCCESS '结果。结果代码.Toupper()==' SUCCESS '){ 0使用(交易范围作用域=新的交易范围(交易范围asyncflow选项).已启用){ //业务处理//提交事务范围。完成();}返回true} else { errMsg=result。err _ code _ des伐木工。错误(字符串。格式('提交退款失败,退款单号={0},关联订单号={1},关联产品={2},退款结果={3} ',refPay .支付号,重新支付。关系否,重新支付关系,工资.支付结果));} } catch (Exception ex) { errMsg=ex .消息;伐木工。错误(字符串。格式('提交退款异常:消息={0},堆栈跟踪={1},例如。留言,前任堆栈跟踪));}返回false}注:注意退款接口的参数,如:金额,退款地址等,确保参数正确,一般微信会收到退款的请求指令,微信处理成功后,会异步回调退款的接口给服务器。

退款统一回调处理

直接上代码如下:

///摘要///退款回调////摘要[HttpSet(' RefAnDnotifYURl ')]公共操作结果RefAnDnotifyURl(){响应结果结果=新响应结果();ResponseHandler resHandler=new ResponseHandler(HttpContext);字符串return_code=resHandler .GetParameter(' return _ code ');字符串return_msg=resHandler .GetParameter(' return _ msg ');尝试{ var mch_key=Senparc .微信。配置。senparcweixinseting。tenpayv3 _ Keyif(返回代码.ToOpper()==' SUCCESS '){//字符串result_code=resHandler .GetParameter(' result _ code ');//字符串appId=resHandler .getParameter(' appid ');//字符串mch_id=resHandler .getParameter(' mch _ id ');//string nonce_str=resHandler .GetParameter(' nonce _ str ');字符串req_info=resHandler .GetParameter(' req _ info ');var decodeReqInfo=TenPayV3Util .DecodeRefundReqInfo(req_info,mch _ key);var decodeDoc=XDocument .解析(DecodeReqinfo);var refundNotifyXml=decodeDoc .SerializeObject();//获取接口中需要用到的信息string out_trade_no=decodeDoc .根元素(' out_trade_no ').价值;字符串输出_退款_no=decodeDoc .根元素(' out _退款_no ').价值;string transaction_id=decodeDoc .根元素("事务标识")。价值;线退款_id=decodeDoc .根元素("退款标识")。价值;int total_fee=int .解析(decodeDoc .根元素("总费用")。价值);(同Internationalorganizations)国际组织退款_fee=int .解析(decodeDoc .根元素("退款_费用")。价值);RefundNotifyParam参数=new RefundNotifyParam(){ PayNo=out _ trade _ no,//商户订单号PayPrice=(浮动)退款_手续费ToInt()/100).ToDecimal(),//退款金额出去退款_no=out _退款_否,//商户退款单号TransactionNo=transaction_id,//微信订单号退款_id=退款_id,//微信退款单号};伐木工。信息(字符串。格式('退款回调参数,return_code={0},return_msg={1},refundNotifyXml={ 2 } ',return_code,return_msg,RefAnDnotifyXMl));结果=服务RefundNotifyUrl(参数);if (result.errno!=0) { //回调处理逻辑失败伐木工。错误(字符串。格式('退款回调业务处理失败:退款单号{0},{1},参数出去退款_不,结果。errmsg));} else { Logger .信息(字符串。格式('退款回调业务处理成功,退款单号:{0} ',参数出去退款_ no));字符串xml=字符串。格式(@ XML return _ code![CData[{ 0 }]/return _ code return _ msg![CData[{ 1 }]/return _ msg/XML ',return_code,return _ msg);返回内容(xml,‘text/XML’);} } else { //错误的订单处理伐木工。错误(字符串。格式('退款回调失败,return_code={0},return_msg={1} ',return_code,return _ msg));} } catch (Exception ex) { Logger .错误(字符串。格式('退款回调异常:消息={0},堆栈跟踪={1},例如。留言,前任堆栈跟踪));}返回内容("失败"、"文本/XML ");}注:如果业务处理退款成功后,请返回结果告诉微信成功,否则微信也会按规则不停发送退款回调给服务器,直到次数用完为止,具体查看上面规则文档。

总结

以上所述是小编给大家介绍的。净核心微信小程序退款步骤——(统一退款),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

版权声明:NET Core微信小程序退款步骤——(统一退款)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。