退款需要安装证书等。
界面调用取消支付ajax
$.ajax({ type : "POST", url : path + "/wxpay/refund.do", data : { orderNum : orderNum, payType:payType }, dataType : 'json', success : function(data) { if (data.success) { location.reload(); }else{ myAlert(data.msg); } } });
refund 方法
@Action(value = "refund") public String refund() throws Exception { try{ BaseDao dao = this.getDao(); Map<String, Object> returnMap = new HashMap<String, Object>(); FwhtemplateService fwhtemplateService = new FwhtemplateServiceImpl(); if(model.getPayType().equals(Constants.cashpay)){ //现金支付 model.setOrderStatus(Constants.ORDER_STATUS_3); model.setCancelTime(DateUtil.newDate()); dao.updateSql("order.upt_order", model); OrderModel o = (OrderModel) dao.selectObject("order.getOrder", model); //发送信鸽 fwhtemplateService.cancelOrderToWorker(o); returnMap.put("success", true); this.doResponseWithJson(returnMap); return NONE; }else{ //微信支付 // 先判断对应的交易流水号在dd_trade_wxpay中是否存在,传入交易流水号 String orderNum = model.getOrderNum(); List<Notice> noticeList = dao.selectForList("wxpay.getTradeByNum", orderNum); if (ObjUtil.isNullOrEmpty(noticeList)) { returnMap.put("success", false); returnMap.put("msg", "退款失败"); this.doResponseWithJson(returnMap); return NONE; } Notice notice = noticeList.get(0); String transaction_id = notice.getTransaction_id(); String out_trade_no = notice.getOut_trade_no(); double total_fee_str = notice.getTotal_fee(); RefundReqData xmlObj = new RefundReqData(transaction_id, out_trade_no, null, total_fee_str); // 向微信发送接口数据 String result = WeixinUtil.weixinKeyPostXml(Configure.REFUND, xmlObj); // 微信返回的数据 RefundRespData retModel = (RefundRespData) Util.getObjectFromXML( result, RefundRespData.class); if (ObjUtil.isNullOrEmpty(retModel)) { // 支付请求失败 returnMap.put("success", false); returnMap.put("msg", "退款请求失败"); this.doResponseWithJson(returnMap); return NONE; } if (!"SUCCESS".equals(retModel.getReturn_code().toUpperCase())) { // 支付请求失败 returnMap.put("success", false); returnMap.put("msg", retModel.getReturn_msg()); this.doResponseWithJson(returnMap); return NONE; } if (!"SUCCESS".equals(retModel.getResult_code().toUpperCase())) { returnMap.put("success", false); returnMap.put("msg", retModel.getErr_code_des()); this.doResponseWithJson(returnMap); return NONE; } // 退款成功,需要加入对应的数据库 // 查看对应的订单号是否已经更新成退款的状态 TradeWxpayRefund refund = (TradeWxpayRefund) dao.getObject("wxpay.getRefundById", retModel.getTransaction_id()); if (ObjUtil.isNullOrEmpty(refund)) { // 说明还未退款成功,则执行退款的相关库表更新 // 插入退款表 refund = new TradeWxpayRefund(); refund.setId(retModel.getTransaction_id()); refund.setCouponRefundFee(retModel.getCoupon_refund_fee()); refund.setOutRefundNo(retModel.getOut_refund_no()); refund.setOutTradeNo(retModel.getOut_trade_no()); refund.setRefundChannel(retModel.getRefund_channel()); refund.setRefundFee(retModel.getRefund_fee()); refund.setRefundId(retModel.getRefund_id()); refund.setCreateTime(DateUtil.newDate()); // 更新交易表dd_trade_wxpay,先根据Transaction_id找到对应的记录 Notice pay = (Notice) dao.getObject("wxpay.getTradeByTid", retModel.getTransaction_id()); if (!ObjUtil.isNullOrEmpty(pay)) { pay.setTrade_state("REFUND"); } else { returnMap.put("success", false); returnMap.put("msg", "找不到对应的交易记录,请联系商家"); this.doResponseWithJson(returnMap); return NONE; } // 更新订单表 List<OrderModel> orderList = dao.selectForList("wxpay.getOrderByTno", retModel.getOut_trade_no()); OrderModel order = null; if (!ObjUtil.isNullOrEmpty(orderList)) { order = orderList.get(0); order.setOrderStatus(Constants.ORDER_STATUS_3); order.setCancelTime(DateUtil.newDate()); } else { returnMap.put("success", false); returnMap.put("msg", "找不到对应的交易记录,请联系商家"); this.doResponseWithJson(returnMap); return NONE; } // 启动事务 DaoUtil.getDaoManager().startTransaction(); dao.insertSql("wxpay.insertRefund", refund); dao.updateSql("wxpay.upt_wxpayByTid", pay); dao.updateSql("wxpay.upt_orderByNum", order); DaoUtil.getDaoManager().commitTransaction(); DaoUtil.getDaoManager().endTransaction(); //发送信鸽 fwhtemplateService.cancelOrderToWorker(order); } returnMap.put("success", true); returnMap.put("msg", "订单取消成功,相应款项已退回您的账下"); this.doResponseWithJson(returnMap); return NONE; } }catch(Exception e){ e.printStackTrace(); } return NONE; }
相关推荐
Java微信退款接口是微信支付提供的一种服务,允许商家在用户退款请求时,通过API与微信服务器进行交互,完成退款操作。这个过程涉及到的关键技术主要包括Java编程、HTTPS通信、数字证书以及JSON数据格式处理。 首先...
微信退款demo java版 亲测可行 改成自己就可以
内容:微信支付-工具类,包含微信退款,微信支付,微信相关V2版本V3接口集成 适用人群:JAVA 使用场景:集成好微信支付,可自由调整相关类,自由编写业务场景 说明: 将工具类导入该自行项目,将maven-jar 的配置...
微信退款iis配置:今天给网站配置了加密证书文件,用类X509Certificate2加载证书文件时,一直报出现了内部错误,但是Demo中用控制台程序加载证书没任何问题.解决方法
微信退款工具类是一种用于处理微信支付退款流程的代码模块,它可以方便地集成到Web应用程序中,简化退款操作。本文将详细解析这个工具类的核心功能、使用方法以及涉及到的关键技术。 首先,`MD5Util.java` 文件是...
java实现微信支付的退款,根据微信用户的openid和订单号进行退款
Java微信退款功能主要涉及到微信支付接口的调用,支持对订单进行部分退款操作。这个过程通常包括以下几个关键步骤和技术要点: 1. **TenpayUtil**: `TenpayUtil` 类是微信支付的核心工具类,它封装了与微信服务器...
本示例将详细介绍如何对微信退款回调中的AES加密数据进行解密。 首先,我们需要理解AES加密的基本原理。AES是一种对称加密算法,其工作模式包括ECB、CBC、CFB、OFB和CTR等。在微信支付中,一般采用CBC(Cipher ...
在Java微信退款功能中,开发者通常需要利用微信支付提供的API接口来实现退款操作。这个功能主要服务于电商、线上服务等需要处理用户支付退款的场景。微信支付提供了详细的官方文档,即使是初学者也能按照指南逐步...
本文将详细介绍如何使用AES解密微信退款报文的参考代码。 1. **AES加密原理**: AES是一种分组密码,它将明文分为128位的数据块进行加密。它使用了多次置换和替换操作,包括字节代换、行移位、列混淆和轮密钥加等...
2. 微信退款v3版 3. 微信交易状态查询 4. 企业打款到个人零钱(旧版) 本人在企业项目中使用,自己封装的的微信交易相关的一套工具类。 直接调用方法传入对应的参数即可。 如果有什么问题可以留言讨论。
微信退款加密数据解密工具代码,真的没搞懂微信怎么想的,微信退款,公众号消息,小程序,微信支付的加密解密方式全都不一样,每一个都要单独调试,简直要死人,那我就调试好一个就传一个上来
### Java微信退款功能详解 #### 一、概述 在电商及各类在线交易场景中,退款功能是必不可少的一个环节。微信支付作为国内主流的第三方支付工具之一,提供了丰富的API接口来支持商家实现各种支付与退款需求。本文将...
Java微信退款是一个涉及微信支付平台接口调用的Java应用程序,主要功能是实现对用户支付的退款操作。在微信支付的生态系统中,商户需要通过特定的API接口与微信服务器交互,处理退款请求。以下是对这个Java项目的...
2. **调用退款接口**:使用商户ID、商户秘钥、预支付交易单号和退款信息等,调用微信退款API发起退款请求。 3. **处理退款结果**:同样,退款结果会以异步通知的形式返回,需要在后台处理并更新订单状态。 三、...
本资源包属于Java开发的一个工具包,包含各类微信支付,微信退款,企业微信转账; 微信支付包括:1,app支付;2,微信网页支付(jsapi);3,微信扫码支付(native) 微信网页支付:是指在微信中打开的网页,在其他...
在Java开发领域,微信退款是常见的业务需求,特别是在电商或者支付相关的系统中。本文将详细介绍如何使用Java实现微信退款功能,并结合提供的资源进行操作。首先,我们来看标题"JAVA微信退款(亲测绝对好用)",这...
在本例中,我们关注的是“微信退款AES解密包”,这通常是指一个用于处理微信退款流程中涉及的AES(Advanced Encryption Standard)加密数据的工具或代码库。AES是一种广泛应用的对称加密算法,因其高效和安全性而被...
在本文中,我们将深入探讨如何在ASP.NET MVC框架下实现微信相关的功能,包括微信登录、微信支付、微信退款以及微信企业付款。这些都是现代电子商务网站和应用程序中不可或缺的组件,尤其在中国市场,微信作为一款...