diff --git a/src/main/java/com/ynxbd/common/TestA.java b/src/main/java/com/ynxbd/common/TestA.java index 0798101..03990c7 100644 --- a/src/main/java/com/ynxbd/common/TestA.java +++ b/src/main/java/com/ynxbd/common/TestA.java @@ -1,23 +1,19 @@ package com.ynxbd.common; -import cn.hutool.core.util.HexUtil; -import com.ynxbd.common.helper.common.RSAHelper; - -import javax.crypto.Cipher; -import java.io.ByteArrayOutputStream; -import java.nio.charset.StandardCharsets; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.X509EncodedKeySpec; -import java.util.Base64; +import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm; +import cn.hutool.crypto.asymmetric.RSA; public class TestA { private static final String PUB_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5klqI5STWTcbfjR093j+hvCEjNlZMQscIJg8jxZGqKW84AdFmSqPWEPu9ilqP+QUASiVSZ1QevGr2DWODFZ8Zw35aDA2bqCEprUx81gDdVPO7H7Bij+r8zAg8fT2c0Bi5rFq0xWMEQiTI+CyWwc5prOpquJU/P5yauEAdkRzlDwIDAQAB"; public static void main(String[] args) throws Exception{ - String content = "533103198212184014"; - byte[] bytes = RSAHelper.enBytePKCS1Padding(content, PUB_KEY); - System.out.println("【Java最终hex】:" + HexUtil.encodeHexStr(bytes)); +// String content = "533103198212184014"; +// byte[] bytes = RSAHelper.enPKCS1PaddingToByte(content, PUB_KEY); +// System.out.println("【Java最终hex】:" + HexUtil.encodeHexStr(bytes)); +// RSA rsa = new RSA(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), +// "你的私钥base64", +// "你的公钥base64"); + } // diff --git a/src/main/java/com/ynxbd/common/action/AccountsAction.java b/src/main/java/com/ynxbd/common/action/AccountsAction.java index dd14ec4..963e880 100644 --- a/src/main/java/com/ynxbd/common/action/AccountsAction.java +++ b/src/main/java/com/ynxbd/common/action/AccountsAction.java @@ -187,16 +187,16 @@ public class AccountsAction extends BaseAction { if (begDate == null || endDate == null) { return Result.error(ResultEnum.PARAM_DATE_ERROR); } - JsonResult JsonResult = new HisAccountDao().getTransactionByFPNum(invoiceNum, begDate, endDate, dateType, isContainsRefund); - if (JsonResult.isTimeout()) { // 请求超时 + JsonResult resp = new HisAccountDao().getTransactionByFPNum(invoiceNum, begDate, endDate, dateType, isContainsRefund); + if (resp.isTimeout()) { // 请求超时 return Result.error(ResultEnum.INTERFACE_HIS_REQ_TIMEOUT); } - if (!JsonResult.success()) { - return Result.error(ResultEnum.INTERFACE_HIS_NO_DATA, JsonResult.getMessage()); + if (!resp.success()) { + return Result.error(ResultEnum.INTERFACE_HIS_NO_DATA, resp.getMessage()); } - List dataList = JsonResult.getDataMapList(HisTransaction.class, "Item"); + List dataList = resp.getDataMapList(HisTransaction.class, "Item"); if (dataList.isEmpty()) { return Result.error(ResultEnum.INTERFACE_HIS_INVOKE_ERROR); } diff --git a/src/main/java/com/ynxbd/common/action/ApiAction.java b/src/main/java/com/ynxbd/common/action/ApiAction.java index 4812548..cc4fe36 100644 --- a/src/main/java/com/ynxbd/common/action/ApiAction.java +++ b/src/main/java/com/ynxbd/common/action/ApiAction.java @@ -8,9 +8,9 @@ import com.ynxbd.common.bean.sms.SmsTemplate; import com.ynxbd.common.cache.GmcCacheManager; import com.ynxbd.common.config.interceptor.AesDecode; import com.ynxbd.common.helper.common.*; +import com.ynxbd.common.helper.rsa.RSAHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; -import com.ynxbd.common.result.ServiceException; import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.utils.DesEncryptHelper; import com.ynxbd.wx.wxfactory.AesWxHelper; @@ -19,6 +19,7 @@ import com.ynxbd.wx.wxfactory.WxFactory; import com.ynxbd.wx.wxfactory.base.auth.models.AccessToken; import com.ynxbd.wx.wxfactory.base.auth.models.QRCodeInfo; import com.ynxbd.wx.wxfactory.base.auth.models.WxVerifyId; +import com.ynxbd.wx.wxfactory.medical.WxMedConfig; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.struts2.convention.annotation.Action; @@ -106,7 +107,7 @@ public class ApiAction extends BaseAction { } Map data = new HashMap<>(); data.put("ticket", ticket); - data.put("appId", WeChatConfig.APP_ID); + data.put("appId", ObjectUtils.isEmpty(WxMedConfig.MD_APP_ID) ? WeChatConfig.APP_ID : WxMedConfig.MD_APP_ID); return Result.success(data); } @@ -125,6 +126,7 @@ public class ApiAction extends BaseAction { } WxVerifyId info = WxFactory.Base.OAuth().getVerifyId(openid, certName, certNo); + info.setAppId(ObjectUtils.isEmpty(WxMedConfig.MD_APP_ID) ? WeChatConfig.APP_ID : WxMedConfig.MD_APP_ID); // 服务号appid return Result.success(info); } catch (Exception e) { return Result.error(e); @@ -137,14 +139,13 @@ public class ApiAction extends BaseAction { @Action("queryVerifyInfo") public Result queryVerifyInfo(@AesDecode String openid, String outSeqNo, String verifyId, String certHash) { try { - log.info("[获取用户人脸核身会话唯一标识]openid={}, outSeqNo={}, verifyId={}, certHash={}", openid, outSeqNo, verifyId, certHash); - if (outSeqNo == null || verifyId == null || certHash == null) { - return Result.error(ResultEnum.PARAM_IS_INVALID); - } - + log.info("[查询用户人脸核身真实验证结果]openid={}, outSeqNo={}, verifyId={}, certHash={}", openid, outSeqNo, verifyId, certHash); if (openid == null) { return Result.error(ResultEnum.PARAM_IS_INVALID); } + if (outSeqNo == null || verifyId == null || certHash == null) { + return Result.error(ResultEnum.PARAM_IS_DEFECT); + } WxVerifyId info = WxFactory.Base.OAuth().queryVerifyInfo(openid, outSeqNo, verifyId, certHash); return Result.success(info); diff --git a/src/main/java/com/ynxbd/common/action/InHospAction.java b/src/main/java/com/ynxbd/common/action/InHospAction.java index 48bb7a1..50a9826 100644 --- a/src/main/java/com/ynxbd/common/action/InHospAction.java +++ b/src/main/java/com/ynxbd/common/action/InHospAction.java @@ -232,7 +232,7 @@ public class InHospAction extends BaseAction { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - JsonResult resp = new HisInHospDao().getInPatientFee(patientId, date); + JsonResult resp = new HisInHospDao().queryInPatientFee(patientId, date); if (!resp.success()) { return Result.error(resp.getMessage()); } @@ -271,7 +271,7 @@ public class InHospAction extends BaseAction { if (treatNum == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - JsonResult resp = new HisInHospDao().getOutHospTreatFee(treatNum); + JsonResult resp = new HisInHospDao().queryOutHospTreatFee(treatNum); if (!resp.success()) { return Result.error(resp.getMessage()); } diff --git a/src/main/java/com/ynxbd/common/action/QRAction.java b/src/main/java/com/ynxbd/common/action/QRAction.java index 6791913..0f4ae94 100644 --- a/src/main/java/com/ynxbd/common/action/QRAction.java +++ b/src/main/java/com/ynxbd/common/action/QRAction.java @@ -3,7 +3,7 @@ package com.ynxbd.common.action; import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.helper.common.QRCodeHelper; -import com.ynxbd.common.helper.common.RSAHelper; +import com.ynxbd.common.helper.rsa.RSAHelper; import com.ynxbd.common.result.Result; import com.ynxbd.wx.config.WeChatConfig; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/ynxbd/common/action/RecipeAction.java b/src/main/java/com/ynxbd/common/action/RecipeAction.java index e1e2788..ca7ae93 100644 --- a/src/main/java/com/ynxbd/common/action/RecipeAction.java +++ b/src/main/java/com/ynxbd/common/action/RecipeAction.java @@ -332,7 +332,7 @@ public class RecipeAction extends BaseAction { // } // // // 开申请单 -// JsonResult JsonResult = new HisRecipeDao().payNat(patientId, isDoubleCollect); +// JsonResult jsonResult = new HisRecipeDao().payNat(patientId, isDoubleCollect); // if (JsonResult.isTimeout()) { // 请求超时 // return Result.error(JsonResult.getMessage()); // } diff --git a/src/main/java/com/ynxbd/common/action/XBDAction.java b/src/main/java/com/ynxbd/common/action/XBDAction.java index 123d6d6..dc787a1 100644 --- a/src/main/java/com/ynxbd/common/action/XBDAction.java +++ b/src/main/java/com/ynxbd/common/action/XBDAction.java @@ -1,7 +1,5 @@ package com.ynxbd.common.action; -import cn.hutool.core.util.HexUtil; -import cn.hutool.crypto.asymmetric.RSA; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ynxbd.common.action.base.BaseAction; @@ -10,9 +8,7 @@ import com.ynxbd.common.bean.pay.PayCasebook; import com.ynxbd.common.bean.xbd.MRHistory; import com.ynxbd.common.bean.xbd.MedicalRecord; import com.ynxbd.common.config.interceptor.AesDecode; -import com.ynxbd.common.helper.common.Base64Helper; import com.ynxbd.common.helper.common.JsonHelper; -import com.ynxbd.common.helper.common.RSAHelper; import com.ynxbd.common.helper.xbd.XBDEnum; import com.ynxbd.common.helper.xbd.XbdConfigHelper; import com.ynxbd.common.helper.xbd.XBDHttpHelper; @@ -28,7 +24,6 @@ import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; import java.util.List; /** diff --git a/src/main/java/com/ynxbd/common/action/healthcard/HCReportAction.java b/src/main/java/com/ynxbd/common/action/healthcard/HCReportAction.java index 7cc4a32..cc44c10 100644 --- a/src/main/java/com/ynxbd/common/action/healthcard/HCReportAction.java +++ b/src/main/java/com/ynxbd/common/action/healthcard/HCReportAction.java @@ -80,7 +80,7 @@ public class HCReportAction extends BaseAction { headers.add("god-portal-timestamp", config.getTimestamp()); headers.add("god-portal-request-id", requestId); }); - log.info("[报告解读] msgId={}, patientId={}, reportId={}, resp={}", msgId, patientId, reportId, jsonObject); + log.info("[报告解读]返回 msgId={}, patientId={}, reportId={}, resp={}", msgId, patientId, reportId, jsonObject); return Result.success(); } } diff --git a/src/main/java/com/ynxbd/common/action/HealthCardAction.java b/src/main/java/com/ynxbd/common/action/healthcard/HealthCardAction.java similarity index 80% rename from src/main/java/com/ynxbd/common/action/HealthCardAction.java rename to src/main/java/com/ynxbd/common/action/healthcard/HealthCardAction.java index 5df0c13..3af358a 100644 --- a/src/main/java/com/ynxbd/common/action/HealthCardAction.java +++ b/src/main/java/com/ynxbd/common/action/healthcard/HealthCardAction.java @@ -1,4 +1,4 @@ -package com.ynxbd.common.action; +package com.ynxbd.common.action.healthcard; import com.alibaba.fastjson.JSONObject; import com.ynxbd.common.action.base.BaseAction; @@ -12,7 +12,11 @@ import com.ynxbd.common.helper.common.ValidHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.service.PatientService; +import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.wxfactory.AesWxHelper; +import com.ynxbd.wx.wxfactory.WxFactory; +import com.ynxbd.wx.wxfactory.base.auth.models.WxVerifyId; +import com.ynxbd.wx.wxfactory.medical.WxMedConfig; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.struts2.convention.annotation.Action; @@ -206,7 +210,7 @@ public class HealthCardAction extends BaseAction { info.setEnOpenId(enOpenId); info.setEnUnionId(enUnionId); info.setEnGmcOpenId(enGmcOpenId); - return new PatientService().bindCard(request, false, true, isAreaCode,true, info); + return new PatientService().bindCard(request, false, true, isAreaCode, true, info); } @@ -242,6 +246,26 @@ public class HealthCardAction extends BaseAction { } } + @Action("registerRealPersonAuthOrder") + public Result registerRealPersonAuthOrder(Boolean isMiniApp, @AesDecode String openid, @AesDecode String idCardNo, @AesDecode String name, String wechatCode, String orderId, String verifyResult, Integer verifyType) { + try { + log.info("[电子健康卡]实人认证生成orderId isMiniApp={}, openid={}, wechatCode={}, orderId={}, name={}, idCardNo={}, verifyResult={}, verifyType={}", + isMiniApp, openid, wechatCode, orderId, name, idCardNo, verifyResult, verifyType); + if (openid == null || idCardNo == null || name == null) { + return Result.error(ResultEnum.PARAM_IS_INVALID); + } + if (wechatCode == null || orderId == null) { + return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 + } + + JSONObject dataJson = HealthCardHelper.registerRealPersonAuthOrder(isMiniApp, openid, wechatCode, orderId, idCardNo, name, verifyResult, verifyType); + return Result.success(dataJson); + } catch (Exception e) { + return Result.error(e); + } + } + + @Action("checkUniformVerifyResult") public Result checkUniformVerifyResult(Boolean isMiniApp, @AesDecode String openid, String orderId, String registerOrderId) { log.info("[电子健康卡]实人认证结果查询 isMiniApp={}, openid={}, orderId={}, registerOrderId={}", isMiniApp, openid, orderId, registerOrderId); @@ -251,6 +275,38 @@ public class HealthCardAction extends BaseAction { return Result.isOK(HealthCardHelper.checkUniformVerifyResult(isMiniApp, openid, orderId, registerOrderId)); } + /** + * [电子健康卡]获取用户人脸核身会话唯一标识 + */ + @Action("getVerifyIdByHC") + public Result getVerifyIdByHC(Boolean isMiniApp, @AesDecode String openid, String orderId, Integer verifyType) { + try { + log.info("[电子健康卡]获取用户人脸核身会话唯一标识 isMiniApp={}, openid={}, orderId={}, verifyType={}", isMiniApp, openid, orderId, verifyType); + if (orderId == null || verifyType == null || openid == null) { + return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 + } + + WxVerifyId userInfo = HealthCardHelper.getOrderInfoByOrderId(isMiniApp, openid, orderId, verifyType); + if (userInfo == null) { + return Result.error("[电子健康卡]实人用户信息获取失败"); + } + String certNo = userInfo.getCertNo(); + String certName = userInfo.getCertName(); + if (ObjectUtils.isEmpty(certNo) || ObjectUtils.isEmpty(certName)) { + return Result.error("[电子健康卡]实人用户信息缺失"); + } + + WxVerifyId info = WxFactory.Base.OAuth().getVerifyId(openid, certName, certNo); + info.setAppId(WeChatConfig.APP_ID); // 服务号appid + info.setCertNo(AesWxHelper.encode(certName)); + info.setCertName(AesWxHelper.encode(certName)); + return Result.success(info); + } catch (Exception e) { + return Result.error(e); + } + } + + /** * 健康卡[上报数据] * 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 ae96ade..dca362e 100644 --- a/src/main/java/com/ynxbd/common/action/pay/PayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/PayAction.java @@ -13,6 +13,7 @@ import com.ynxbd.common.dao.his.HisRecipeDao; import com.ynxbd.common.dao.sys.SysUserDao; import com.ynxbd.common.helper.common.*; import com.ynxbd.common.helper.his.HisHelper; +import com.ynxbd.common.helper.rsa.RSAHelper; import com.ynxbd.common.helper.xbd.XbdConfigHelper; import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.Result; @@ -619,18 +620,18 @@ public class PayAction extends BaseAction { } // 开申请单 - JsonResult JsonResult = new HisRecipeDao().createSelfHelp(patientId, pageNum, seq, cardNo); - if (JsonResult.isTimeout()) { - return Result.error(JsonResult.getMessage()); + JsonResult result = new HisRecipeDao().createSelfHelp(patientId, pageNum, seq, cardNo); + if (result.isTimeout()) { + return Result.error(result.getMessage()); } - if (!JsonResult.success()) { // 重复开单 - return Result.error(ResultEnum.RECIPE_REPEAT_BILL, null, JsonResult.getMessage()); + if (!result.success()) { // 重复开单 + return Result.error(ResultEnum.RECIPE_REPEAT_BILL, null, result.getMessage()); } Map resultData = new HashMap<>(); - Map dataMap = JsonResult.getDataMap(); - String recipeId = JsonResult.getDataMapString("RecipeId"); + Map dataMap = result.getDataMap(); + String recipeId = result.getDataMapString("RecipeId"); if (ObjectUtils.isEmpty(recipeId)) { return Result.error(ResultEnum.INTERFACE_HIS_INVOKE_ERROR); } diff --git a/src/main/java/com/ynxbd/common/bean/enums/WxFaceEnum.java b/src/main/java/com/ynxbd/common/bean/enums/WxFaceEnum.java new file mode 100644 index 0000000..f47438f --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/enums/WxFaceEnum.java @@ -0,0 +1,36 @@ +package com.ynxbd.common.bean.enums; + +import lombok.ToString; + +@ToString +public enum WxFaceEnum { + E40003(40003, "[认证失败]openid无效"), + E84010(84010, "缺少out_seq_no 参数"), + E84011(84011, "out_seq_no 格式无效"), + E84012(84012, "缺少cert_info参数"), + E84013(84013, "证件类型无效"), + E84014(84014, "证件姓名无效"), + E84015(84015, "证件号码无效"), + E84016(84016, "缺少openid参数"), + E84019(84019, "out_seq_no 已存在,请更换新的 out_seq_no"); + + public final Integer code; + public final String msg; + + WxFaceEnum(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public static WxFaceEnum findEnum(Integer code) { + if (code == null) { + return null; + } + for (WxFaceEnum value : values()) { + if (value.code.equals(code)) { + return value; + } + } + return null; + } +} diff --git a/src/main/java/com/ynxbd/common/bean/xk/HisRxAdmRoute.java b/src/main/java/com/ynxbd/common/bean/xk/HisRxAdmRoute.java new file mode 100644 index 0000000..cd3acce --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/xk/HisRxAdmRoute.java @@ -0,0 +1,20 @@ +package com.ynxbd.common.bean.xk; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +// 给要途径字典 +@Setter +@Getter +@ToString +@NoArgsConstructor +public class HisRxAdmRoute { + // Code 编码 + private String code; + // Name 名称 + private String name; + // PYM 拼音码 + private String pym; +} diff --git a/src/main/java/com/ynxbd/common/bean/xk/HisRxDrug.java b/src/main/java/com/ynxbd/common/bean/xk/HisRxDrug.java new file mode 100644 index 0000000..658712c --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/xk/HisRxDrug.java @@ -0,0 +1,50 @@ +package com.ynxbd.common.bean.xk; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +// 药品 +@Setter +@Getter +@ToString +@NoArgsConstructor +public class HisRxDrug { + // Code 商品代码 + private String code; + // Name 商品名称 + private String name; + // ProductPlace 产地 + private String productPlace; + // UnitName 单位名称 + private String unitName; + // UnitName 最小单位名称 + private String minUnitName; + // Persent 批零比 + private Double persent; + // YPJL 药品剂量 + private Double ypjl; + // YPJL_Unit 药品剂量单位 + private String ypjlUnit; + // Price 零售单价 + private Double price; + // Count 库存数量 + private Integer count; + // YFCode 药房代码 + private String yfCode; + // YFName 药房名称 + private String yfName; + // GOODSID 批次号 + private String goodsId; + // Indate 效期 + private String indate; + // KMCode 财务科目代码 + private String kmCode; + // KMName 财务科目名称 + private String kmName; + // YBLB 医保类别 + private String yblb; + // YBLBName 医保类别名称 + private String yblbName; +} diff --git a/src/main/java/com/ynxbd/common/bean/xk/HisRxPharmDict.java b/src/main/java/com/ynxbd/common/bean/xk/HisRxPharmDict.java new file mode 100644 index 0000000..08d1537 --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/xk/HisRxPharmDict.java @@ -0,0 +1,18 @@ +package com.ynxbd.common.bean.xk; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +// 药房字典 +@Setter +@Getter +@ToString +@NoArgsConstructor +public class HisRxPharmDict { + // Code 编码 + private String code; + // Name 名称 + private String name; +} diff --git a/src/main/java/com/ynxbd/common/bean/xk/HisRxUseCount.java b/src/main/java/com/ynxbd/common/bean/xk/HisRxUseCount.java new file mode 100644 index 0000000..f7e2c2f --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/xk/HisRxUseCount.java @@ -0,0 +1,23 @@ +package com.ynxbd.common.bean.xk; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Setter +@Getter +@ToString +@NoArgsConstructor +public class HisRxUseCount { + // Code 编码 + private String code; + // Name 名称 + private String name; + // CountForDay 一天使用次数 + private Integer countForDay; + // CountForWeek 一周使用次数 + private Integer countForWeek; + // PYM 拼音码 + private String pym; +} diff --git a/src/main/java/com/ynxbd/common/dao/his/HisAccountDao.java b/src/main/java/com/ynxbd/common/dao/his/HisAccountDao.java index e2259d0..27326c7 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisAccountDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisAccountDao.java @@ -78,12 +78,12 @@ public class HisAccountDao { * @param tradeNo HIS交易流水号 */ public String isPaid(String begDate, String endDate, String tradeNo) { - JsonResult JsonResult = getTransaction(begDate, endDate, tradeNo, 0, 0); - if (JsonResult.success()) { // 已记账不退费 + JsonResult result = getTransaction(begDate, endDate, tradeNo, 0, 0); + if (result.success()) { // 已记账不退费 // JsonResult.setMessage("His已记账"); return "His已记账"; } - if (JsonResult.isTimeout()) { // 超时不退费 + if (result.isTimeout()) { // 超时不退费 return "His请求异常"; } return null; diff --git a/src/main/java/com/ynxbd/common/dao/his/HisInHospDao.java b/src/main/java/com/ynxbd/common/dao/his/HisInHospDao.java index 8143f23..1c47891 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisInHospDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisInHospDao.java @@ -71,7 +71,7 @@ public class HisInHospDao { * @param patientId 患者id * @return 住院费用清单 */ - public JsonResult getInPatientFee(String patientId, String date) { + public JsonResult queryInPatientFee(String patientId, String date) { return HisHelper.getJsonResult(HisEnum.AP_Query_InpatientFee, params -> { params.put("PatientID", patientId); params.put("FeeDate", date == null ? "" : date); @@ -79,7 +79,7 @@ public class HisInHospDao { } /** - * 通过患者ID查询住院记录 + * [住院记录]通过患者ID查询(出院后) * * @param patientId 患者id * @return 住院记录 @@ -88,11 +88,17 @@ public class HisInHospDao { return HisHelper.getJsonResult(HisEnum.Query_OutPatientRecords, params -> { params.put("PatientID", patientId); params.put("CallNo", HisHelper.WECHAT_CALL_NO); - params.put("YDZF", ObjectUtils.isEmpty(hisYBZF) ? "" : hisYBZF); // 1查询医保 + params.put("YDZF", ObjectUtils.isEmpty(hisYBZF) ? "" : hisYBZF); // [住院]医保 }); } - public JsonResult getOutHospTreatFee(String treatNum) { + /** + * [住院]通过住院号查询费用明细(出院后) + * + * @param treatNum 住院号 + * @return 费用 + */ + public JsonResult queryOutHospTreatFee(String treatNum) { return HisHelper.getJsonResult(HisEnum.Query_OutHospTreatFee, params -> { params.put("ZYNum", treatNum); params.put("CallNo", HisHelper.WECHAT_CALL_NO); diff --git a/src/main/java/com/ynxbd/common/dao/his/HisMedDao.java b/src/main/java/com/ynxbd/common/dao/his/HisMedDao.java index 2faaab9..69d9168 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisMedDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisMedDao.java @@ -303,17 +303,17 @@ public class HisMedDao { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - JsonResult JsonResult = HisMedHelper.getJsonResult(MerchantEnum.WX_MEDICAL, HisEnum.Medical_Insurance_Bill, params -> { + JsonResult result = HisMedHelper.getJsonResult(MerchantEnum.WX_MEDICAL, HisEnum.Medical_Insurance_Bill, params -> { params.put("QueryNumType", queryNumType); params.put("QueryNumber", queryNumber); params.put("BegDate", begDate); params.put("EndDate", endDate); }); - if (JsonResult.success()) { - JSONArray resultList = JsonResult.getJsonArray("SettlementInfo", "Item"); + if (result.success()) { + JSONArray resultList = result.getJsonArray("SettlementInfo", "Item"); return Result.success(resultList); } - return Result.error(JsonResult.getMessage()); + return Result.error(result.getMessage()); } /** diff --git a/src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java b/src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java index e2c7fec..74ef317 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java @@ -78,18 +78,18 @@ public class HisPatientDao { params.put("GuardianMotherTel", motherTel); params.put("GuardianMotherIdCard", motherIdCardNo); } - JsonResult JsonResult = HisHelper.getJsonResult(HisEnum.AP_Binding_Card, params); - Patient patient = JsonResult.dataMapToBean(Patient.class); + JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Binding_Card, params); + Patient patient = result.dataMapToBean(Patient.class); if (patient == null) { - throw new ServiceException(JsonResult.getMessage()); + throw new ServiceException(result.getMessage()); } String patientId = patient.getPatientId(); if (patientId == null) { - throw new ServiceException(JsonResult.getMessage()); + throw new ServiceException(result.getMessage()); } if (patientId.equals(cardNo)) { // 绑定失败返回卡号 - throw new ServiceException(JsonResult.getMessage()); + throw new ServiceException(result.getMessage()); } patient.setHisPatientId(patientId); return patient; 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 aaca86f..fb2d9ba 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java @@ -556,12 +556,12 @@ public class HisRegisterDao { params.put("MZNum", null); params.put("RegistDate", regDate); - JsonResult JsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Regist, params); - if (!JsonResult.success()) { + JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Query_Regist, params); + if (!result.success()) { return resultList; } - JSONArray jsonArray = JsonResult.getJsonArray("Reg"); + JSONArray jsonArray = result.getJsonArray("Reg"); Register reg; BigDecimal payMoney; JSONObject node; @@ -613,12 +613,12 @@ public class HisRegisterDao { params.put("ReservationTransNo", ""); params.put("AfterTodayFlag", "0"); - JsonResult JsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Reservation, params); - if (!JsonResult.success()) { + JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Query_Reservation, params); + if (!result.success()) { return resultList; } - JSONArray jsonArray = JsonResult.getJsonArray("Reservation"); + JSONArray jsonArray = result.getJsonArray("Reservation"); Register reg; JSONObject node; BigDecimal regFee, clinicFee; @@ -748,13 +748,13 @@ public class HisRegisterDao { params.put("RegistEndDate", endDate); params.put("CanRegistFlag", "1"); // [空或0为所有科室; 1:返回有号源的科室] - JsonResult JsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Dept_New, params); - if (!JsonResult.success()) { - log.info("[分时段挂号]查询科室列表 {}", JsonResult.getMessage()); + JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Query_Dept_New, params); + if (!result.success()) { + log.info("[分时段挂号]查询科室列表 {}", result.getMessage()); return deptList; } - JSONArray jsonArray = JsonResult.getJsonArray("Dept"); + JSONArray jsonArray = result.getJsonArray("Dept"); Dept dept; JSONObject nodeItem; @@ -826,15 +826,15 @@ public class HisRegisterDao { params.put("DeptCode_YZKCode", subDeptCode); // 亚专科code } - JsonResult JsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Doct_New, params); + JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Query_Doct_New, params); List resultList = new ArrayList<>(); - if (!JsonResult.success()) { - log.info("[医生-分时段查询]{}", JsonResult.getMessage()); + if (!result.success()) { + log.info("[医生-分时段查询]{}", result.getMessage()); return resultList; } - JSONArray deptJsonList = JsonResult.getJsonArray("Dept"); + JSONArray deptJsonList = result.getJsonArray("Dept"); JSONObject deptJson, doctorJson; String deptName; Doctor doctorItem; diff --git a/src/main/java/com/ynxbd/common/dao/his/HisXKDao.java b/src/main/java/com/ynxbd/common/dao/his/HisXKDao.java new file mode 100644 index 0000000..dfe4486 --- /dev/null +++ b/src/main/java/com/ynxbd/common/dao/his/HisXKDao.java @@ -0,0 +1,38 @@ +package com.ynxbd.common.dao.his; + +import com.ynxbd.common.bean.xk.HisRxAdmRoute; +import com.ynxbd.common.bean.xk.HisRxDrug; +import com.ynxbd.common.bean.xk.HisRxPharmDict; +import com.ynxbd.common.bean.xk.HisRxUseCount; +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.ServiceException; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class HisXKDao { + + public List queryHisRxDict(String type) { + JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.HIS_XK_RX_DICT, params -> { + params.put("Flag", type); // 1:用药频次字典; 2:给要途径字典; 3:药房字典; 4:药品 + }); + if ("1".equals(type)) { // 用药频次字典 + return jsonResult.getDataMapList(HisRxUseCount.class, "Items", "Item"); + } + if ("2".equals(type)) { // 给要途径字典 + return jsonResult.getDataMapList(HisRxAdmRoute.class, "Items", "Item"); + } + if ("3".equals(type)) { // 药房字典 + return jsonResult.getDataMapList(HisRxPharmDict.class, "Items", "Item"); + } + if ("4".equals(type)) { // 药品 + return jsonResult.getDataMapList(HisRxDrug.class, "Items", "Item"); + } + return new ArrayList<>(); + } + +} diff --git a/src/main/java/com/ynxbd/common/helper/HealthCardHelper.java b/src/main/java/com/ynxbd/common/helper/HealthCardHelper.java index aac1690..2e90e7f 100644 --- a/src/main/java/com/ynxbd/common/helper/HealthCardHelper.java +++ b/src/main/java/com/ynxbd/common/helper/HealthCardHelper.java @@ -15,6 +15,7 @@ import com.ynxbd.common.helper.common.URLHelper; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ServiceException; import com.ynxbd.wx.config.WeChatConfig; +import com.ynxbd.wx.wxfactory.base.auth.models.WxVerifyId; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -70,7 +71,7 @@ public class HealthCardHelper { } // 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage - String faceUrl = isMiniApp ? "/path/to/facePage" : null; + String faceUrl = isMiniApp ? "/path/to/facePage" : (webURL + "h-face-verify.html"); // 放弃验证回调页 String verifyFailRedirectUrl = isMiniApp ? "mini:/path/to/isvpage" : (webURL + "health-card-fail.html?code=-1"); @@ -118,7 +119,8 @@ public class HealthCardHelper { String failRedirectUrl = isMiniApp ? "/path/to/isvpage??regInfoCode=${regInfoCode}" : (webURL + "health-card-form.html?regInfoCode=${regInfoCode}"); // 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage - String faceUrl = isMiniApp ? "/path/to/facePage" : null; + String faceUrl = isMiniApp ? "/path/to/facePage" : (webURL + "h-face-verify.html"); + // 放弃验证回调页 String verifyFailRedirectUrl = isMiniApp ? "mini:/path/to/isvpage" : (webURL + "health-card-fail.html?code=-2"); @@ -445,6 +447,7 @@ public class HealthCardHelper { String webURL = WeChatConfig.reqProtocolToWebURL(isHttps); String verifySuccessRedirectUrl = webURL + redirectPage + "?registerOrderId=${registerOrderId}" + redirectHash; String verifyFailRedirectUrl = webURL + "health-card-fail.html?code=-3"; + String faceUrl = isMiniApp ? "/path/to/facePage" : (webURL + "h-face-verify.html"); JSONObject resultJson = HealthCardConfig.createHealthCardService().registerUniformVerifyOrder(commonIn, idCardNo, @@ -458,7 +461,7 @@ public class HealthCardHelper { null, verifySuccessRedirectUrl, verifyFailRedirectUrl, - null, + faceUrl, 0); HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson); log.info("[电子健康卡]实人认证生成orderId resp: {}", JsonHelper.toJsonString(resultJson)); @@ -472,6 +475,73 @@ public class HealthCardHelper { return respJson; } + /** + * 实人验证结果通知接口 + */ + public static JSONObject registerRealPersonAuthOrder(Boolean isMiniApp, String openid, String wechatCode, String orderId, String idCard, String name, String verifyResult, Integer verifyType) throws ServiceException { + if (ObjectUtils.isEmpty(openid) || ObjectUtils.isEmpty(wechatCode) || ObjectUtils.isEmpty(orderId) || ObjectUtils.isEmpty(name) || ObjectUtils.isEmpty(idCard) || ObjectUtils.isEmpty(verifyResult) || verifyType == null) { + throw new ServiceException(ResultEnum.PARAM_IS_DEFECT); + } + + CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp, openid); + if (commonIn == null) { + throw new ServiceException("[电子健康卡]实人验证结果通知接口-请求体CommonIn缺失"); + } + + JSONObject resultJson = HealthCardConfig.createHealthCardService().registerRealPersonAuthOrder(commonIn, + orderId, wechatCode, idCard, "01", name, verifyResult, verifyType); + HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson); + log.info("[电子健康卡]实人验证结果通知接口 resp: {}", JsonHelper.toJsonString(resultJson)); + if (!result.isOk) { + throw new ServiceException("[电子健康卡]实人验证结果通知接口-失败:" + result.getJsonCommon()); + } + JSONObject respJson = result.getRsp(); + if (respJson == null) { + throw new ServiceException("[电子健康卡]实人验证结果通知接口-响应数据为空"); + } + return respJson; + } + + + /** + * 实人用户信息获取接口 + */ + public static WxVerifyId getOrderInfoByOrderId(Boolean isMiniApp, String openid, String orderId, Integer verifyType) { + try { + log.info("[电子健康卡]实人用户信息获取接口 openid={}, orderId={} verifyType={}", openid, orderId, verifyType); + if (ObjectUtils.isEmpty(orderId) || verifyType == null) { + return null; + } + CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp, openid); + if (commonIn == null) { + return null; + } + + JSONObject resultJson = HealthCardConfig.createHealthCardService().getOrderInfoByOrderId(commonIn, + orderId, + verifyType + ); + HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]实人用户信息获取接口失败: {}", resultJson); + return null; + } + JSONObject respJson = result.getRsp(); + if (respJson == null) { + return null; + } + + WxVerifyId info = new WxVerifyId(); + info.setCertNo(respJson.getString("idCard")); + info.setCertName(respJson.getString("name")); + info.setCertType(respJson.getString("cardType")); + return info; + } catch (Exception e) { + ErrorHelper.println(e); + } + return null; + } + /** * [电子健康卡]实人认证结果查询 */ diff --git a/src/main/java/com/ynxbd/common/helper/common/SmsHelper.java b/src/main/java/com/ynxbd/common/helper/common/SmsHelper.java index da33ea4..0c567fc 100644 --- a/src/main/java/com/ynxbd/common/helper/common/SmsHelper.java +++ b/src/main/java/com/ynxbd/common/helper/common/SmsHelper.java @@ -7,17 +7,14 @@ import com.ynxbd.common.bean.UsageCountEnum; import com.ynxbd.common.bean.sms.SmsTempEnum; import com.ynxbd.common.bean.sms.SmsTemplate; import com.ynxbd.common.config.EhCacheConfig; -import com.ynxbd.common.helper.ProperHelper; import com.ynxbd.common.helper.http.OkHttpHelper; -import com.ynxbd.common.result.Result; -import com.ynxbd.common.result.ResultEnum; +import com.ynxbd.common.helper.rsa.RSAHelper; import com.ynxbd.common.service.UsageCountService; import lombok.extern.slf4j.Slf4j; import okhttp3.FormBody; import okhttp3.RequestBody; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; import org.ehcache.Cache; import java.util.Date; diff --git a/src/main/java/com/ynxbd/common/helper/common/SmsRsaHelper.java b/src/main/java/com/ynxbd/common/helper/common/SmsRsaHelper.java index 3e7e6ce..7fde616 100644 --- a/src/main/java/com/ynxbd/common/helper/common/SmsRsaHelper.java +++ b/src/main/java/com/ynxbd/common/helper/common/SmsRsaHelper.java @@ -1,5 +1,7 @@ package com.ynxbd.common.helper.common; +import com.ynxbd.common.helper.rsa.RSAHelper; + public class SmsRsaHelper { // 公私钥 public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSOdXfNEpwP5AVJuDFqYObO73LH92cymsgiRlcSEvz2UDkYpn38qL1mRSCYoZ0O4CK/r1RJexPBE2lK6WF3+jgaOc5uV59OSwfOwqbLtOyjJi/V16fPTf5JCO/FbkM63d/mI7gnjR46P7rxbq60woCnRXAf1Nb/kAK+hQLrnX1swIDAQAB"; 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 5de0c88..60e8339 100644 --- a/src/main/java/com/ynxbd/common/helper/his/HisEnum.java +++ b/src/main/java/com/ynxbd/common/helper/his/HisEnum.java @@ -77,8 +77,8 @@ public enum HisEnum { Medical_QueryOrderStatus("[医保]查询医保结算信息", "40025", "YDZF_QueryOrderStatus", true), // 住院------------------------- - YDZF_UploadFeesInfo_ZY("[住院预交金][医保]6201上传费用明细 + 6202 支付下单", "4009", "YDZF_UploadFeesInfo_ZY", true), - YDZF_SaveToHIS_ZY("[住院预交金][医保]HIS结算(住院) 6301", "4010", "YDZF_SaveToHIS_ZY", true), + YDZF_UploadFeesInfo_ZY("[住院][医保]6201上传费用明细 + 6202 支付下单", "4009", "YDZF_UploadFeesInfo_ZY", true), + YDZF_SaveToHIS_ZY("[住院][医保]HIS结算(住院) 6301", "4010", "YDZF_SaveToHIS_ZY", true), AP_Query_Prepay("[住院]查询预交金缴费记录(出院后)", "5003", "AP_Query_Prepay", true), AP_Query_InpatientFee("[住院]查询住院费用清单(住院中)", "5004", "AP_Query_InpatientFee", true), @@ -122,6 +122,9 @@ public enum HisEnum { ADD_AUTH_AGENT("委托人信息[新增]","11004","UniversalInterface",true), UPDATE_AUTH_AGENT("委托人信息[修改]","11005","UniversalInterface",true), DELETE_AUTH_AGENT("委托人信息[删除]","11006","UniversalInterface",true), + + HIS_XK_RX_DICT("开方字典查询","13010","UniversalInterface",false), + HIS_XK_RX_CREATE("线上开方","13011","UniversalInterface",true), ; public final String NAME; diff --git a/src/main/java/com/ynxbd/common/helper/rsa/RSAEnum.java b/src/main/java/com/ynxbd/common/helper/rsa/RSAEnum.java new file mode 100644 index 0000000..0ab6bdb --- /dev/null +++ b/src/main/java/com/ynxbd/common/helper/rsa/RSAEnum.java @@ -0,0 +1,8 @@ +package com.ynxbd.common.helper.rsa; + +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@ToString +public class RSAEnum { +} diff --git a/src/main/java/com/ynxbd/common/helper/common/RSAHelper.java b/src/main/java/com/ynxbd/common/helper/rsa/RSAHelper.java similarity index 88% rename from src/main/java/com/ynxbd/common/helper/common/RSAHelper.java rename to src/main/java/com/ynxbd/common/helper/rsa/RSAHelper.java index 48af689..cbbc2a5 100644 --- a/src/main/java/com/ynxbd/common/helper/common/RSAHelper.java +++ b/src/main/java/com/ynxbd/common/helper/rsa/RSAHelper.java @@ -1,248 +1,251 @@ -package com.ynxbd.common.helper.common; - -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.lang3.ObjectUtils; - -import javax.crypto.Cipher; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.security.*; -import java.security.interfaces.RSAPrivateKey; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.HashMap; -import java.util.Map; - -/** - * RSA非对称加密 - * - * @Author wsq - * @Date 2021/07/28 11:01:28 - * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved. - */ -@Slf4j -public class RSAHelper { - private RSAHelper() { - } - - private static final int KEY_LENGTH = 1024; - private static final Map KEY_MAP = new HashMap<>(); // 用于封装随机产生的公钥与私钥 - - - static { - try { - // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象 - KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); - // 初始化密钥对生成器,密钥大小为96-1024位 - keyPairGen.initialize(KEY_LENGTH, new SecureRandom()); - // 生成一个密钥对,保存在keyPair中 - KeyPair keyPair = keyPairGen.generateKeyPair(); - RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥 - RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥 - String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded())); - // 得到私钥字符串 - String privateKeyStr = new String(Base64.encodeBase64((privateKey.getEncoded()))); - // 将公钥和私钥保存到Map - KEY_MAP.put(0, publicKeyStr); // 0表示公钥 - KEY_MAP.put(1, privateKeyStr); // 1表示私钥 - } catch (Exception e) { - ErrorHelper.println(e); - } - } - - /** - * 获取公钥 - * - * @return 公钥 - */ - public static String getPublicKey() { - return KEY_MAP.get(0); - } - - /** - * 获取私钥 - * - * @return 私钥 - */ - public static String getPrivateKey() { - return KEY_MAP.get(1); - } - - /** - * RSA公钥加密 - * - * @param encryptData 加密数据 - * @return 密文 - */ - public static String encrypt(String encryptData) { - return encrypt(encryptData, getPublicKey()); - } - - - /** - * RSA公钥加密 - * - * @param encryptData 加密数据 - * @return 密文 - */ - public static String encrypt(String encryptData, String publicKey) { - if (ObjectUtils.isEmpty(encryptData)) { - return null; - } - try { - // Base64编码的公钥 - byte[] decoded = Base64.decodeBase64(publicKey); - RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); - // RSA加密 - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.ENCRYPT_MODE, pubKey); - return Base64.encodeBase64String(cipher.doFinal(encryptData.getBytes(StandardCharsets.UTF_8))); - } catch (Exception e) { - log.error("[RSA]加密失败:[{}]", e.getMessage()); - } - return null; - } - - - /** - * RSA私钥解密 - * - * @param decryptData 加密数据 - * @return 明文 - */ - public static String decrypt(String decryptData) { - return decrypt(decryptData, getPrivateKey()); - } - - /** - * RSA私钥解密 - * - * @param decryptData 加密数据 - * @return 明文 - */ - public static String decrypt(String decryptData, String privateKey) { - if (ObjectUtils.isEmpty(decryptData)) { - return null; - } - try { - // 64位解码加密后的字符串 - byte[] inputByte = Base64.decodeBase64(decryptData.getBytes(StandardCharsets.UTF_8)); - // base64编码的私钥 - byte[] decoded = Base64.decodeBase64(privateKey); - RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); - // RSA解密 - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.DECRYPT_MODE, priKey); - return new String(cipher.doFinal(inputByte)); - } catch (Exception e) { - log.error("[RSA]解密失败:[{}]", e.getMessage()); - } - return null; - } - - - public static String URLEncode(String data) { - try { - if (ObjectUtils.isEmpty(data)) return null; - return URLEncoder.encode(data, String.valueOf(StandardCharsets.UTF_8)); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public static PublicKey getPublicKey(String base64PubKey) { - try { - byte[] keyBytes = java.util.Base64.getDecoder().decode(base64PubKey); - X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - return keyFactory.generatePublic(spec); - } catch (Exception e) { - log.error("", e); - return null; - } - } - - /** - * PKCS8 格式私钥字符串转 PrivateKey - * - * @param privateKeyStr 带/不带头尾标记的base64私钥 - * @return PrivateKey - */ - public static PrivateKey getPrivateKey(String privateKeyStr) { - try { - // 去除头尾标记、换行、空格 - String privateKeyPEM = privateKeyStr - .replace("-----BEGIN PRIVATE KEY-----", "") - .replace("-----END PRIVATE KEY-----", "") - .replaceAll("\\s+", ""); - byte[] keyBytes = java.util.Base64.getDecoder().decode(privateKeyPEM); - PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - return keyFactory.generatePrivate(spec); - } catch (Exception e) { - log.error("", e); - return null; - } - } - - // 加密方法(PKCS#1 v1.5填充) - public static byte[] enBytePKCS1Padding(String content, String base64PublicKey) throws Exception { - PublicKey publicKey = getPublicKey(base64PublicKey); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - byte[] rawData = content.getBytes(StandardCharsets.UTF_8); - return cipher.doFinal(rawData); - } - - // 加密方法(PKCS#1 v1.5填充) - public static String enPKCS1Padding(String plaintext, PublicKey publicKey) throws Exception { - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); - return java.util.Base64.getEncoder().encodeToString(encryptedBytes); - } - - // 解密方法 - public static String dePKCS1Padding(String encryptedText, PrivateKey privateKey) throws Exception { - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.DECRYPT_MODE, privateKey); - byte[] decryptedBytes = cipher.doFinal(java.util.Base64.getDecoder().decode(encryptedText)); - return new String(decryptedBytes, StandardCharsets.UTF_8); - } - - // 去除空格、制表符、换行符等连续或多个空白符 - public static String replaceKey(String key) { - if (key == null) return null; - return key.replaceAll("\\s+", ""); - } - - - public static void main(String[] args) throws Exception { -// System.out.println("随机生成的公钥为:" + KEY_MAP.get(0)); -// System.out.println("随机生成的私钥为:" + KEY_MAP.get(1)); - } - -// public static void main(String[] args) throws Exception { -// // Base64编码的公钥 -// byte[] decoded = Base64.decodeBase64(getPublicKey()); -// RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); -// // RSA加密 -// Cipher cipher = Cipher.getInstance("RSA"); -// cipher.init(Cipher.ENCRYPT_MODE, pubKey); -// -// String a = Base64.encodeBase64String(cipher.doFinal("encryptData".getBytes(StandardCharsets.UTF_8))); -// System.out.println(a); -// -// String b = Base64.encodeBase64String(cipher.doFinal("encryptData".getBytes(StandardCharsets.UTF_8))); -// System.out.println(a); -// -// String c = Base64.encodeBase64String(cipher.doFinal("encryptData".getBytes(StandardCharsets.UTF_8))); -// System.out.println(a); -// -// String d = Base64.encodeBase64String(cipher.doFinal("encryptData".getBytes(StandardCharsets.UTF_8))); -// System.out.println(a); -// } -} +package com.ynxbd.common.helper.rsa; + +import com.ynxbd.common.helper.common.ErrorHelper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.ObjectUtils; + +import javax.crypto.Cipher; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +/** + * RSA非对称加密 + * + * @Author wsq + * @Date 2021/07/28 11:01:28 + * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved. + */ +@Slf4j +public class RSAHelper { + private RSAHelper() { + } + + private static final int KEY_LENGTH = 1024; + private static final Map KEY_MAP = new HashMap<>(); // 用于封装随机产生的公钥与私钥 + + static { + try { + // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象 + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); + // 初始化密钥对生成器,密钥大小为96-1024位 + keyPairGen.initialize(KEY_LENGTH, new SecureRandom()); + // 生成一个密钥对,保存在keyPair中 + KeyPair keyPair = keyPairGen.generateKeyPair(); + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥 + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥 + String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded())); + // 得到私钥字符串 + String privateKeyStr = new String(Base64.encodeBase64((privateKey.getEncoded()))); + // 将公钥和私钥保存到Map + KEY_MAP.put(0, publicKeyStr); // 0表示公钥 + KEY_MAP.put(1, privateKeyStr); // 1表示私钥 + } catch (Exception e) { + ErrorHelper.println(e); + } + } + + public static final String RSA_ECB_PKCS1Padding = "RSA/ECB/PKCS1Padding"; + + /** + * 获取公钥 + * + * @return 公钥 + */ + public static String getPublicKey() { + return KEY_MAP.get(0); + } + + /** + * 获取私钥 + * + * @return 私钥 + */ + public static String getPrivateKey() { + return KEY_MAP.get(1); + } + + /** + * RSA公钥加密 + * + * @param encryptData 加密数据 + * @return 密文 + */ + public static String encrypt(String encryptData) { + return encrypt(encryptData, getPublicKey()); + } + + + /** + * RSA公钥加密 + * + * @param encryptData 加密数据 + * @return 密文 + */ + public static String encrypt(String encryptData, String publicKey) { + if (ObjectUtils.isEmpty(encryptData)) { + return null; + } + try { + // Base64编码的公钥 + byte[] decoded = Base64.decodeBase64(publicKey); + RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); + // RSA加密 + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, pubKey); + return Base64.encodeBase64String(cipher.doFinal(encryptData.getBytes(StandardCharsets.UTF_8))); + } catch (Exception e) { + log.error("[RSA]加密失败:[{}]", e.getMessage()); + } + return null; + } + + + /** + * RSA私钥解密 + * + * @param decryptData 加密数据 + * @return 明文 + */ + public static String decrypt(String decryptData) { + return decrypt(decryptData, getPrivateKey()); + } + + /** + * RSA私钥解密 + * + * @param decryptData 加密数据 + * @return 明文 + */ + public static String decrypt(String decryptData, String privateKey) { + if (ObjectUtils.isEmpty(decryptData)) { + return null; + } + try { + // 64位解码加密后的字符串 + byte[] inputByte = Base64.decodeBase64(decryptData.getBytes(StandardCharsets.UTF_8)); + // base64编码的私钥 + byte[] decoded = Base64.decodeBase64(privateKey); + RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); + // RSA解密 + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, priKey); + return new String(cipher.doFinal(inputByte)); + } catch (Exception e) { + log.error("[RSA]解密失败:[{}]", e.getMessage()); + } + return null; + } + + + public static String URLEncode(String data) { + try { + if (ObjectUtils.isEmpty(data)) return null; + return URLEncoder.encode(data, String.valueOf(StandardCharsets.UTF_8)); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static PublicKey getPublicKey(String base64PubKey) { + try { + byte[] keyBytes = java.util.Base64.getDecoder().decode(base64PubKey); + X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePublic(spec); + } catch (Exception e) { + log.error("", e); + return null; + } + } + + /** + * PKCS8 格式私钥字符串转 PrivateKey + * + * @param privateKeyStr 带/不带头尾标记的base64私钥 + * @return PrivateKey + */ + public static PrivateKey getPrivateKey(String privateKeyStr) { + try { + // 去除头尾标记、换行、空格 + String privateKeyPEM = privateKeyStr + .replace("-----BEGIN PRIVATE KEY-----", "") + .replace("-----END PRIVATE KEY-----", "") + .replaceAll("\\s+", ""); + byte[] keyBytes = java.util.Base64.getDecoder().decode(privateKeyPEM); + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePrivate(spec); + } catch (Exception e) { + log.error("", e); + return null; + } + } + + // 加密方法(PKCS#1 v1.5填充)[对应前端JS加密] + public static byte[] enPKCS1PaddingToByte(String content, String base64PublicKey) throws Exception { + return enPKCS1PaddingToByte(content, getPublicKey(base64PublicKey)); + } + + public static byte[] enPKCS1PaddingToByte(String content, PublicKey publicKey) throws Exception { + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] data = content.getBytes(StandardCharsets.UTF_8); + return cipher.doFinal(data); + } + + // 加密方法(PKCS#1 v1.5填充)[对应前端JS加密] + public static String enPKCS1Padding(String content, PublicKey publicKey) throws Exception { + byte[] data = enPKCS1PaddingToByte(content, publicKey); + return java.util.Base64.getEncoder().encodeToString(data); + } + + // 解密方法 + public static String dePKCS1Padding(String encryptedText, PrivateKey privateKey) throws Exception { + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] decryptedBytes = cipher.doFinal(java.util.Base64.getDecoder().decode(encryptedText)); + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + // 去除空格、制表符、换行符等连续或多个空白符 + public static String replaceKey(String key) { + if (key == null) return null; + return key.replaceAll("\\s+", ""); + } + + + public static void main(String[] args) throws Exception { +// System.out.println("随机生成的公钥为:" + KEY_MAP.get(0)); +// System.out.println("随机生成的私钥为:" + KEY_MAP.get(1)); + } + +// public static void main(String[] args) throws Exception { +// // Base64编码的公钥 +// byte[] decoded = Base64.decodeBase64(getPublicKey()); +// RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); +// // RSA加密 +// Cipher cipher = Cipher.getInstance("RSA"); +// cipher.init(Cipher.ENCRYPT_MODE, pubKey); +// +// String a = Base64.encodeBase64String(cipher.doFinal("encryptData".getBytes(StandardCharsets.UTF_8))); +// System.out.println(a); +// +// String b = Base64.encodeBase64String(cipher.doFinal("encryptData".getBytes(StandardCharsets.UTF_8))); +// System.out.println(a); +// +// String c = Base64.encodeBase64String(cipher.doFinal("encryptData".getBytes(StandardCharsets.UTF_8))); +// System.out.println(a); +// +// String d = Base64.encodeBase64String(cipher.doFinal("encryptData".getBytes(StandardCharsets.UTF_8))); +// System.out.println(a); +// } +} diff --git a/src/main/java/com/ynxbd/common/service/HCodeService.java b/src/main/java/com/ynxbd/common/service/HCodeService.java index 8e24cbb..26b899c 100644 --- a/src/main/java/com/ynxbd/common/service/HCodeService.java +++ b/src/main/java/com/ynxbd/common/service/HCodeService.java @@ -126,6 +126,7 @@ public class HCodeService { } + /** * 绑定健康卡和医院关系 * @@ -204,7 +205,6 @@ public class HCodeService { } - // /** // * 健康卡授权码获取健康卡信息 // * diff --git a/src/main/java/com/ynxbd/common/service/InHospService.java b/src/main/java/com/ynxbd/common/service/InHospService.java index 0f562c7..f695d99 100644 --- a/src/main/java/com/ynxbd/common/service/InHospService.java +++ b/src/main/java/com/ynxbd/common/service/InHospService.java @@ -166,7 +166,12 @@ public class InHospService { return new InHospPayDao().updateMicroOrderState(outTradeNo, bankTransNo, openid); } - // 查询HIS出院记录 + + /** + * [住院记录]通过患者ID查询(出院后) + * + * @param patientId 患者id + */ public List queryHisOutPatientRecords(String patientId) throws ServiceException { JsonResult resp = new HisInHospDao().queryOutPatientRecords(patientId, null); // 非医保 if (!resp.success()) { diff --git a/src/main/java/com/ynxbd/common/service/PEISService.java b/src/main/java/com/ynxbd/common/service/PEISService.java index 0da8d6f..f1d5260 100644 --- a/src/main/java/com/ynxbd/common/service/PEISService.java +++ b/src/main/java/com/ynxbd/common/service/PEISService.java @@ -10,7 +10,7 @@ import com.ynxbd.common.bean.pay.PEISOrderInfo; import com.ynxbd.common.bean.pay.PEISReserve; import com.ynxbd.common.dao.peis.PEISDao; import com.ynxbd.common.helper.common.JsonHelper; -import com.ynxbd.common.helper.common.RSAHelper; +import com.ynxbd.common.helper.rsa.RSAHelper; import com.ynxbd.common.helper.http.OkHttpHelper; import com.ynxbd.common.helper.xbd.XbdConfigHelper; import com.ynxbd.common.result.*; @@ -20,7 +20,6 @@ import okhttp3.RequestBody; import org.apache.commons.lang3.ObjectUtils; import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; import java.util.Date; /** @@ -84,6 +83,7 @@ public class PEISService { return new PEISDao().selectByOutTradeNo(outTradeNo); } + // 体检预约-未和HIS进行交互 public void payNotify(MerchantEnum merchantEnum, String openid, BigDecimal totalFee, String outTradeNo, String bankTransNo, String payDate, String payTime, String payInfo) { PEISDao peisDao = new PEISDao(); PEISReserve order = peisDao.selectByOutTradeNo(outTradeNo); @@ -249,7 +249,8 @@ public class PEISService { * @param endDate 结束时间 */ public JSONArray queryPEISRecordByCardNo(String cardNo, String begDate, String endDate) throws Exception { - String enIdCard = HexUtil.encodeHexStr(RSAHelper.enBytePKCS1Padding(cardNo, "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5klqI5STWTcbfjR093j+hvCEjNlZMQscIJg8jxZGqKW84AdFmSqPWEPu9ilqP+QUASiVSZ1QevGr2DWODFZ8Zw35aDA2bqCEprUx81gDdVPO7H7Bij+r8zAg8fT2c0Bi5rFq0xWMEQiTI+CyWwc5prOpquJU/P5yauEAdkRzlDwIDAQAB")); + String enIdCard = HexUtil.encodeHexStr(RSAHelper.enPKCS1PaddingToByte(cardNo, "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5klqI5STWTcbfjR093j+hvCEjNlZMQscIJg8jxZGqKW84AdFmSqPWEPu9ilqP+QUASiVSZ1QevGr2DWODFZ8Zw35aDA2bqCEprUx81gDdVPO7H7Bij+r8zAg8fT2c0Bi5rFq0xWMEQiTI+CyWwc5prOpquJU/P5yauEAdkRzlDwIDAQAB")); + RequestBody formBody = new FormBody.Builder(). add("enIdCard", enIdCard) diff --git a/src/main/java/com/ynxbd/common/service/RecipeService.java b/src/main/java/com/ynxbd/common/service/RecipeService.java index 856c1c9..24fbc27 100644 --- a/src/main/java/com/ynxbd/common/service/RecipeService.java +++ b/src/main/java/com/ynxbd/common/service/RecipeService.java @@ -9,7 +9,6 @@ import com.ynxbd.common.bean.StandardPrice; import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.pay.Order; import com.ynxbd.common.bean.pay.Recipe; -import com.ynxbd.common.bean.pay.Register; import com.ynxbd.common.dao.RecipeDao; import com.ynxbd.common.dao.RefundDao; import com.ynxbd.common.dao.SelfHelpDao; @@ -975,21 +974,21 @@ public class RecipeService { groupFlag = "1"; } - JsonResult JsonResult = HisRecipeDao.getStandardPrice(pageNum, pageSize, pyCode, type, groupFlag); - if (!JsonResult.success()) { - return Result.error(JsonResult.getMessage()); + JsonResult result = HisRecipeDao.getStandardPrice(pageNum, pageSize, pyCode, type, groupFlag); + if (!result.success()) { + return Result.error(result.getMessage()); } int pageCount; try { - JSONObject jsonObj = JsonResult.getJsonObject("Items"); + JSONObject jsonObj = result.getJsonObject("Items"); pageCount = jsonObj.getInteger("PageCount"); } catch (Exception e) { ErrorHelper.println(e); return Result.error(e.getMessage()); } - List dataList = JsonResult.getDataMapList(StandardPrice.class, "Items", "Item"); + List dataList = result.getDataMapList(StandardPrice.class, "Items", "Item"); return Result.success(dataList, (pageCount * pageSize)); } diff --git a/src/main/java/com/ynxbd/common/service/RegService.java b/src/main/java/com/ynxbd/common/service/RegService.java index 7a3e08d..17e5959 100644 --- a/src/main/java/com/ynxbd/common/service/RegService.java +++ b/src/main/java/com/ynxbd/common/service/RegService.java @@ -16,7 +16,6 @@ import com.ynxbd.common.dao.RegisterDao; import com.ynxbd.common.dao.his.HisAccountDao; import com.ynxbd.common.dao.his.HisRegisterDao; import com.ynxbd.common.helper.common.DateHelper; -import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.his.HisHelper; import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.Result; @@ -399,9 +398,9 @@ public class RegService { String outTradeNo = reg.getOutTradeNo(); MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo); - JsonResult JsonResult = new HisRegisterDao().cancelReserve(patientId, tradeNo, merchantEnum); - if (!JsonResult.success()) { - String message = JsonResult.getMessage(); + JsonResult resp = new HisRegisterDao().cancelReserve(patientId, tradeNo, merchantEnum); + if (!resp.success()) { + String message = resp.getMessage(); log.info("[挂号][取消预约]失败 HIS返回:{}", message); return Result.error(message); } @@ -421,7 +420,7 @@ public class RegService { String pushInfo = "取消预约 科室:" + reg.getDeptName(); - Result result = regAutoRefund(merchantEnum, JsonResult, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime()); + Result result = regAutoRefund(merchantEnum, resp, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime()); new SmsService().sms_reg_002(reg); MessagePushConfig.regCancelPush(merchantEnum, reg); @@ -464,9 +463,9 @@ public class RegService { String outTradeNo = reg.getOutTradeNo(); MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo); - JsonResult JsonResult = new HisRegisterDao().refundRegister(tradeNo, merchantEnum); - if (!JsonResult.success()) { - String message = JsonResult.getMessage(); + JsonResult resp = new HisRegisterDao().refundRegister(tradeNo, merchantEnum); + if (!resp.success()) { + String message = resp.getMessage(); log.info("[今日挂号][取消预约]失败 HIS返回:{}", message); return Result.error(message); } @@ -492,7 +491,7 @@ public class RegService { String pushInfo = "取消预约 科室:" + reg.getDeptName(); - Result result = refundTodayRegister(merchantEnum, JsonResult, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime()); + Result result = refundTodayRegister(merchantEnum, resp, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime()); new SmsService().sms_reg_002(reg); // 短信通知 MessagePushConfig.regCancelPush(merchantEnum, reg); @@ -633,34 +632,34 @@ public class RegService { * 挂号失败自动退款 * * @param merchantEnum 退费方式 - * @param JsonResult 响应结果 + * @param jsonResult 响应结果 * @param openid openid * @param totalFee 订单总金额 * @param outTradeNo 订单号 * @param tradeNo HIS交易流水号 * @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 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 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) { + 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(); + String code = jsonResult.getCode(); // 挂号记录更新HIS返回的错误信息 if (!regDao.updateHisPaidFailByOutTradeNo(outTradeNo, code, hisResult)) { log.info("[挂号][退费错误]更新HIS返回的错误信息失败 outTradeNo={}, tradeNo={}", outTradeNo, tradeNo); } - if (JsonResult.isTimeout()) { // 超时不退费 + if (jsonResult.isTimeout()) { // 超时不退费 log.info("[挂号][退费错误]HIS请求超时 outTradeNo={}, tradeNo={}", outTradeNo, tradeNo); return Result.error("[挂号不退费]HIS请求超时"); } diff --git a/src/main/java/com/ynxbd/jy/helper/JYPayHelper.java b/src/main/java/com/ynxbd/jy/helper/JYPayHelper.java index 83b76d3..66ebe2b 100644 --- a/src/main/java/com/ynxbd/jy/helper/JYPayHelper.java +++ b/src/main/java/com/ynxbd/jy/helper/JYPayHelper.java @@ -5,7 +5,7 @@ import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.pay.ReqOrder; import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.JsonHelper; -import com.ynxbd.common.helper.common.RSAHelper; +import com.ynxbd.common.helper.rsa.RSAHelper; import com.ynxbd.common.helper.http.OkHttpHelper; import com.ynxbd.jy.bean.JYOrder; import com.ynxbd.wx.config.WeChatConfig; diff --git a/src/main/java/com/ynxbd/wx/wxfactory/base/auth/Client.java b/src/main/java/com/ynxbd/wx/wxfactory/base/auth/Client.java index e67c7b0..f21f74a 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/base/auth/Client.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/base/auth/Client.java @@ -1,5 +1,6 @@ package com.ynxbd.wx.wxfactory.base.auth; +import com.ynxbd.common.bean.enums.WxFaceEnum; import com.ynxbd.common.helper.common.Base64Helper; import com.ynxbd.common.helper.common.CodeHelper; import com.ynxbd.common.helper.common.JsonHelper; @@ -161,8 +162,9 @@ public class Client { public WxVerifyId getVerifyId(String openid, String certName, String certNo) throws ServiceException { String accessToken = getAccessToken(); + final String CERT_TYPE = "IDENTITY_CARD"; Map cert_info = new HashMap<>(); - cert_info.put("cert_type", "IDENTITY_CARD"); + cert_info.put("cert_type", CERT_TYPE); cert_info.put("cert_name", certName); // 证件姓名 cert_info.put("cert_no", certNo); // 证件号码 @@ -173,21 +175,22 @@ public class Client { params.put("cert_info", cert_info); // 用户身份信息 params.put("openid", openid); // 用户身份标识 }, null); - log.info("[获取用户人脸核身会话唯一标识][{}] openid={}, certName={}, resp:{}", outSeqNo, openid, certName, respJson); + log.info("[获取用户人脸核身会话唯一标识][{}] openid={}, certName={}, resp={}", outSeqNo, openid, certName, respJson); if (respJson == null) { throw new ServiceException("[获取用户人脸核身会话唯一标识]接口调用失败"); } WxVerifyId info = JsonHelper.parseObject(respJson, WxVerifyId.class); if (!info.isOk()) { log.info("[获取用户人脸核身会话唯一标识][{}]接口调用失败 openid={}, resp={}", outSeqNo, openid, respJson); - throw new ServiceException(info.filterErrMsg()); + WxFaceEnum msgEnum = WxFaceEnum.findEnum(info.getErrCode()); + throw new ServiceException(msgEnum == null ? info.filterErrMsg() : msgEnum.msg); } info.setOutSeqNo(outSeqNo); String base64Data = String.format("cert_type=%s&cert_name=%s&cert_no=%s", - Base64Helper.encode("IDENTITY_CARD"), - Base64Helper.encode("certName"), - Base64Helper.encode("certNo") + Base64Helper.encode(CERT_TYPE), + Base64Helper.encode(certName), + Base64Helper.encode(certNo) ); info.setCertHash(CodeHelper.sha256ToHexLowerCase(base64Data)); return info; diff --git a/src/main/java/com/ynxbd/wx/wxfactory/base/auth/models/WxVerifyId.java b/src/main/java/com/ynxbd/wx/wxfactory/base/auth/models/WxVerifyId.java index 0014a83..190266d 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/base/auth/models/WxVerifyId.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/base/auth/models/WxVerifyId.java @@ -16,6 +16,15 @@ public class WxVerifyId { private String outSeqNo; private Integer verifyRet; private String certHash; + // 证件号 + private String certNo; + // 证件姓名 + private String certName; + // 证件类型 + private String certType; + + private String appId; + // 接口请求状态 public boolean isOk() { diff --git a/src/main/resources/webservice.properties b/src/main/resources/webservice.properties index a602f4a..c7795e2 100644 --- a/src/main/resources/webservice.properties +++ b/src/main/resources/webservice.properties @@ -1 +1 @@ -# \u5F00\u542F\u5904\u65B9\u9884\u7ED3\u7B97\uFF08\u7B2C2\u5F00\u5173\uFF09\uFF08\u6CE8\u610F\u8BE5\u914D\u7F6E\u9700\u8054\u7CFBhis\u5F00\u53D1\u8005\u786E\u8BA4\u652F\u6301\u624D\u80FD\u5F00\u542F\uFF0C\u5426\u5219\u5B58\u5728\u98CE\u9669\uFF01\uFF09 his.is_recipe_prepay=false # \u672C\u5730 #his.url=127.0.0.1:8888 # HIS\u662F\u5426\u5F00\u542F\u652F\u4ED8\u5B9D\u5206\u5F00\u5BF9\u8D26 his.is_ali_mer=false # \u662F\u5426\u5F3A\u5236\u6253\u5370webservice\u7684xml\u8FD4\u56DE\u6570\u636E his.is_log_resp=true # \u5DDE\u50A3\u533B\u4F7F\u7528 his.is_req_cdata=false # \u662F\u5426\u4F20\u9012openid\u7ED9his\u63A8\u9001\u6D88\u606F his.is_push_msg=false #------------------------------- # \u6D4B\u8BD5\u73AF\u5883 his.dev_url=200.200.200.105:8888 # \u533B\u4FDD=========================== # \u65E7\u914D\u7F6E his.md_url=127.0.0.1:7777 # \u5FAE\u4FE1\u533B\u4FDD his.wx_med_url=10.20.10.7:7885 # \u652F\u4ED8\u5B9D\u533B\u4FDD his.ali_med_url=10.20.10.7:7885 # \u6D4B\u8BD5============================================================ # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u77F3\u6797\u53BF\u533B\u9662 #his.url=200.200.200.105:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:9999 # \u7EA2\u6CB3\u5DDE\u533B\u9662 his.url=10.20.10.6:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # \u5B81\u8497\u5987\u5E7C #his.url=172.19.3.15:8888 # \u5B81\u8497\u53BF\u533B\u9662 #his.url=192.168.10.8:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.39:8888 #\u666F\u6D2A\u4E2D\u50A3\u533B #his.url=192.168.197.217:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u7EA2\u6CB3 #his.url=10.20.10.6:8888 # \u7EA2\u6CB3\u533B\u4FDD #his.url=10.20.10.6:8888 #his.url=192.168.12.10:8888 #his.md_url=192.168.1.128:7885 #his.dev_url=10.20.10.6:9988 # \u6C38\u80DC #his.url=200.200.200.20:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u534E\u576A #his.url=192.168.1.115:8888 # \u8499\u81EA\u4E2D\u533B #his.url=192.168.0.228:8888 # \u7389\u9F99 #his.url=192.168.0.17:8888 # #his.url=172.16.10.15:8888 # \u7984\u529D\u949F\u7231 #his.url=200.200.200.5:8888 # \u8499\u81EA\u5E02\u4EBA\u6C11\u533B\u9662 #his.url=200.200.200.174:8080 # \u5143\u8C0B #his.url=200.200.200.29:8888 # \u5143\u8C0B\u533B\u4FDD #his.dev_url=200.200.200.36:9999 # \u8292\u5E02 #his.url=192.168.100.8:8888 # \u7EA2\u6CB3\u5987\u5E7C\u4FDD\u5065\u9662 #his.url=192.168.1.204:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # #his.url=10.10.11.23:8888 # \u77F3\u6797 #his.url=192.168.10.10:8888 # \u5BCC\u6C11 #his.url=200.200.201.27:8888 # \u897F\u53CC\u7248\u7EB3 #his.url=10.10.11.23:8888 #wx.password=ynxbd@6910 \ No newline at end of file +# \u5F00\u542F\u5904\u65B9\u9884\u7ED3\u7B97\uFF08\u7B2C2\u5F00\u5173\uFF09\uFF08\u6CE8\u610F\u8BE5\u914D\u7F6E\u9700\u8054\u7CFBhis\u5F00\u53D1\u8005\u786E\u8BA4\u652F\u6301\u624D\u80FD\u5F00\u542F\uFF0C\u5426\u5219\u5B58\u5728\u98CE\u9669\uFF01\uFF09 his.is_recipe_prepay=false # \u672C\u5730 #his.url=127.0.0.1:8888 # HIS\u662F\u5426\u5F00\u542F\u652F\u4ED8\u5B9D\u5206\u5F00\u5BF9\u8D26 his.is_ali_mer=false # \u662F\u5426\u5F3A\u5236\u6253\u5370webservice\u7684xml\u8FD4\u56DE\u6570\u636E his.is_log_resp=true # \u5DDE\u50A3\u533B\u4F7F\u7528 his.is_req_cdata=false # \u662F\u5426\u4F20\u9012openid\u7ED9his\u63A8\u9001\u6D88\u606F his.is_push_msg=false #------------------------------- # \u6D4B\u8BD5\u73AF\u5883 his.dev_url=200.200.200.60:7777 # \u533B\u4FDD=========================== # \u65E7\u914D\u7F6E his.md_url=127.0.0.1:7777 # \u5FAE\u4FE1\u533B\u4FDD his.wx_med_url=10.20.10.7:7885 # \u652F\u4ED8\u5B9D\u533B\u4FDD his.ali_med_url=10.20.10.7:7885 # \u6D4B\u8BD5============================================================ # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u77F3\u6797\u53BF\u533B\u9662 #his.url=200.200.200.105:8888 # \u5FB7\u5B8F\u4E2D\u533B his.url=200.200.200.60:7777 # \u7EA2\u6CB3\u5DDE\u533B\u9662 #his.url=10.20.10.6:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # \u5B81\u8497\u5987\u5E7C #his.url=172.19.3.15:8888 # \u5B81\u8497\u53BF\u533B\u9662 #his.url=192.168.10.8:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.39:8888 #\u666F\u6D2A\u4E2D\u50A3\u533B #his.url=192.168.197.217:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u7EA2\u6CB3 #his.url=10.20.10.6:8888 # \u7EA2\u6CB3\u533B\u4FDD #his.url=10.20.10.6:8888 #his.url=192.168.12.10:8888 #his.md_url=192.168.1.128:7885 #his.dev_url=10.20.10.6:9988 # \u6C38\u80DC #his.url=200.200.200.20:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u534E\u576A #his.url=192.168.1.115:8888 # \u8499\u81EA\u4E2D\u533B #his.url=192.168.0.228:8888 # \u7389\u9F99 #his.url=192.168.0.17:8888 # #his.url=172.16.10.15:8888 # \u7984\u529D\u949F\u7231 #his.url=200.200.200.5:8888 # \u8499\u81EA\u5E02\u4EBA\u6C11\u533B\u9662 #his.url=200.200.200.174:8080 # \u5143\u8C0B #his.url=200.200.200.29:8888 # \u5143\u8C0B\u533B\u4FDD #his.dev_url=200.200.200.36:9999 # \u8292\u5E02 #his.url=192.168.100.8:8888 # \u7EA2\u6CB3\u5987\u5E7C\u4FDD\u5065\u9662 #his.url=192.168.1.204:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # #his.url=10.10.11.23:8888 # \u77F3\u6797 #his.url=192.168.10.10:8888 # \u5BCC\u6C11 #his.url=200.200.201.27:8888 # \u897F\u53CC\u7248\u7EB3 #his.url=10.10.11.23:8888 #wx.password=ynxbd@6910 \ No newline at end of file