From fe10e472cfff955dda638fcda87f4a8999e098b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=BF=9B=E6=89=8D?= Date: Fri, 26 Jan 2024 10:05:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=84=E7=BA=A6=E4=BD=93=E6=A3=80=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/version_update.sql | 2 +- .../com/ynxbd/common/action/RecipeAction.java | 3 +- .../common/action/pay/MedicalAction.java | 5 + .../ynxbd/common/action/pay/PayAction.java | 9 +- .../com/ynxbd/common/bean/pay/Register.java | 2 + .../com/ynxbd/common/dao/RegisterDao.java | 2 +- .../ynxbd/common/dao/his/HisRecipeDao.java | 9 +- .../ynxbd/common/dao/his/HisRegisterDao.java | 12 ++ .../com/ynxbd/common/dao/peis/PeisDao.java | 9 +- .../com/ynxbd/common/helper/his/HisEnum.java | 2 + .../com/ynxbd/common/service/PeisService.java | 40 ++++--- .../com/ynxbd/common/service/RegService.java | 104 ++++++++++++++++-- .../com/ynxbd/wx/servlet/test/RefundTest.java | 17 +++ .../wx/servlet/test/RefundTestServlet.java | 2 +- .../com/ynxbd/wx/utils/DesEncryptHelper.java | 2 +- .../ynxbd/wx/wxfactory/ReqParamHelper.java | 2 +- .../wx/wxfactory/utils/WxSignHelper.java | 3 + src/main/resources/apiclient_cert.p12 | Bin 0 -> 2750 bytes src/main/resources/medical.properties | 2 +- src/main/resources/wx.properties | 29 +++-- 20 files changed, 211 insertions(+), 45 deletions(-) create mode 100644 src/main/java/com/ynxbd/wx/servlet/test/RefundTest.java create mode 100644 src/main/resources/apiclient_cert.p12 diff --git a/sql/version_update.sql b/sql/version_update.sql index 9a2ec51..874fb97 100644 --- a/sql/version_update.sql +++ b/sql/version_update.sql @@ -203,7 +203,7 @@ CREATE TABLE `peis_reserve` ( `PatientID` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `OutTradeNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `BankTransNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, - `TradeNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '', + `TradeNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `RecipeID` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `TreatNum` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `TotalFee` decimal(10,3) DEFAULT NULL, diff --git a/src/main/java/com/ynxbd/common/action/RecipeAction.java b/src/main/java/com/ynxbd/common/action/RecipeAction.java index dea307b..7453289 100644 --- a/src/main/java/com/ynxbd/common/action/RecipeAction.java +++ b/src/main/java/com/ynxbd/common/action/RecipeAction.java @@ -103,8 +103,7 @@ public class RecipeAction extends BaseAction { if(treatNum==null||personID==null||recipes==null){ return Result.error(ResultEnum.PARAM_IS_DEFECT); } - List medicalRecipe = new HisRecipeDao().uploadMedicalRecipe(treatNum,personID,recipes); - return Result.success(medicalRecipe); + return new HisRecipeDao().uploadMedicalRecipe(treatNum,personID,recipes); } // /** diff --git a/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java b/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java index 753ed74..ff0aa8d 100644 --- a/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java @@ -93,6 +93,11 @@ public class MedicalAction extends BaseAction { JSONObject respJson = WxMedicalHelper.getMdAuthUrl("wx-medical-refund.html", null); return Result.success(respJson); } + @Action("getMedicalAuthUrl") + public Result getMedicalAuthUrl(String url) { + JSONObject respJson = WxMedicalHelper.getMdAuthUrl(url, null); + return Result.success(respJson); + } /** * 获取对账链接 diff --git a/src/main/java/com/ynxbd/common/action/pay/PayAction.java b/src/main/java/com/ynxbd/common/action/pay/PayAction.java index 3297622..e54373d 100644 --- a/src/main/java/com/ynxbd/common/action/pay/PayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/PayAction.java @@ -1,6 +1,7 @@ package com.ynxbd.common.action.pay; import com.alibaba.fastjson.JSONObject; +import com.bocom.api.response.foreignccy.QueryReservationRegistResponseV1; import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.bean.ConfigSelfHelp; import com.ynxbd.common.bean.RecipeHelp; @@ -177,11 +178,12 @@ public class PayAction extends BaseAction { */ @Action("peisRefund") public Result peisRefund(String recipeId, String payCode, String outTradeNo, String totalFee,String openid){ + log.info("[体检预约]取消预约退费,recipeId-{}.payCode-{},outTradeNo-{},totalFee-{},openid-{}",recipeId,payCode,outTradeNo,totalFee,openid); PeisService peisService = new PeisService(); MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByCode(payCode); PeisDao peisDao = new PeisDao(); Recipe recipe = peisDao.selectByOutTradeNo(outTradeNo); - if(!new BigDecimal(totalFee).equals(new BigDecimal(String.valueOf(recipe.getTotalFee())))){ + if(new BigDecimal(totalFee).compareTo(recipe.getTotalFee())!=0){ return Result.error(ResultEnum.REFUND_MONEY_ERROR); } String pushMessage = "已申请退款,原因:患者主动取消退费,订单号:" + outTradeNo +"orderNo:"+ recipeId; @@ -501,6 +503,11 @@ public class PayAction extends BaseAction { return new RegService().cancelRegReserve(patientId, tradeNo, hisTransNo); } + @Action("refundRegister") + public Result refundRegister(String hisTransNo){ + return new RegService().refundRegister(hisTransNo); + } + /** * 第三方手动退费 diff --git a/src/main/java/com/ynxbd/common/bean/pay/Register.java b/src/main/java/com/ynxbd/common/bean/pay/Register.java index 58aefc2..55a212e 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Register.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Register.java @@ -38,6 +38,8 @@ public class Register extends Order { private BigDecimal clinicFee; private String clinicCode; private String clinicName; + + private String refundDate; // 时段id private String tid; // 时段名 diff --git a/src/main/java/com/ynxbd/common/dao/RegisterDao.java b/src/main/java/com/ynxbd/common/dao/RegisterDao.java index 54d9700..2079990 100644 --- a/src/main/java/com/ynxbd/common/dao/RegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/RegisterDao.java @@ -167,7 +167,7 @@ public class RegisterDao { if (isToday) { // 今日挂号 hisRegs = hisRegisterDao.hasRegSite(patientId, regDate); for (Register hisReg : hisRegs) { - if (deptCode.equals(hisReg.getDeptCode())) { + if (deptCode.equals(hisReg.getDeptCode())&&(hisReg.getRefundDate()==null||"".equals(hisReg.getRefundDate()))) { return true; } } diff --git a/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java b/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java index 3fe46d8..34cce48 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java @@ -6,6 +6,7 @@ import com.ynxbd.common.bean.xk.medicalRecipe; import com.ynxbd.common.helper.his.HisEnum; import com.ynxbd.common.helper.his.HisHelper; import com.ynxbd.common.result.JsonResult; +import com.ynxbd.common.result.Result; import com.ynxbd.wx.config.WeChatConfig; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -95,10 +96,10 @@ public class HisRecipeDao { return resultList; } - public List uploadMedicalRecipe(String treatNum, String personID, String recipes) { + public Result uploadMedicalRecipe(String treatNum, String personID, String recipes) { List resultList = new ArrayList<>(); - JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.XK_MEDICAL_RECIPE, params -> { + JsonResult jsonResult = HisHelper.getMdJsonResult(HisEnum.XK_MEDICAL_RECIPE, params -> { params.put("PersonID",personID); params.put("MZNum", treatNum); params.put("CallNo",HisHelper.CALL_NO); @@ -106,14 +107,14 @@ public class HisRecipeDao { }); if (!jsonResult.success()) { // 失败 - return resultList; + return Result.error(jsonResult.getMessage()); } List medicalRecipe = jsonResult.getDataMapList(medicalRecipe.class, "CFNums","Item"); if (medicalRecipe != null) { resultList = medicalRecipe; } - return resultList; + return Result.success(resultList); } diff --git a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java index 982a3c6..70c2280 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java @@ -490,6 +490,7 @@ public class HisRegisterDao { reg.setRegDate(node.getString("RegistDate")); reg.setBegTime(node.getString("BegTime")); reg.setEndTime(node.getString("EndTime")); + reg.setRefundDate(node.getString("RefundDate")); // 是否取号 reg.setIsTake(node.getInteger("IsTake")); // 是否就诊 @@ -601,6 +602,17 @@ public class HisRegisterDao { return HisHelper.getJsonResult(HisEnum.AP_Recall_Reservation, params, merchantEnum); } + /** + * 今日挂号-取消挂号 + * @return + */ + public JsonResult refundRegister(String tradeNo,MerchantEnum merchantEnum){ + Map params = new HashMap<>(); + params.put("TransNo",tradeNo); + params.put("DelTransNo","R" + tradeNo); + return HisHelper.getJsonResult(HisEnum.AP_Refund_Register,params,merchantEnum); + } + /** * 查询患者是否挂过号 * diff --git a/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java b/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java index 065316c..5e2f16a 100644 --- a/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java +++ b/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java @@ -61,6 +61,13 @@ public class PeisDao { return null; } + public boolean checkRefund(String outTradeNo){ + String sql = "select * from peis_reserve where outTradeNo=? and refundResult = 'OK'"; + return !DataBase.select(sql,Recipe.class,ps->{ + ps.setString(1,outTradeNo); + }).isEmpty(); + } + public Recipe selectByRecipeId(String recipeId) { String sql = "select * from peis_reserve where recipeId=? and peisStatus = 0 and payStatus=0 order by updateTime desc"; List list = DataBase.select(sql, Recipe.class, ps -> { @@ -99,7 +106,7 @@ public class PeisDao { } public boolean updatePeisStateOk(String outTradeNo, String bankTransNo) { - String sql = "update peis_reserve set peisStatus=0, bankTransNo=? where outTradeNo=? and bankTransNo is null"; + String sql = "update peis_reserve set peisStatus=0, bankTransNo=? where outTradeNo=?"; return DataBase.update(sql, ps -> { ps.setString(1, bankTransNo); ps.setString(2, outTradeNo); diff --git a/src/main/java/com/ynxbd/common/helper/his/HisEnum.java b/src/main/java/com/ynxbd/common/helper/his/HisEnum.java index aaccb77..3e0f713 100644 --- a/src/main/java/com/ynxbd/common/helper/his/HisEnum.java +++ b/src/main/java/com/ynxbd/common/helper/his/HisEnum.java @@ -46,6 +46,8 @@ public enum HisEnum { AP_Reservation("[预约挂号]执行预约", "3003", "AP_Reservation", true), AP_Recall_Reservation("[预约挂号]取消预约", "3006", "AP_Recall_Reservation", true), + AP_Refund_Register("[今日挂号]取消预约", "4007", "AP_Refund_Register", true), + // 支付[自定义]------------------ Create_Self_Help("[处方]生成自助申请单", "10001", "UniversalInterface", true), Query_Self_Help("[处方]查询自助申请单信息", "10002", "UniversalInterface", true), diff --git a/src/main/java/com/ynxbd/common/service/PeisService.java b/src/main/java/com/ynxbd/common/service/PeisService.java index d990c92..bfc892a 100644 --- a/src/main/java/com/ynxbd/common/service/PeisService.java +++ b/src/main/java/com/ynxbd/common/service/PeisService.java @@ -83,17 +83,23 @@ public class PeisService { .add("outTradeNo",outTradeNo) .build(); String result = OkHttpHelper.post(XBDHelper.XBD_PEIS + "/wxUse/wxPay", formBody); - JSONObject jsonResult = JsonHelper.parseObject(result); - log.info("[体检预约]缴费成功回调体检系统计费 recipeId={}, bankTransNo-{}, 计费状态-{}, 计费信息-{}", recipeId, bankTransNo, jsonResult.get("code"), jsonResult.get("message")); if(result==null){ - String pushMessage = "体检预约失败已申请退款,原因:体检系统计费失败,订单号:" + outTradeNo+"orderNo:"+ recipeId; + log.info("[体检预约]体检服务无响应,开始退费"); + String pushMessage = "体检预约失败已申请退款,原因:体检服务无响应,订单号:" + outTradeNo+"orderNo:"+ recipeId; peisAutoRefund(recipeId,merchantEnum,outTradeNo,totalFee,pushMessage,tradeDate,openid); } - if("200".equals(jsonResult.get("code"))){ + JSONObject jsonResult = JsonHelper.parseObject(result); + log.info("[体检预约]缴费成功回调体检系统计费 recipeId={}, bankTransNo-{}, 计费状态-{}, 计费信息-{}", recipeId, bankTransNo, jsonResult.get("code"), jsonResult.get("message")); + if("200".equals(jsonResult.get("code").toString())){ if(!peisDao.updatePeisStateOk(outTradeNo, bankTransNo)){ log.info("[体检预约]修改体检系统支付状态失败 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); } } + else { + log.info("[体检预约]回调体检系统计费状态码异常 recipeId={}, bankTransNo-{}, 计费状态-{}, 计费信息-{}", recipeId, bankTransNo, jsonResult.get("code"), jsonResult.get("message")); + String pushMessage = "体检预约失败已申请退款,原因:体检系统计费失败,订单号:" + outTradeNo+"orderNo:"+ recipeId; + peisAutoRefund(recipeId,merchantEnum,outTradeNo,totalFee,pushMessage,tradeDate,openid); + } } } @@ -110,37 +116,41 @@ public class PeisService { */ public Result peisAutoRefund(String recipeId, MerchantEnum merchantEnum, String outTradeNo, BigDecimal totalFee, String pushInfo, Date tradeDate, String openid){ PeisDao peisDao = new PeisDao(); + if(peisDao.checkRefund(outTradeNo)){ + log.info("{} [体检预约][该订单已经退费,请不要重复退费] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee); + return Result.error("该订单已经退费,请不要重复退费"); + } String result = OkHttpHelper.get(XBDHelper.XBD_PEIS+"/wxUse/GetOrder",params -> { params.put("orderNo",recipeId); }); - JSONObject jsonResult = JsonHelper.parseObject(result); if(result==null){ - log.info("{} [体检预约][退费错误,计费信息查询失败] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}",recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); + log.info("{} [体检预约][退费错误,计费信息查询失败] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee); return Result.error("退费错误,计费信息查询失败"); } + JSONObject jsonResult = JsonHelper.parseObject(result); String fee = jsonResult.getJSONObject("data").get("fee").toString(); boolean isWxPay = Boolean.parseBoolean(jsonResult.getJSONObject("data").get("isWxPay").toString()); boolean isCost = Boolean.parseBoolean(jsonResult.getJSONObject("data").get("isCost").toString()); if(totalFee.compareTo(BigDecimal.ZERO)==0||"0".equals(fee)){ - log.info("{} [体检预约][退费错误,退费金额为0] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}",recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); + log.info("{} [体检预约][退费错误,退费金额为0] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee); return Result.error("退费错误,退费金额为0"); } - if(totalFee.equals(new BigDecimal(String.valueOf(fee)))){ - log.info("{} [体检预约][退费错误,退费金额跟订单金额不符] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}",recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); + if(totalFee.compareTo(new BigDecimal(fee))!=0){ + log.info("{} [体检预约][退费错误,退费金额跟订单金额不符] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee); return Result.error("退费错误,退费金额跟订单金额不符"); } - if(isWxPay){ - log.info("{} [体检预约][退费错误,体检显示已计费,不允许退费] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}", recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); - return Result.error("退费错误,体检显示已计费,不允许退费"); - } +// if(isWxPay){ +// log.info("{} [体检预约][退费错误,体检显示已计费,不允许退费] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}", recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); +// return Result.error("退费错误,体检显示已计费,不允许退费"); +// } if(isCost){ - log.info("{} [体检预约][退费错误,his显示已计费,不允许退费] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}", recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); + log.info("{} [体检预约][退费错误,his显示已计费,不允许退费] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee); return Result.error("退费错误,his显示已计费,不允许退费"); } String refundResult; Order orderRefund = PayService.refund(merchantEnum, outTradeNo, recipeId, totalFee, totalFee, pushInfo, tradeDate, openid, null, pushInfo); if (!orderRefund.isSuccess()) { - log.info("{} [体检预约][退费错误] outTradeNo={}, recipeId={}, totalFee={},recipeId-{}", merchantEnum.NAME, outTradeNo, recipeId, totalFee,recipeId); + log.info("{} [体检预约][退费错误] outTradeNo={}, totalFee={},recipeId-{}", merchantEnum.NAME, outTradeNo, totalFee,recipeId); refundResult = orderRefund.getRefundResult(); } else { diff --git a/src/main/java/com/ynxbd/common/service/RegService.java b/src/main/java/com/ynxbd/common/service/RegService.java index 7684688..3c0f0fd 100644 --- a/src/main/java/com/ynxbd/common/service/RegService.java +++ b/src/main/java/com/ynxbd/common/service/RegService.java @@ -450,6 +450,83 @@ public class RegService { return result; } + public Result refundRegister(String hisTransNo) { + log.info("[今日挂号][取消预约]hisTransNo={}", hisTransNo); + + if (hisTransNo == null) { + log.info("[今日挂号][取消预约]参数缺失 hisTransNo=null"); + return Result.error(ResultEnum.PARAM_IS_DEFECT); + } + + Register reg = new RegisterDao().selectRegByHisTransNo(hisTransNo); + if (reg == null) { + log.info("[今日挂号][取消预约]失败, 未查询到挂号支付信息"); + return Result.error(ResultEnum.DATA_NOT_FOUND); + } + String tradeNo = reg.getTradeNo(); + String outTradeNo = reg.getOutTradeNo(); + MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByOutTradeNo(outTradeNo); + + JsonResult JsonResult = new HisRegisterDao().refundRegister(tradeNo, merchantEnum); + if (!JsonResult.success()) { + String message = JsonResult.getMessage(); + log.info("[今日挂号][取消预约]失败 HIS返回:{}", message); + return Result.error(message); + } + + String dbTradeNo = reg.getTradeNo(); + BigDecimal payMoney = reg.getPayMoney(); + if (dbTradeNo == null || outTradeNo == null || payMoney == null) { + log.info("[今日挂号][取消预约]失败, 支付信息的参数为空, tradeNo={}, payMoney={}", tradeNo, payMoney); + return Result.error("今日挂号支付信息的参数为空"); + } + + if("OK".equals(reg.getRefundResult())){ + return Result.error("已退费,请不要重复退费"); + } + + if (merchantEnum == null) { + return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo); + } + + log.info("{}[今日挂号][取消预约]开始退款:outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney); + + String pushInfo = "取消预约 科室:" + reg.getDeptName(); + + Result result = refundTodayRegister(merchantEnum, JsonResult, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime()); + + // 短信通知 + if (HospEnum.isHosp(HospEnum.德宏州中医医院)) { + String tel = reg.getTel(); + if (tel != null && tel.length() == 11) { + String template = "SMS_184121392"; + SmsRegTem sms = new SmsRegTem(); + sms.setTime(reg.getRegDate() + " " + reg.getBegTime() + "-" + reg.getEndTime()); + sms.setDeptName(reg.getDeptName()); + sms.setDoctorName(reg.getDoctName()); + sms.setAddress(reg.getAddress()); + sms.setSeq(reg.getQueueNum()); + + SmsHelper.send(template, tel, sms); + } + } + MessagePushConfig.regCancelPush(merchantEnum, reg); + + if (result.isSuccess()) { + result.setMessage(merchantEnum.NAME + "取消成功,挂号费用将在24小时内退回!"); // 修改返回提示的信息 + } + + if (MerchantEnum.ALI.equals(merchantEnum)) { + + String link = "pages/center/components/remordList/reserve"; + + String title = "预约挂号取消 " + reg.getDeptName(); + AliMessageHelper.hospitalOrder(reg.getOpenid(), title, AliMsgEnum.MERCHANT_CLOSED, reg.getUpdateTime(), false, reg.getTotalFee(), outTradeNo, reg.getRegDate(), reg.getBegTime(), reg.getDeptCode(), reg.getDeptName(), reg.getDoctName(), + AliHelper.getLink(link, null)); + } + return result; + } + /** * 挂号手动退费 @@ -579,6 +656,17 @@ public class RegService { * @param hisResult 记录信息 */ public Result regAutoRefund(MerchantEnum merchantEnum, JsonResult JsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate) { + log.info("[预约挂号/挂号失败自动退费][开始退费]---merchantEnum-{},JsonResult-{},openid-{},totalFee-{},outTradeNo-{},tradeNo-{},hisResult-{},pushInfo-{},tradeDate-{}",merchantEnum,JsonResult,openid,totalFee,outTradeNo,tradeNo,hisResult,pushInfo,tradeDate); + return regRefund(merchantEnum,JsonResult,openid,totalFee,outTradeNo,tradeNo,hisResult,pushInfo,tradeDate,false); + } + + public Result refundTodayRegister(MerchantEnum merchantEnum, JsonResult JsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate){ + log.info("[今日挂号][开始退费]---merchantEnum-{},JsonResult-{},openid-{},totalFee-{},outTradeNo-{},tradeNo-{},hisResult-{},pushInfo-{},tradeDate-{}",merchantEnum,JsonResult,openid,totalFee,outTradeNo,tradeNo,hisResult,pushInfo,tradeDate); + return regRefund(merchantEnum,JsonResult,openid,totalFee,outTradeNo,tradeNo,hisResult,pushInfo,tradeDate,true); + } + + + public Result regRefund(MerchantEnum merchantEnum, JsonResult JsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate,boolean isToday){ RegisterDao regDao = new RegisterDao(); String code = JsonResult.getCode(); @@ -592,13 +680,15 @@ public class RegService { return Result.error("[挂号不退费]HIS请求超时"); } - // 如果HIS交过费返回true-->就不向下执行(自动退款) - String dateShort = DateGenerate.getStringDateShort(); - String paidTip = new HisAccountDao().isPaid(DateGenerate.getNextDay(dateShort, "-7"), DateGenerate.getNextDay(dateShort, "7"), tradeNo); - if (paidTip != null) { - log.info("[挂号][退费错误] paidTip={}, outTradeNo={}, tradeNo={}", paidTip, outTradeNo, tradeNo); - return Result.error(paidTip); - } + if(!isToday){ + // 如果HIS交过费返回true-->就不向下执行(自动退款) + String dateShort = DateGenerate.getStringDateShort(); + String paidTip = new HisAccountDao().isPaid(DateGenerate.getNextDay(dateShort, "-7"), DateGenerate.getNextDay(dateShort, "7"), tradeNo); + if (paidTip != null) { + log.info("[挂号][退费错误] paidTip={}, outTradeNo={}, tradeNo={}", paidTip, outTradeNo, tradeNo); + return Result.error(paidTip); + } + } String refundResult; if (totalFee.compareTo(BigDecimal.ZERO) != 0) { // 金为0 diff --git a/src/main/java/com/ynxbd/wx/servlet/test/RefundTest.java b/src/main/java/com/ynxbd/wx/servlet/test/RefundTest.java new file mode 100644 index 0000000..0a55e24 --- /dev/null +++ b/src/main/java/com/ynxbd/wx/servlet/test/RefundTest.java @@ -0,0 +1,17 @@ +package com.ynxbd.wx.servlet.test; + +import com.ynxbd.wx.wxfactory.WxPayHelper; + +import java.math.BigDecimal; + +/** + * @author 李进才 + * @ClassName RefundTest + * @Description TODO + * @date 2023/12/20 11:51:00 + */ +public class RefundTest { + public static void main(String[] args) { + WxPayHelper.refund("WX34361d8ce54248773cf9acf4bdf8", "4200002138202312203358207528", new BigDecimal("0.800"), new BigDecimal("0.800"), "手动退费"); + } +} diff --git a/src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java b/src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java index aa474b7..72b4ac6 100644 --- a/src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java +++ b/src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java @@ -25,7 +25,7 @@ public class RefundTestServlet extends BaseServlet { if (i == 0) { i++; // 1 - WxPayHelper.refund("WXa2461a129809408f98855b233f78", "4200001568202210073105718801C001", new BigDecimal("0.24"), new BigDecimal("0.24"), "批次编号:20043945妇科材料库“一次性使用无菌阴道扩张器中号A型轴转式”的库存为2已不足执行2个过程失败!"); + WxPayHelper.refund("WX66ac39360f1245abb138ef932e78", "4200002102202312207984632409", new BigDecimal("0.800"), new BigDecimal("0.800"), "手动退费"); // 2 } diff --git a/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java b/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java index b936021..79602ae 100644 --- a/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java +++ b/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java @@ -20,7 +20,7 @@ public class DesEncryptHelper { public static void main(String[] args) { String s = enCode("oeso-t62kkoRwLVVkSkwmmjPfUXk"); - String a= deCode("CF9810D012B475160230870349C6CE4D2AC51B0337640E0607DE6D536EBF9B7793FB12F6871356772FC721D2DE4BCF5E6B182EEFD24EC126D2BDA7639A3777A6E37D2699575F23F0645B81DE2224E1342F5C65AEFE133B3DED63CEF161F1772CEB46D1D447D194ACAF7103055F9C4F12FEFF8750524AC698E0E06CF7829216A59C43992E5BD876FC"); + String a= deCode("63E55CC1CC18DA5DF786FA985D60BCF5E7CD1F925928AB92E75F00E16C14D180C3EEC068D96124953A20B27E5F673E9417F5E3B8B29B116B29B10E1B611BDCBC37D5916AA86830CCF1E9BEDBD4CB1642E174481814738DECC875FA26781DC6546AAA205CE74F3B6A284E738AC3D0D2B60DCB8B29E78277798B0639BE9CC546A9479819B0095698BB"); System.out.println(a); } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java index 55ba92e..52b0192 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java @@ -21,7 +21,7 @@ public class ReqParamHelper { } public static void main(String[] args) { - System.out.println(encode("30124039")); + System.out.println(encode("11269420")); System.out.println(decode("5AE40D74FFF8C3F14A0491F8824C61EE")); } } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java index ea77a03..ac8db82 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java @@ -2,6 +2,7 @@ package com.ynxbd.wx.wxfactory.utils; import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.JsonHelper; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; @@ -17,6 +18,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; +@Slf4j public class WxSignHelper { // 签名类型 final public static String SIGN_TYPE_MD5 = "MD5"; @@ -44,6 +46,7 @@ public class WxSignHelper { if (signType == null) { signType = SIGN_TYPE_MD5; } + log.info("[医保]签名前参数:paramsStr-{}",paramsStr + "&key=" + key); if (SIGN_TYPE_HMAC_SHA256.equalsIgnoreCase(signType)) { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); diff --git a/src/main/resources/apiclient_cert.p12 b/src/main/resources/apiclient_cert.p12 new file mode 100644 index 0000000000000000000000000000000000000000..c007e1d2d160e2cabef71b83359f3b904130425c GIT binary patch literal 2750 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/medical.properties b/src/main/resources/medical.properties index 7f5ee2c..b398b55 100644 --- a/src/main/resources/medical.properties +++ b/src/main/resources/medical.properties @@ -24,4 +24,4 @@ medical.partner_secret=f92df3128382757425ba4c5ca166688f medical.channel=aaghgf2i4ddgrokh247fgo7n # 医保支付签名key(3.公众号-->城市服务-->医保支付功能开通后-->邮件提供)---------------------------------------- -medical.pay_key=8597ea3c46c4f57dbbd7db68860ac1eb \ No newline at end of file +medical.pay_key=9baafa056ad046ebf4fafc2b80c17df6 \ No newline at end of file diff --git a/src/main/resources/wx.properties b/src/main/resources/wx.properties index c5f2131..29083f5 100644 --- a/src/main/resources/wx.properties +++ b/src/main/resources/wx.properties @@ -7,14 +7,25 @@ #wx.baseURL=http://www.dljcxrmyy.com/wx/ #wx.webPath=/web -wx.appId=wx64cc4b42bbed4090 -wx.appSecret=7d5d713378e7885c5186c739ba1bcf0c +#wx.appId=wx64cc4b42bbed4090 +#wx.appSecret=7d5d713378e7885c5186c739ba1bcf0c +#wx.token=ynxbd +#wx.aesKey=s3ib5r9aE7VtICXjrix0zi9cZ2bipshqh4gzXkjJoh0 +#wx.mchId=1528789611 +#wx.mchKey=mzsrmyyWxPay8989328291232KAG8392 +#wx.baseURL=http://wx.mzsrmyy.net/wx/ +#wx.webPath=/web +#wx.password=ynxbd@6910 +## 开启处方预结算(第2开关)(注意该配置需联系HIS开发者确认支持才能开启,否则存在风险!) +#wx.is_recipe_prepay=true + +# 芒市妇幼配置 +wx.appId=wx7d33a52af019f134 +wx.appSecret=56ac2bc26672f05f06d6c557d978c0b1 wx.token=ynxbd -wx.aesKey=s3ib5r9aE7VtICXjrix0zi9cZ2bipshqh4gzXkjJoh0 -wx.mchId=1528789611 -wx.mchKey=mzsrmyyWxPay8989328291232KAG8392 -wx.baseURL=http://wx.mzsrmyy.net/wx/ +wx.aesKey=SvUOQUIaawWoB6ptViNqcYkrTs1bmq5cbhiBglhtkct +wx.mchId=1605084861 +wx.mchKey=MsfyBJ8871934EKFJA03jdslkfajAaBC +wx.baseURL=http://www.msfyy.com/wx/ wx.webPath=/web -wx.password=ynxbd@6910 -# 开启处方预结算(第2开关)(注意该配置需联系HIS开发者确认支持才能开启,否则存在风险!) -wx.is_recipe_prepay=true \ No newline at end of file +wx.password=ynxbd@6910 \ No newline at end of file