1.电子健康卡-新增faceUrl入参,新增人脸识别2.0接口

2.不分参数名和类名冲突调整
3.新增人脸识别失败的错误信息枚举,并返回错误信息.
4.体检影像报告查询交互加密调整
5.电子健康卡人脸识别接口,区别于微信人脸识别接口,签名生成调整.
debug
王绍全 6 hours ago
parent 2a53cbf4fd
commit ec5fdd390f
  1. 22
      src/main/java/com/ynxbd/common/TestA.java
  2. 10
      src/main/java/com/ynxbd/common/action/AccountsAction.java
  3. 15
      src/main/java/com/ynxbd/common/action/ApiAction.java
  4. 4
      src/main/java/com/ynxbd/common/action/InHospAction.java
  5. 2
      src/main/java/com/ynxbd/common/action/QRAction.java
  6. 2
      src/main/java/com/ynxbd/common/action/RecipeAction.java
  7. 5
      src/main/java/com/ynxbd/common/action/XBDAction.java
  8. 2
      src/main/java/com/ynxbd/common/action/healthcard/HCReportAction.java
  9. 60
      src/main/java/com/ynxbd/common/action/healthcard/HealthCardAction.java
  10. 15
      src/main/java/com/ynxbd/common/action/pay/PayAction.java
  11. 36
      src/main/java/com/ynxbd/common/bean/enums/WxFaceEnum.java
  12. 20
      src/main/java/com/ynxbd/common/bean/xk/HisRxAdmRoute.java
  13. 50
      src/main/java/com/ynxbd/common/bean/xk/HisRxDrug.java
  14. 18
      src/main/java/com/ynxbd/common/bean/xk/HisRxPharmDict.java
  15. 23
      src/main/java/com/ynxbd/common/bean/xk/HisRxUseCount.java
  16. 6
      src/main/java/com/ynxbd/common/dao/his/HisAccountDao.java
  17. 14
      src/main/java/com/ynxbd/common/dao/his/HisInHospDao.java
  18. 8
      src/main/java/com/ynxbd/common/dao/his/HisMedDao.java
  19. 10
      src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java
  20. 28
      src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java
  21. 38
      src/main/java/com/ynxbd/common/dao/his/HisXKDao.java
  22. 76
      src/main/java/com/ynxbd/common/helper/HealthCardHelper.java
  23. 5
      src/main/java/com/ynxbd/common/helper/common/SmsHelper.java
  24. 2
      src/main/java/com/ynxbd/common/helper/common/SmsRsaHelper.java
  25. 7
      src/main/java/com/ynxbd/common/helper/his/HisEnum.java
  26. 8
      src/main/java/com/ynxbd/common/helper/rsa/RSAEnum.java
  27. 499
      src/main/java/com/ynxbd/common/helper/rsa/RSAHelper.java
  28. 2
      src/main/java/com/ynxbd/common/service/HCodeService.java
  29. 7
      src/main/java/com/ynxbd/common/service/InHospService.java
  30. 7
      src/main/java/com/ynxbd/common/service/PEISService.java
  31. 11
      src/main/java/com/ynxbd/common/service/RecipeService.java
  32. 37
      src/main/java/com/ynxbd/common/service/RegService.java
  33. 2
      src/main/java/com/ynxbd/jy/helper/JYPayHelper.java
  34. 15
      src/main/java/com/ynxbd/wx/wxfactory/base/auth/Client.java
  35. 9
      src/main/java/com/ynxbd/wx/wxfactory/base/auth/models/WxVerifyId.java
  36. 2
      src/main/resources/webservice.properties

@ -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");
}
//

@ -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<HisTransaction> dataList = JsonResult.getDataMapList(HisTransaction.class, "Item");
List<HisTransaction> dataList = resp.getDataMapList(HisTransaction.class, "Item");
if (dataList.isEmpty()) {
return Result.error(ResultEnum.INTERFACE_HIS_INVOKE_ERROR);
}

@ -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<String, Object> 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);

@ -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());
}

@ -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;

@ -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());
// }

@ -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;
/**

@ -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();
}
}

@ -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);
}
}
/**
* 健康卡[上报数据]
*

@ -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<String, Object> resultData = new HashMap<>();
Map<String, Object> dataMap = JsonResult.getDataMap();
String recipeId = JsonResult.getDataMapString("RecipeId");
Map<String, Object> dataMap = result.getDataMap();
String recipeId = result.getDataMapString("RecipeId");
if (ObjectUtils.isEmpty(recipeId)) {
return Result.error(ResultEnum.INTERFACE_HIS_INVOKE_ERROR);
}

@ -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;
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;

@ -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);

@ -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());
}
/**

@ -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;

@ -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<Doctor> 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;

@ -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<>();
}
}

@ -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;
}
/**
* [电子健康卡]实人认证结果查询
*/

@ -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;

@ -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";

@ -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;

@ -0,0 +1,8 @@
package com.ynxbd.common.helper.rsa;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
@ToString
public class RSAEnum {
}

@ -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<Integer, String> 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<Integer, String> 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);
// }
}

@ -126,6 +126,7 @@ public class HCodeService {
}
/**
* 绑定健康卡和医院关系
*
@ -204,7 +205,6 @@ public class HCodeService {
}
// /**
// * 健康卡授权码获取健康卡信息
// *

@ -166,7 +166,12 @@ public class InHospService {
return new InHospPayDao().updateMicroOrderState(outTradeNo, bankTransNo, openid);
}
// 查询HIS出院记录
/**
* [住院记录]通过患者ID查询出院后
*
* @param patientId 患者id
*/
public List<InHospitalList> queryHisOutPatientRecords(String patientId) throws ServiceException {
JsonResult resp = new HisInHospDao().queryOutPatientRecords(patientId, null); // 非医保
if (!resp.success()) {

@ -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)

@ -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<StandardPrice> dataList = JsonResult.getDataMapList(StandardPrice.class, "Items", "Item");
List<StandardPrice> dataList = result.getDataMapList(StandardPrice.class, "Items", "Item");
return Result.success(dataList, (pageCount * pageSize));
}

@ -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请求超时");
}

@ -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;

@ -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<String, Object> 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;

@ -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() {

@ -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
# \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
Loading…
Cancel
Save