//package com.ynxbd.wx.servlet; // //import com.ynxbd.api.bean.SmsGeneral; //import com.ynxbd.api.service.HCodeService; //import com.ynxbd.api.helper.SmsService; //import com.ynxbd.common.bean.PayInfoBean; //import com.ynxbd.common.bean.ReservationBean4Local; //import com.ynxbd.common.bean.remove.Time_RegResponseBean; //import com.ynxbd.common.dao.DBDao; //import com.ynxbd.common.dao.WSDao; //import com.ynxbd.api.utils.DateGenerate; //import com.ynxbd.ws.utils.WsResult; //import com.ynxbd.api.config.WxConfig; //import com.ynxbd.api.utils.CommonUtil; //import com.ynxbd.api.utils.Global; //import org.apache.log4j.Logger; //import org.apache.log4j.NDC; //import weixin.popular.bean.paymch.MchBaseResult; //import weixin.popular.bean.paymch.MchPayNotify; //import weixin.popular.util.SignatureUtil; //import weixin.popular.util.StreamUtils; //import weixin.popular.util.XMLConverUtil; // //import javax.servlet.ServletInputStream; //import javax.servlet.ServletOutputStream; //import javax.servlet.http.HttpServlet; //import javax.servlet.http.HttpServletRequest; //import javax.servlet.http.HttpServletResponse; //import java.nio.charset.StandardCharsets; //import java.util.List; //import java.util.Map; //import java.util.UUID; // ///** // * @author 张剑峰 // * @version v1.0.0 // * @Project:微信公众号 // * @date 2017年7月23日下午4:28:39 // * @Copyright: 2017云南新八达科技有限公司 All rights reserved. // */ //public class Time_RegPayMchNotifyServlet extends HttpServlet { // // private static final Logger logger = Logger.getLogger(Time_RegPayMchNotifyServlet.class); // // @Override // protected void doPost(HttpServletRequest request, HttpServletResponse response) { // String remoteAddr = Global.getIpAddr(request); // NDC.remove(); // NDC.push(remoteAddr); // // ServletInputStream inputStream = null; // ServletOutputStream outputStream = null; // try { // inputStream = request.getInputStream(); // outputStream = response.getOutputStream(); // // // 获取请求数据 // String wxXmlData = StreamUtils.copyToString(request.getInputStream(), StandardCharsets.UTF_8); // // // 将XML转为MAP,确保所有字段都参与签名验证 // Map wxMapData = XMLConverUtil.convertToMap(wxXmlData); // StringBuilder wxResp = new StringBuilder(); // for (String key : wxMapData.keySet()) { // wxResp.append(key).append("=").append(wxMapData.get(key)).append(";"); // 拼接微信返回的信息 // } // // // 转换数据对象 // MchPayNotify wxPayNotify = XMLConverUtil.convertToObject(MchPayNotify.class, wxXmlData); // String wxOpenid = wxPayNotify.getOpenid(); // String wxTradeNo = wxPayNotify.getOut_trade_no(); // String wxTransactionId = wxPayNotify.getTransaction_id(); // Integer wxTotalFee = wxPayNotify.getTotal_fee(); // 金额 // // // 已处理 去重 // if (Global.keys.exists(wxTransactionId)) { // return; // } else { // Global.keys.add(wxTransactionId, Global.expire); // } // // // @since 2.8.5 // wxPayNotify.buildDynamicField(wxMapData); // // 签名验证 // MchBaseResult baseResult = new MchBaseResult(); // if (!SignatureUtil.validateSign(wxMapData, WxConfig.getMchKey())) { // 验证未通过-->通知支付失败 // baseResult.setReturn_code("FAIL"); // baseResult.setReturn_msg("ERROR"); // outputStream.write(XMLConverUtil.convertToXML(baseResult).getBytes()); // // logger.info("支付失败!"); // return; // } // // // 验证通过 // baseResult.setReturn_code("SUCCESS"); // baseResult.setReturn_msg("OK"); // outputStream.write(XMLConverUtil.convertToXML(baseResult).getBytes()); // // // 保存支付结果 // PayInfoBean payInfo = new PayInfoBean(); // payInfo.setOpenID(wxOpenid); // payInfo.setTradeNo(wxTradeNo); // payInfo.setInfo(wxResp.toString()); // // DBDao dbDao = new DBDao(); // if (dbDao.hasPayResult(payInfo)) { // return; // } // // if (dbDao.hasReserved(wxTradeNo)) { // 当前订单号是否已挂号成功 // return; // } // // // 保存支付结果信息 // dbDao.savePayResult(payInfo); // // List lstDate = DateGenerate.getDateAndTime(wxPayNotify.getTime_end()); // // logger.info(String.format("更新挂号信息(after pay),%s", wxTradeNo)); // ReservationBean4Local reserve = dbDao.updateReserve(wxTradeNo, lstDate.get(0), lstDate.get(1), wxTransactionId); // // if (reserve == null) { // logger.info("更新挂号信息失败"); // return; // } // String reserveTradeNo = reserve.getTradeNo(); // String patientId = reserve.getPatientId(); // if ("".equals(patientId) || reserveTradeNo == null) { // logger.info(String.format("挂号失败reservation=null,patientId=%s, tradeNo=%s, transNo=%s", patientId, reserveTradeNo, wxTransactionId)); // return; // } // // // 挂号 // logger.info(String.format("开始调用HIS挂号:patientId=%s", patientId)); // WsResult wsResult = new WSDao().reg4Time(reserve); // // if (wsResult.getResponseCode() == -1) { // 调用HIS失败-->自动退款 // logger.info(String.format("调用HIS挂号失败:patientId=%s", patientId)); // // 自动退款 // wxRefund(wxOpenid, wxTradeNo, wxTotalFee, wxTransactionId, wsResult.getResponseMessage()); // return; // } // // Time_RegResponseBean time_reg = wsResult.getDataMapBean(Time_RegResponseBean.class); // // String hisQueueNo = time_reg.getQueueNo(); // 门诊号 // String hisTransNo = time_reg.getHISTransNo(); // logger.info(String.format("HIS返回 hisTransNo=%s, hisQueueNo=%s", hisTransNo, hisQueueNo)); // // // 更新挂号信息 // logger.info(String.format("更新挂号信息(after his reservation):tradeNo=%s, patientId=%s, transNo=%s", wxTradeNo, patientId, wxTransactionId)); // dbDao.updateRegAfter(wxTradeNo, wxTransactionId, hisTransNo, hisQueueNo); // logger.info(String.format("挂号成功,patientId=%s", patientId)); // // if ("wxadc09f1c9d0bccee".equals(WxConfig.getAppId())) { // 德宏州二院,挂号成功发短信 // ReservationBean4Local bean4Local = dbDao.getReservationInfo4Time(wxTransactionId); // // 短信通知 // if (bean4Local != null && !bean4Local.getOpenId().equals("")) { // 关注过,并且填写过电话号码 // String tip = smsNotice(bean4Local) ? "成功" : "失败"; // logger.info("发送预约短信通知-" + tip); // } // } // // HCodeService.regPayReportHISData(wxOpenid, patientId, reserve.getDeptName(), reserve.getReservationDate()); // 电子健康卡上报数据 // } catch (Exception e) { // logger.info("回复微信支付成功通知异常"); // e.printStackTrace(); // } finally { // try { // if (inputStream != null) inputStream.close(); // // if (outputStream != null) outputStream.close(); // } catch (Exception e) { // e.printStackTrace(); // } // } // } // // // /** // * 预约短信通知 // * // * @param reserve 预约信息 // */ // private boolean smsNotice(ReservationBean4Local reserve) { // String tel = reserve.getTel(); // String date = reserve.getReservationDate(); // String begTime = reserve.getBegTime(); // String endTime = reserve.getEndTime(); // // if (tel == null || tel.length() != 11) { // logger.info("tel为空或长度异常"); // return false; // } // // SmsService smsService = new SmsService(); // SmsGeneral sms = new SmsGeneral(); // sms.setTime(date + " " + begTime + "-" + endTime); // sms.setAddress(reserve.getAddress()); // sms.setDeptName(reserve.getDeptName()); // sms.setDoctorName(reserve.getDoctName()); // sms.setSeq(String.valueOf(reserve.getCallNo())); // // // 发送 // return smsService.smsGeneral("SMS_180046170", tel, sms); // } // // /** // * 自动退款 // * // * @param openid openid // * @param tradeNo 商户单号 // * @param payMoney 退款金额 // * @param transNo 交易流水号 // * @param message 退款原因 // * @return 是否成功 // */ // private boolean wxRefund(String openid, String tradeNo, Integer payMoney, String transNo, String message) { // boolean result = false; // // // 如果HIS交过费返回true-->就不向下执行(自动退款) // String dateShort = DateGenerate.getStringDateShort(); // if (new WSDao().hasOutPayed(DateGenerate.getNextDay(dateShort, "-7"), DateGenerate.getNextDay(dateShort, "7"), transNo)) { // logger.info(String.format("His已经缴费成功,不退费, tradeNo=%s, transNo=%s", tradeNo, transNo)); // return false; // } // // logger.info(String.format("挂号失败,开始申请退款transNo=%s", transNo)); // DBDao dbDao = new DBDao(); // // 预约失败后记录 // if (!dbDao.updateReserveAfterFail(tradeNo, message)) { // 记录失败 // logger.info(String.format("预约记录失败transNo=%s", transNo)); // } // // // 退款 // boolean refundResult = dbDao.refund(1, // UUID.randomUUID().toString().replace("-", ""), // tradeNo, // payMoney, // message); // // if (refundResult) { // 退款成功 // logger.info(String.format("自动退款申请成功:tradeNo=%s", transNo)); // try { // CommonUtil.sendMessage(openid, String.format("挂号失败,%s,已申请退款:%s", message, transNo)); // 推送消息 // result = true; // } catch (Exception ex) { // logger.info(String.format("自动退款失败:tradeNo=%s", transNo)); // logger.info(ex.getMessage()); // } // } // return result; // } //}