退款需要安装证书等。
界面调用取消支付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; }