支付宝退费接口,混合支付退费失败调整,新增调用HIS接口退统筹和个账部分。

日志打印调整,新增标记测试报告需填写内容
debug
wangsq 2 weeks ago
parent 4ba9903ac1
commit 9e045ac7d6
  1. 40
      src/main/java/com/ynxbd/ali/config/AliMIConfig.java
  2. 41
      src/main/java/com/ynxbd/ali/config/AliMedConfig.java
  3. 2
      src/main/java/com/ynxbd/ali/helper/AliHelper.java
  4. 48
      src/main/java/com/ynxbd/ali/helper/AliMedHelper.java
  5. 18
      src/main/java/com/ynxbd/common/action/pay/AliPayAction.java
  6. 19
      src/main/java/com/ynxbd/common/action/pay/MedicalAction.java
  7. 126
      src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java
  8. 90
      src/main/java/com/ynxbd/common/action/test/TestAction.java
  9. 8
      src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java
  10. 4
      src/main/java/com/ynxbd/common/dao/his/HisMIDao.java
  11. 25
      src/main/java/com/ynxbd/common/service/MedicalService.java
  12. 32
      src/main/java/com/ynxbd/wx/wxfactory/WxMedicalHelper.java
  13. 4
      src/main/java/com/ynxbd/wx/wxfactory/WxMessageHelper.java
  14. 21
      src/main/java/com/ynxbd/wx/wxfactory/medical/Client.java
  15. 4
      src/main/java/com/ynxbd/wx/wxfactory/medical/WxMedConfig.java
  16. 17
      src/main/resources/medical-ali.properties

@ -1,40 +0,0 @@
package com.ynxbd.ali.config;
import com.ynxbd.common.helper.ProperHelper;
import com.ynxbd.wx.wxfactory.medical.WechatMIConfig;
// 支付宝医保配置
public class AliMIConfig {
private AliMIConfig() {
}
//配置文件读取项
public static final boolean IS_ENABLE;
public static final String CITY_CODE; // 城市编码
public static final String ORG_CHNL_CRTF_CODG;
public static final String ORG_NO;
public static final String ORG_APP_ID;
public static final String ORG_HOSPITAL_NAME;
public static boolean IS_DEV;
public static boolean IS_AUTO_REFUND;
public static String DEV_OPENID;
static {
ProperHelper config = new ProperHelper().read("medical-ali.properties");
IS_ENABLE = config.getBoolean("mi_ali.is_enable", false);
config.setIsEnable(IS_ENABLE);
IS_DEV = config.getBoolean("mi_ali.is_dev", true);
IS_AUTO_REFUND = config.getBoolean("mi_ali.is_auto_refund", false);
DEV_OPENID = config.getString("mi_ali.dev_openid", null);
ORG_NO = config.getString("mi_ali.org_no");
ORG_APP_ID = config.getString("mi_ali.org_app_id");
ORG_CHNL_CRTF_CODG = config.getString("mi_ali.org_chnl_crtf_codg");
ORG_HOSPITAL_NAME = config.getString("mi_ali.org_hospital_name");
// 相同数据赋值
CITY_CODE = WechatMIConfig.CITY_CODE;
}
}

@ -0,0 +1,41 @@
package com.ynxbd.ali.config;
import com.ynxbd.common.helper.ProperHelper;
// 支付宝医保配置
public class AliMedConfig {
private AliMedConfig() {
}
//配置文件读取项
public static final boolean IS_ENABLE;
public static final String CITY_CODE; // 城市编码
public static final String ORG_CHNL_CRTF_CODG;
public static final String ORG_NO;
public static final String ORG_APP_ID;
public static final String ORG_HOSPITAL_NAME;
public static boolean IS_DEV;
public static boolean IS_AUTO_REFUND;
public static String DEV_OPENID;
static {
ProperHelper config = new ProperHelper().read("medical-ali.properties");
IS_ENABLE = config.getBoolean("med_ali.is_enable", false);
config.setIsEnable(IS_ENABLE);
IS_DEV = config.getBoolean("med_ali.is_dev", true);
IS_AUTO_REFUND = config.getBoolean("med_ali.is_auto_refund", false);
DEV_OPENID = config.getString("med_ali.dev_openid", null);
ORG_NO = config.getString("med_ali.org_no");
ORG_APP_ID = config.getString("med_ali.org_app_id");
ORG_CHNL_CRTF_CODG = config.getString("med_ali.org_chnl_crtf_codg");
ORG_HOSPITAL_NAME = config.getString("med_ali.org_hospital_name");
CITY_CODE = config.getString("med_ali.city_code");
}
// 跳转链接:https://render.alipay.com/p/s/i/?scheme=encodeURIComponent('alipays://platformapi/startapp?appId=xxx&page=pages/home/home')
}

@ -455,7 +455,7 @@ public class AliHelper {
return order; return order;
} }
if (isMIPay) { if (isMIPay) {
return AliMIHelper.queryTrade(outTradeNo, null); return AliMedHelper.queryTrade(outTradeNo, null);
} }
return queryTransaction(outTradeNo); return queryTransaction(outTradeNo);
} }

@ -17,7 +17,7 @@ import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse; import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundApplyResponse; import com.alipay.api.response.AlipayTradeRefundApplyResponse;
import com.ynxbd.ali.config.AliConfig; import com.ynxbd.ali.config.AliConfig;
import com.ynxbd.ali.config.AliMIConfig; import com.ynxbd.ali.config.AliMedConfig;
import com.ynxbd.common.bean.pay.Order; import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.ErrorHelper;
@ -32,7 +32,7 @@ import java.net.URLDecoder;
import java.util.*; import java.util.*;
@Slf4j @Slf4j
public class AliMIHelper { public class AliMedHelper {
/** /**
* 国家医保局线上业务身份核验信息授权查询接口[alipay_commerce_medical_authinfo_auth_query_response] * 国家医保局线上业务身份核验信息授权查询接口[alipay_commerce_medical_authinfo_auth_query_response]
@ -70,11 +70,11 @@ public class AliMIHelper {
model.setCallUrl(callUrl); model.setCallUrl(callUrl);
// 设置olBizTypeCode=04107(医保移动支付业务)时必传 // 设置olBizTypeCode=04107(医保移动支付业务)时必传
model.setOrgAppId(AliMIConfig.ORG_APP_ID); model.setOrgAppId(AliMedConfig.ORG_APP_ID);
// 设置机构渠道认证编码 // 设置机构渠道认证编码
model.setOrgChnlCrtfCode(AliMIConfig.ORG_CHNL_CRTF_CODG); model.setOrgChnlCrtfCode(AliMedConfig.ORG_CHNL_CRTF_CODG);
// 设置定点医药机构代码 // 设置定点医药机构代码
model.setOrgCode(AliMIConfig.ORG_NO); model.setOrgCode(AliMedConfig.ORG_NO);
// 设置扩展信息-亲情账户支付场景增加 // 设置扩展信息-亲情账户支付场景增加
AuthExtendParams extendParams = new AuthExtendParams(); AuthExtendParams extendParams = new AuthExtendParams();
@ -98,10 +98,11 @@ public class AliMIHelper {
// 设置auth_token,同access_token(用户访问令牌) // 设置auth_token,同access_token(用户访问令牌)
request.putOtherTextParam("auth_token", accessToken); request.putOtherTextParam("auth_token", accessToken);
log.info("[支付宝]国家医保局线上业务身份核验信息授权查询接口-入参{}", JsonHelper.toJsonString(request)); int callNum = ObjectUtils.isEmpty(reqBizNo) ? 1 : 2; // 2为第二次授权
// [支付宝医保]测试报告2
log.info("[支付宝医保]身份核验信息授权查询接口[{}]-入参{}", callNum, JsonHelper.toJsonString(request));
AlipayCommerceMedicalAuthinfoAuthQueryResponse response = alipayClient.execute(request); AlipayCommerceMedicalAuthinfoAuthQueryResponse response = alipayClient.execute(request);
log.info("[支付宝]国家医保局线上业务身份核验信息授权查询接口-调用{} {}", response.isSuccess() ? "[成功]" : "[失败]", response.getBody()); log.info("[支付宝医保]身份核验信息授权查询接口[{}]-调用{} {}", callNum, response.isSuccess() ? "[成功]" : "[失败]", response.getBody());
if (response.isSuccess()) { if (response.isSuccess()) {
return response.getData(); return response.getData();
} }
@ -170,9 +171,9 @@ public class AliMIHelper {
medicalRequestExt.put("bill_no", payOrdId); // 移动支付中心订单号payOrdId medicalRequestExt.put("bill_no", payOrdId); // 移动支付中心订单号payOrdId
medicalRequestExt.put("pay_auth_no", payAuthNo); // 移动支付中心返回授权编号 获取线上医保业务授权接口返回payAuthNo参数 medicalRequestExt.put("pay_auth_no", payAuthNo); // 移动支付中心返回授权编号 获取线上医保业务授权接口返回payAuthNo参数
// //
medicalRequestExt.put("org_no", AliMIConfig.ORG_NO); // 医药机构编号 medicalRequestExt.put("org_no", AliMedConfig.ORG_NO); // 医药机构编号
medicalRequestExt.put("org_name", AliMIConfig.ORG_HOSPITAL_NAME); // 医药机构名称 medicalRequestExt.put("org_name", AliMedConfig.ORG_HOSPITAL_NAME); // 医药机构名称
medicalRequestExt.put("payment_city_code", AliMIConfig.CITY_CODE); // 医保结算地城市编码(国标) medicalRequestExt.put("payment_city_code", AliMedConfig.CITY_CODE); // 医保结算地城市编码(国标)
// //
medicalRequestExt.put("industry", "HOSPITAL"); // 行业标识 医院:HOSPITAL medicalRequestExt.put("industry", "HOSPITAL"); // 行业标识 医院:HOSPITAL
medicalRequestExt.put("chinfo", "gjydzf"); // 渠道标识-默认为gjydzf medicalRequestExt.put("chinfo", "gjydzf"); // 渠道标识-默认为gjydzf
@ -208,10 +209,9 @@ public class AliMIHelper {
bizContent.put("extend_params", extendParams); bizContent.put("extend_params", extendParams);
request.setBizContent(JSONObject.toJSONString(bizContent)); request.setBizContent(JSONObject.toJSONString(bizContent));
log.info("[支付宝]医保下单-入参 {}", JSONObject.toJSONString(request)); log.info("[支付宝医保]下单-入参 {}", JSONObject.toJSONString(request));
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
log.info("[支付宝]医保下单-返回 orderStr={}", response.getBody()); log.info("[支付宝医保]下单-返回 orderStr={}", response.getBody());
if (response.isSuccess()) { if (response.isSuccess()) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("orderStr", response.getBody()); map.put("orderStr", response.getBody());
@ -246,9 +246,9 @@ public class AliMIHelper {
model.setQueryOptions(queryOptions); model.setQueryOptions(queryOptions);
request.setBizModel(model); request.setBizModel(model);
log.info("[支付宝][医保]线下交易查询-入参 {}", JSONObject.toJSONString(request)); log.info("[支付宝医保]线下交易查询-入参 {}", JSONObject.toJSONString(request));
AlipayTradeQueryResponse response = alipayClient.execute(request); AlipayTradeQueryResponse response = alipayClient.execute(request);
log.info("[支付宝][医保]线下交易查询-返回 {}", JsonHelper.toJsonString(response)); log.info("[支付宝医保]线下交易查询-返回 {}", JsonHelper.toJsonString(response));
if (response.isSuccess()) { if (response.isSuccess()) {
if ("TRADE_SUCCESS".equals(response.getTradeStatus())) { if ("TRADE_SUCCESS".equals(response.getTradeStatus())) {
order.setSuccess(true); order.setSuccess(true);
@ -277,11 +277,11 @@ public class AliMIHelper {
public static AlipayTradeRefundApplyResponse refundTrade(String outTradeNo, String outRefundNo, String tradeNo, BigDecimal refundAmount, String refundReason) throws Exception { public static AlipayTradeRefundApplyResponse refundTrade(String outTradeNo, String outRefundNo, String tradeNo, BigDecimal refundAmount, String refundReason) throws Exception {
try { try {
if (ObjectUtils.isEmpty(outRefundNo)) { if (ObjectUtils.isEmpty(outRefundNo)) {
log.info("[支付宝]退费outRefundNo为空"); log.info("[支付宝医保]退费outRefundNo为空");
return null; return null;
} }
if (ObjectUtils.isEmpty(outTradeNo) && ObjectUtils.isEmpty(tradeNo)) { if (ObjectUtils.isEmpty(outTradeNo) && ObjectUtils.isEmpty(tradeNo)) {
log.info("[支付宝]退费[outTradeNo 和 tradeNo]不能都为空"); log.info("[支付宝医保]退费[outTradeNo 和 tradeNo]不能都为空");
return null; return null;
} }
AlipayClient alipayClient = new DefaultAlipayClient(AliConfig.getAlipayConfig()); AlipayClient alipayClient = new DefaultAlipayClient(AliConfig.getAlipayConfig());
@ -300,19 +300,21 @@ public class AliMIHelper {
JSONObject extendParams = new JSONObject(); JSONObject extendParams = new JSONObject();
extendParams.put("cancel_serial_no", outRefundNo); extendParams.put("cancel_serial_no", outRefundNo);
extendParams.put("cancel_bill_no", outRefundNo); extendParams.put("cancel_bill_no", outRefundNo);
// INNER_ASSET:表示只退自费部分; OUTSIDE_ASSET:表示只退医保部分,医保部分不支持部分退
extendParams.put("DESIGNATED_REFUND_ASSET", "INNER_ASSET");
bizContent.put("extend_params", extendParams); bizContent.put("extend_params", extendParams);
request.setBizContent(JSONObject.toJSONString(bizContent)); request.setBizContent(JSONObject.toJSONString(bizContent));
log.info("[支付宝][医保]交易退款接口-入参 {}", JSONObject.toJSONString(request)); log.info("[支付宝医保]交易退款接口-入参 {}", JSONObject.toJSONString(request));
AlipayTradeRefundApplyResponse response = alipayClient.execute(request); AlipayTradeRefundApplyResponse response = alipayClient.execute(request);
log.info("[支付宝][医保]交易退款接口-返回 {}", response.getBody()); log.info("[支付宝医保]交易退款接口-返回 {}", response.getBody());
if (response.isSuccess()) { if (response.isSuccess()) {
if ("REFUND_FAIL".equals(response.getRefundStatus())) { if ("REFUND_FAIL".equals(response.getRefundStatus())) {
log.info("[支付宝][医保]退款失败 outTradeNo={}, outRefundNo={}, refundStatus={}", outTradeNo, outRefundNo, response.getRefundStatus()); log.info("[支付宝医保]退款失败 outTradeNo={}, outRefundNo={}, refundStatus={}", outTradeNo, outRefundNo, response.getRefundStatus());
return null; return null;
} }
log.info("[支付宝][医保]退款成功 outTradeNo={}, outRefundNo={}, refundStatus={}", outTradeNo, outRefundNo, response.getRefundStatus()); log.info("[支付宝医保]退款成功 outTradeNo={}, outRefundNo={}, refundStatus={}", outTradeNo, outRefundNo, response.getRefundStatus());
return response; return response;
} }
} catch (Exception e) { } catch (Exception e) {
@ -336,7 +338,7 @@ public class AliMIHelper {
request.setBizContent(JSONObject.toJSONString(bizContent)); request.setBizContent(JSONObject.toJSONString(bizContent));
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
log.info("[支付宝]交易退款查询-返回 {}", response.getBody()); log.info("[支付宝医保]交易退款查询-返回 {}", response.getBody());
if (response.isSuccess()) { if (response.isSuccess()) {
return response.getBody(); return response.getBody();
} }

@ -1,9 +1,9 @@
package com.ynxbd.common.action.pay; package com.ynxbd.common.action.pay;
import com.alipay.api.domain.MedicalNationalPayAuthInfo; import com.alipay.api.domain.MedicalNationalPayAuthInfo;
import com.ynxbd.ali.config.AliMIConfig; import com.ynxbd.ali.config.AliMedConfig;
import com.ynxbd.ali.helper.AliHelper; import com.ynxbd.ali.helper.AliHelper;
import com.ynxbd.ali.helper.AliMIHelper; import com.ynxbd.ali.helper.AliMedHelper;
import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Order; import com.ynxbd.common.bean.pay.Order;
@ -90,8 +90,8 @@ public class AliPayAction extends BaseAction {
*/ */
@Action("medical_notify") @Action("medical_notify")
public Result medical_notify(String outTradeNo, String notifyType) { public Result medical_notify(String outTradeNo, String notifyType) {
// [支付宝][医保][收到通知] outTradeNo=ALI_1dedf988982a4142c20ee839d499, notifyType=recipe // [支付宝医保][收到通知] outTradeNo=ALI_1dedf988982a4142c20ee839d499, notifyType=recipe
log.info("[支付宝][医保][收到通知] outTradeNo={}, notifyType={}", outTradeNo, notifyType); log.info("[支付宝医保][收到通知] outTradeNo={}, notifyType={}", outTradeNo, notifyType);
if (outTradeNo == null || notifyType == null) { if (outTradeNo == null || notifyType == null) {
return Result.respStr(); return Result.respStr();
} }
@ -101,10 +101,10 @@ public class AliPayAction extends BaseAction {
log.info(order.getErrorMsg()); log.info(order.getErrorMsg());
return Result.error(order.getErrorMsg()); return Result.error(order.getErrorMsg());
} }
log.info("[支付宝][医保][收到通知] order={}", JsonHelper.toJsonString(order)); log.info("[支付宝医保][收到通知] order={}", JsonHelper.toJsonString(order));
try { try {
if (AliMIConfig.IS_DEV) { if (AliMedConfig.IS_DEV) {
Thread.sleep(1000 * 12); // 12s Thread.sleep(1000 * 12); // 12s
} }
String openid = order.getOpenid(); String openid = order.getOpenid();
@ -127,10 +127,10 @@ public class AliPayAction extends BaseAction {
*/ */
@Action("queryMIAuth") @Action("queryMIAuth")
public Result queryMIAuth(String openid, String accessToken, String patientName, String patientCardNo, String reqBizNo, String callUrl) { public Result queryMIAuth(String openid, String accessToken, String patientName, String patientCardNo, String reqBizNo, String callUrl) {
log.info("[支付宝][医保]授权查询 openid={}, accessToken={}, patientName={}, patientCardNo={}, reqBizNo={}, callUrl={}", openid, accessToken, patientName, patientCardNo, reqBizNo, callUrl); log.info("[支付宝医保]授权查询 openid={}, accessToken={}, patientName={}, patientCardNo={}, reqBizNo={}, callUrl={}", openid, accessToken, patientName, patientCardNo, reqBizNo, callUrl);
try { try {
MedicalNationalPayAuthInfo dataInfo = AliMIHelper.queryMIAuth(openid, accessToken, patientName, patientCardNo, reqBizNo, callUrl); MedicalNationalPayAuthInfo dataInfo = AliMedHelper.queryMIAuth(openid, accessToken, patientName, patientCardNo, reqBizNo, callUrl);
log.info("[支付宝][医保]授权查询 {}", JsonHelper.toJsonString(dataInfo)); log.info("[支付宝医保]授权查询 {}", JsonHelper.toJsonString(dataInfo));
if (dataInfo == null) { if (dataInfo == null) {
return Result.error("授权查询失败"); return Result.error("授权查询失败");
} }

@ -1,7 +1,7 @@
package com.ynxbd.common.action.pay; package com.ynxbd.common.action.pay;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ynxbd.ali.helper.AliMIHelper; import com.ynxbd.ali.helper.AliMedHelper;
import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Order; import com.ynxbd.common.bean.pay.Order;
@ -21,7 +21,7 @@ import com.ynxbd.common.service.MedicalService;
import com.ynxbd.common.service.params.RequestParams; import com.ynxbd.common.service.params.RequestParams;
import com.ynxbd.wx.wxfactory.*; import com.ynxbd.wx.wxfactory.*;
import com.ynxbd.wx.wxfactory.bean.*; import com.ynxbd.wx.wxfactory.bean.*;
import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import com.ynxbd.wx.wxfactory.utils.MdRespHelper; import com.ynxbd.wx.wxfactory.utils.MdRespHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
@ -117,7 +117,7 @@ public class MedicalAction extends BaseAction {
@Action("medicalAuth") @Action("medicalAuth")
public Result medicalAuth(String openid, String qrCode) { public Result medicalAuth(String openid, String qrCode) {
log.info("[医保建档] openid-{},qrCode={}", openid, qrCode); log.info("[医保建档] openid-{},qrCode={}", openid, qrCode);
MedicalUserInfo info = WxFactory.Medical.Common().getUserInfo(WechatMIConfig.PARTNER_URL, openid, qrCode); MedicalUserInfo info = WxFactory.Medical.Common().getUserInfo(WxMedConfig.PARTNER_URL, openid, qrCode);
log.info("[医保建档获取用户信息] resp-{}", info); log.info("[医保建档获取用户信息] resp-{}", info);
return Result.success(info); return Result.success(info);
} }
@ -220,6 +220,9 @@ public class MedicalAction extends BaseAction {
if (openid == null || qrCode == null || outTradeNo == null || tradeNo == null) { if (openid == null || qrCode == null || outTradeNo == null || tradeNo == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
if (!WxMedConfig.IS_DEV) {
return Result.error("环境异常调用失败");
}
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常 if (merchantEnum == null) { // 支付方式异常
@ -331,7 +334,7 @@ public class MedicalAction extends BaseAction {
return Result.error(order.getMessage()); return Result.error(order.getMessage());
} else if (merchantEnum.equals(MerchantEnum.ALI_MEDICAL)) { } else if (merchantEnum.equals(MerchantEnum.ALI_MEDICAL)) {
Order order = AliMIHelper.queryTrade(outTradeNo, medTransId); Order order = AliMedHelper.queryTrade(outTradeNo, medTransId);
order.setOrderObj(orderObj); order.setOrderObj(orderObj);
if (order.hasErrorMsg()) { if (order.hasErrorMsg()) {
return Result.error(order.getErrorMsg()); return Result.error(order.getErrorMsg());
@ -367,10 +370,10 @@ public class MedicalAction extends BaseAction {
@Action("payNotify") @Action("payNotify")
public Result payNotify() { public Result payNotify() {
try { try {
log.info("[微信][医保]回调通知..."); log.info("[微信医保]回调通知...");
MedicalNotify notifyInfo = WxMedicalHelper.paidMINotify(request); MedicalNotify notifyInfo = WxMedicalHelper.paidMINotify(request);
// 成功返回 // 成功返回
Result.respXml(MdRespHelper.respOk(WechatMIConfig.PAY_KEY)); Result.respXml(MdRespHelper.respOk(WxMedConfig.PAY_KEY));
String openid = notifyInfo.getOpenid(); String openid = notifyInfo.getOpenid();
String bankTransNo = notifyInfo.getMedTransId(); String bankTransNo = notifyInfo.getMedTransId();
@ -382,13 +385,13 @@ public class MedicalAction extends BaseAction {
String notifyType = notifyInfo.getAttach(); String notifyType = notifyInfo.getAttach();
log.info("[微信][医保][{}] 收到通知 outTradeNo={}, bankTransNo={}, notifyType={}", log.info("[微信医保][{}] 收到通知 outTradeNo={}, bankTransNo={}, notifyType={}",
notifyType, outTradeNo, bankTransNo, notifyType); notifyType, outTradeNo, bankTransNo, notifyType);
new MedicalService().commonNotify(MerchantEnum.WX_MEDICAL, notifyType, outTradeNo, totalFee, bankTransNo, payDate, payTime, openid, payInfo); new MedicalService().commonNotify(MerchantEnum.WX_MEDICAL, notifyType, outTradeNo, totalFee, bankTransNo, payDate, payTime, openid, payInfo);
return null; return null;
} catch (ServiceException e) { } catch (ServiceException e) {
return Result.respXml(MdRespHelper.resp(e, WechatMIConfig.PAY_KEY)); return Result.respXml(MdRespHelper.resp(e, WxMedConfig.PAY_KEY));
} }
} }

@ -1,22 +1,36 @@
package com.ynxbd.common.action.pay; package com.ynxbd.common.action.pay;
import com.ynxbd.ali.config.AliMIConfig; import com.alibaba.fastjson.JSONObject;
import com.ynxbd.ali.config.AliMedConfig;
import com.ynxbd.ali.helper.AliMedHelper;
import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.HisRecipe; import com.ynxbd.common.bean.HisRecipe;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.his.HisTreat;
import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.config.interceptor.AesDecode; import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.RecipeDao;
import com.ynxbd.common.dao.his.HisMIDao;
import com.ynxbd.common.dao.his.HisMITestDao; import com.ynxbd.common.dao.his.HisMITestDao;
import com.ynxbd.common.dao.his.HisTreatDao;
import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.common.service.RecipeService; import com.ynxbd.common.service.RecipeService;
import com.ynxbd.wx.wxfactory.WxCacheHelper;
import com.ynxbd.wx.wxfactory.WxMedicalHelper; import com.ynxbd.wx.wxfactory.WxMedicalHelper;
import com.ynxbd.wx.wxfactory.bean.MIOrder; import com.ynxbd.wx.wxfactory.bean.MIOrder;
import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.Namespace;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -38,7 +52,7 @@ public class MedicalTestAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
if (!WechatMIConfig.IS_DEV && !AliMIConfig.IS_DEV) { if (!WxMedConfig.IS_DEV && !AliMedConfig.IS_DEV) {
return Result.error("环境错误"); return Result.error("环境错误");
} }
@ -64,7 +78,7 @@ public class MedicalTestAction extends BaseAction {
if (patientId == null || begDate == null || endDate == null) { if (patientId == null || begDate == null || endDate == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
if (!WechatMIConfig.IS_DEV && !AliMIConfig.IS_DEV) { if (!WxMedConfig.IS_DEV && !AliMedConfig.IS_DEV) {
return Result.error("环境错误"); return Result.error("环境错误");
} }
@ -115,8 +129,7 @@ public class MedicalTestAction extends BaseAction {
*/ */
@Action("queryWxOrder") @Action("queryWxOrder")
public Result queryWxOrder(String accessToken, String outTradeNo, String medTransId) { public Result queryWxOrder(String accessToken, String outTradeNo, String medTransId) {
log.info("[医保]现金退费 outTradeNo={}, medTransId={}", outTradeNo, medTransId); log.info("[微信医保]订单查询 outTradeNo={}, medTransId={}", outTradeNo, medTransId);
MIOrder order = WxMedicalHelper.queryOrder(accessToken, outTradeNo, medTransId); MIOrder order = WxMedicalHelper.queryOrder(accessToken, outTradeNo, medTransId);
if (order.isOk()) { if (order.isOk()) {
return Result.success(order); return Result.success(order);
@ -125,6 +138,106 @@ public class MedicalTestAction extends BaseAction {
} }
/**
* [医保]HIS退费
*
*/
@Action("his_mi_refund")
public Result his_mi_refund(String payAuthNo, String tradeNo) {
log.info("[医保]HIS退费 payAuthNo={}, tradeNo={}", payAuthNo, tradeNo);
Recipe recipe = new RecipeDao().selectByTradeNo(tradeNo);
if (recipe == null) {
return Result.error(ResultEnum.DATA_NOT_FOUND);
}
if (!AliMedConfig.IS_DEV) {
return Result.error("环境异常调用失败");
}
log.info("[医保]HIS退费 rxInfo={}", JsonHelper.toJsonString(recipe));
String chrgBchno = recipe.getChrgBchno();
String bankTransNo = recipe.getBankTransNo();
BigDecimal cashFee = recipe.getPayMoney();
JsonResult jsonResult = HisMIDao.miRefund(MerchantEnum.ALI_MEDICAL, payAuthNo, chrgBchno.substring(1), bankTransNo, ("R" + tradeNo), cashFee);
return Result.success(jsonResult);
}
@Action("wx_med_refund_test")
public Result wx_med_refund_test() throws ServiceException {
WxMedicalHelper.refundCash("", "", new BigDecimal(""), "人工退费");
return Result.success();
}
@Action("ali_med_refund_test")
public Result ali_med_refund_test() throws Exception {
AliMedHelper.refundTrade("ALI_bb3c58c912384d6dc15affefad73", "ORD530100202509251522130008038", null, new BigDecimal("3.95"), "医保退费");
return Result.success();
}
@Action("wx_med_add_order")
public Result wx_med_add_order(String outTradeNo) {
try {
log.info("[医保]补充订单数据 outTradeNo={}", outTradeNo);
MIOrder order = WxMedicalHelper.queryOrder(WxCacheHelper.getAccessToken(), outTradeNo, null);
if (order == null || !order.isOk()) {
return Result.error("订单未找到");
}
if (!"PAYED".equals(order.getInsuranceTradeStatus())) {
return Result.error("订单未支付");
}
Recipe recipe = new Recipe();
recipe.setUpdateTime(new Date());
recipe.setOpenid(order.getOpenid());
recipe.setPayStatus(0);
recipe.setHisStatus(-1);
recipe.setOutTradeNo(outTradeNo);
recipe.setChrgBchno(order.getSerialNo());
recipe.setBankTransNo(order.getMedTransId());
JSONObject jsonObject = JsonHelper.parseObject(order.getRequestContent());
String payOrdId = jsonObject.getString("payOrdId");
recipe.setTradeNo(payOrdId);
recipe.setPayOrdId(payOrdId);
// ==========================
recipe.setPatientId("1xbd");
recipe.setMdTrtId("xbd-med");
recipe.setMdUserId("xbd-med");
recipe.setPayWay("0");
recipe.setHisResult("订单未调用HIS接口");
recipe.setTotalFee(order.getTotalFee());
recipe.setPayMoney(order.getCashFee());
recipe.setAcctFee(order.getInsuranceSelfFee());
recipe.setHifpFee(order.getInsuranceFundFee());
String body = order.getBody();
String treatNum = body == null ? null : body.substring(4);
recipe.setTreatNum(treatNum);
if (treatNum != null) {
List<HisTreat> dataList = new HisTreatDao().getInfoByTreatNum(treatNum);
if (!dataList.isEmpty()) {
HisTreat hisTreat = dataList.get(0);
if (hisTreat != null) {
recipe.setPatientId(hisTreat.getPatientId());
recipe.setDeptCode(hisTreat.getDeptCode());
recipe.setDeptName(hisTreat.getDeptName());
}
}
}
if (new RecipeDao().insertMedical(recipe)) {
log.info("[医保]补充订单数据 recipe={}", JsonHelper.toJsonString(recipe));
}
return Result.success();
} catch (Exception e) {
log.error("异常:{}", e.getMessage());
}
return Result.success();
}
// //
// /** // /**
@ -166,4 +279,5 @@ public class MedicalTestAction extends BaseAction {
// return Result.success(jsonResult); // return Result.success(jsonResult);
// } // }
} }

@ -1,28 +1,16 @@
package com.ynxbd.common.action.test; package com.ynxbd.common.action.test;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.ali.helper.AliMIHelper;
import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.his.HisTreat;
import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.dao.RecipeDao;
import com.ynxbd.common.dao.his.HisTreatDao;
import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException; import com.ynxbd.common.result.ServiceException;
import com.ynxbd.wx.wxfactory.WxCacheHelper; import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import com.ynxbd.wx.wxfactory.WxMedicalHelper;
import com.ynxbd.wx.wxfactory.bean.MIOrder;
import com.ynxbd.wx.wxfactory.medical.WechatMIConfig;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.Namespace;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* @Author wsq * @Author wsq
@ -80,88 +68,14 @@ public class TestAction extends BaseAction {
@Action("test03") @Action("test03")
public Result test03() throws ServiceException { public Result test03() throws ServiceException {
System.out.println("开关" + WechatMIConfig.IS_AUTO_REFUND); System.out.println("开关" + WxMedConfig.IS_AUTO_REFUND);
log.info("日志测试"); log.info("日志测试");
System.out.println(System.getProperty("fileEncoding")); System.out.println(System.getProperty("fileEncoding"));
System.out.println(System.getProperty("encoding")); System.out.println(System.getProperty("encoding"));
return Result.success(); return Result.success();
} }
@Action("wx_med_refund_test")
public Result wx_med_refund_test() throws ServiceException {
WxMedicalHelper.refundCash("WX_M202f622bb3444a033f7a014a421b", "ORD530100202505100932115202726", new BigDecimal("183.390"), "人工退费");
return Result.success();
}
@Action("ali_med_refund_test")
public Result ali_med_refund_test() throws Exception {
AliMIHelper.refundTrade("", "", null, new BigDecimal(""), "退费测试");
return Result.success();
}
@Action("md_add")
public Result md_add(String outTradeNo) {
try {
log.info("[医保]补充订单数据 outTradeNo={}", outTradeNo);
MIOrder order = WxMedicalHelper.queryOrder(WxCacheHelper.getAccessToken(), outTradeNo, null);
if (order == null || !order.isOk()) {
return Result.error("订单未找到");
}
if (!"PAYED".equals(order.getInsuranceTradeStatus())) {
return Result.error("订单未支付");
}
Recipe recipe = new Recipe();
recipe.setUpdateTime(new Date());
recipe.setOpenid(order.getOpenid());
recipe.setPayStatus(0);
recipe.setHisStatus(-1);
recipe.setOutTradeNo(outTradeNo);
recipe.setChrgBchno(order.getSerialNo());
recipe.setBankTransNo(order.getMedTransId());
JSONObject jsonObject = JsonHelper.parseObject(order.getRequestContent());
String payOrdId = jsonObject.getString("payOrdId");
recipe.setTradeNo(payOrdId);
recipe.setPayOrdId(payOrdId);
// ==========================
recipe.setPatientId("1xbd");
recipe.setMdTrtId("xbd-med");
recipe.setMdUserId("xbd-med");
recipe.setPayWay("0");
recipe.setHisResult("订单未调用HIS接口");
recipe.setTotalFee(order.getTotalFee());
recipe.setPayMoney(order.getCashFee());
recipe.setAcctFee(order.getInsuranceSelfFee());
recipe.setHifpFee(order.getInsuranceFundFee());
String body = order.getBody();
String treatNum = body == null ? null : body.substring(4);
recipe.setTreatNum(treatNum);
if (treatNum != null) {
List<HisTreat> dataList = new HisTreatDao().getInfoByTreatNum(treatNum);
if (!dataList.isEmpty()) {
HisTreat hisTreat = dataList.get(0);
if (hisTreat != null) {
recipe.setPatientId(hisTreat.getPatientId());
recipe.setDeptCode(hisTreat.getDeptCode());
recipe.setDeptName(hisTreat.getDeptName());
}
}
}
if (new RecipeDao().insertMedical(recipe)) {
log.info("[医保]补充订单数据 recipe={}", JsonHelper.toJsonString(recipe));
}
return Result.success();
} catch (Exception e) {
log.error("异常:{}", e.getMessage());
}
return Result.success();
}
// @Action("lock") // @Action("lock")

@ -1,7 +1,7 @@
package com.ynxbd.common.bean.enums; package com.ynxbd.common.bean.enums;
import com.ynxbd.ali.config.AliMIConfig; import com.ynxbd.ali.config.AliMedConfig;
import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import lombok.ToString; import lombok.ToString;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
@ -47,7 +47,7 @@ public enum MerchantEnum {
"20", "21", "22"), "20", "21", "22"),
WX_MEDICAL("wx_medical", "【微信医保】", WX_MEDICAL("wx_medical", "【微信医保】",
WechatMIConfig.IS_DEV, WxMedConfig.IS_DEV,
"4", "4",
"10,11,12,13,14,15", "10,11,12,13,14,15",
"medical/payNotify", "medical/payNotify",
@ -55,7 +55,7 @@ public enum MerchantEnum {
"0", "1", "2"), "0", "1", "2"),
ALI_MEDICAL("ali_medical", "【支付宝医保】", ALI_MEDICAL("ali_medical", "【支付宝医保】",
AliMIConfig.IS_DEV, AliMedConfig.IS_DEV,
"3", "3",
"25,26,27,28,29,30", "25,26,27,28,29,30",
"ali_pay/medical_notify", "ali_pay/medical_notify",

@ -14,6 +14,7 @@ import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.wx.wxfactory.bean.MedicalInfo; import com.ynxbd.wx.wxfactory.bean.MedicalInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -22,6 +23,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
// HIS医保接口 // HIS医保接口
@Slf4j
public class HisMIDao { public class HisMIDao {
/** /**
@ -204,9 +206,9 @@ public class HisMIDao {
params.put("PayAuthNo", payAuthNo); // AUTH530100202206291132200000008 params.put("PayAuthNo", payAuthNo); // AUTH530100202206291132200000008
params.put("FPNum", fpNum); params.put("FPNum", fpNum);
params.put("PayWay", "4"); params.put("PayWay", "4");
params.put("PayDeviceID", "mobile");
params.put("BankTransNo", bankTransNo); params.put("BankTransNo", bankTransNo);
params.put("TransNo", refundTradeNo); params.put("TransNo", refundTradeNo);
params.put("PayDeviceID", "mobile");
params.put("PayMoney", cashFee); // 现金部分 params.put("PayMoney", cashFee); // 现金部分
}); });
} }

@ -2,8 +2,8 @@ package com.ynxbd.common.service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alipay.api.response.AlipayTradeRefundApplyResponse; import com.alipay.api.response.AlipayTradeRefundApplyResponse;
import com.ynxbd.ali.config.AliMIConfig; import com.ynxbd.ali.config.AliMedConfig;
import com.ynxbd.ali.helper.AliMIHelper; import com.ynxbd.ali.helper.AliMedHelper;
import com.ynxbd.common.action.pay.PEnum; import com.ynxbd.common.action.pay.PEnum;
import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.*; import com.ynxbd.common.bean.pay.*;
@ -23,7 +23,7 @@ import com.ynxbd.wx.wxfactory.bean.MedicalInfo;
import com.ynxbd.wx.wxfactory.bean.MIOrder; import com.ynxbd.wx.wxfactory.bean.MIOrder;
import com.ynxbd.wx.wxfactory.bean.MedicalUserInfo; import com.ynxbd.wx.wxfactory.bean.MedicalUserInfo;
import com.ynxbd.wx.wxfactory.bean.OrderMIEnum; import com.ynxbd.wx.wxfactory.bean.OrderMIEnum;
import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
@ -38,7 +38,7 @@ public class MedicalService {
if (ObjectUtils.isEmpty(openid)) { if (ObjectUtils.isEmpty(openid)) {
return null; return null;
} }
return openid.equals(WechatMIConfig.DEV_OPENID) || openid.equals(AliMIConfig.DEV_OPENID); return openid.equals(WxMedConfig.DEV_OPENID) || openid.equals(AliMedConfig.DEV_OPENID);
} }
public void commonNotify(MerchantEnum merchantEnum, String notifyType, String outTradeNo, BigDecimal totalFee, String bankTransNo, String payDate, String payTime, String openid, String payInfo) { public void commonNotify(MerchantEnum merchantEnum, String notifyType, String outTradeNo, BigDecimal totalFee, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
@ -114,7 +114,8 @@ public class MedicalService {
payAuthNo = userInfo.getPayAuthNo(); payAuthNo = userInfo.getPayAuthNo();
} }
log.info("[医保]上传明细:patientId={}, totalFee={}, cardNo={}, recipeJson={}", patientId, totalFee, cardNo, recipeJson); // 测试报告内容[2]
log.info("{}[HIS医保上传明细] req={patientId:{}, treatNum={}, totalFee:{}, cardNo:{}, recipeJson:{}}", merchantEnum.NAME, patientId, treatNum, totalFee, cardNo, recipeJson);
JsonResult result = HisMIDao.rxMIUploadFeeDetails(merchantEnum, payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName); JsonResult result = HisMIDao.rxMIUploadFeeDetails(merchantEnum, payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName);
return hisMIPlaceOrder(merchantEnum, payAuthNo, result); return hisMIPlaceOrder(merchantEnum, payAuthNo, result);
} }
@ -216,9 +217,9 @@ public class MedicalService {
throw new ServiceException("【支付宝】医保授权码medicalCardId为空"); throw new ServiceException("【支付宝】医保授权码medicalCardId为空");
} }
Order order = hasDBOrder ? AliMIHelper.queryTrade(outTradeNo, null) : new Order(); Order order = hasDBOrder ? AliMedHelper.queryTrade(outTradeNo, null) : new Order();
String notifyUrl = WeChatConfig.getHttpsBaseUrl() + merchantEnum.getNotifyUrl(outTradeNo, notifyType); String notifyUrl = WeChatConfig.getHttpsBaseUrl() + merchantEnum.getNotifyUrl(outTradeNo, notifyType);
Map<String, Object> map = AliMIHelper.createOrder(orderMIEnum, Map<String, Object> map = AliMedHelper.createOrder(orderMIEnum,
openid, openid,
outTradeNo, outTradeNo,
chrgBchno, chrgBchno,
@ -504,7 +505,7 @@ public class MedicalService {
return false; return false;
} }
if (!WechatMIConfig.IS_AUTO_REFUND) { if (!WxMedConfig.IS_AUTO_REFUND) {
log.info("[医保][挂号]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo); log.info("[医保][挂号]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
return false; return false;
} }
@ -536,7 +537,7 @@ public class MedicalService {
apiResult.setSuccess(order.isOk()); apiResult.setSuccess(order.isOk());
apiResult.setMessage(order.isOk() ? WxPayHelper.OK : order.getMessage()); apiResult.setMessage(order.isOk() ? WxPayHelper.OK : order.getMessage());
} else { } else {
log.info("[支付宝][医保]未开通自动退费....."); log.info("[支付宝医保]未开通自动退费.....");
apiResult.setMessage("[支付宝]未启用自动退费"); apiResult.setMessage("[支付宝]未启用自动退费");
} }
return apiResult; return apiResult;
@ -626,7 +627,7 @@ public class MedicalService {
return false; return false;
} }
if (!WechatMIConfig.IS_AUTO_REFUND) { if (!WxMedConfig.IS_AUTO_REFUND) {
log.info("[医保][处方][现金自动退费]功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo); log.info("[医保][处方][现金自动退费]功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
return false; return false;
} }
@ -679,7 +680,7 @@ public class MedicalService {
// 医保退费-必须先执行 // 医保退费-必须先执行
log.info("[医保][处方][个账]退费开始 tradeNo={}, payAuthNo={}, fpNum={}", tradeNo, payAuthNo, fpNum); log.info("[医保][处方][个账]退费开始 tradeNo={}, payAuthNo={}, fpNum={}", tradeNo, payAuthNo, fpNum);
JsonResult jsonResult = HisMIDao.miRefund(MerchantEnum.WX, payAuthNo, fpNum, bankTransNo, ("R" + tradeNo), cashFee); JsonResult jsonResult = HisMIDao.miRefund(MerchantEnum.WX_MEDICAL, payAuthNo, fpNum, bankTransNo, ("R" + tradeNo), cashFee);
if (!jsonResult.success()) { // 失败 if (!jsonResult.success()) { // 失败
log.info("[医保][处方][个账]退费失败 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo); log.info("[医保][处方][个账]退费失败 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
String message = jsonResult.getMessage(); String message = jsonResult.getMessage();
@ -724,7 +725,7 @@ public class MedicalService {
} else { } else {
// 支付宝 // 支付宝
AlipayTradeRefundApplyResponse respBody = AliMIHelper.refundTrade(outTradeNo, outRefundNo, tradeNo, cashFee, "线上退费"); AlipayTradeRefundApplyResponse respBody = AliMedHelper.refundTrade(outTradeNo, outRefundNo, tradeNo, cashFee, "线上退费");
boolean isOk = respBody != null; boolean isOk = respBody != null;
log.info("[支付宝][处方][现金]退费{} outTradeNo={}, bankTransNo={}, tradeNo={}", (isOk ? "成功" : "失败"), outTradeNo, bankTransNo, tradeNo); log.info("[支付宝][处方][现金]退费{} outTradeNo={}, bankTransNo={}, tradeNo={}", (isOk ? "成功" : "失败"), outTradeNo, bankTransNo, tradeNo);
if (isOk) { if (isOk) {

@ -9,7 +9,7 @@ import com.ynxbd.wx.config.WeChatConfig;
import com.ynxbd.wx.wxfactory.base.auth.models.RespAccessToken; import com.ynxbd.wx.wxfactory.base.auth.models.RespAccessToken;
import com.ynxbd.wx.wxfactory.base.auth.models.RespJsapiTicket; import com.ynxbd.wx.wxfactory.base.auth.models.RespJsapiTicket;
import com.ynxbd.wx.wxfactory.bean.*; import com.ynxbd.wx.wxfactory.bean.*;
import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import com.ynxbd.wx.wxfactory.medical.enums.MdRefundTypeEnum; import com.ynxbd.wx.wxfactory.medical.enums.MdRefundTypeEnum;
import com.ynxbd.wx.wxfactory.utils.WxSignHelper; import com.ynxbd.wx.wxfactory.utils.WxSignHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -34,7 +34,7 @@ public class WxMedicalHelper {
*/ */
public static MedicalUserInfo getUserInfo(String openid, String qrCode, String cardNo, String realName) throws ServiceException { public static MedicalUserInfo getUserInfo(String openid, String qrCode, String cardNo, String realName) throws ServiceException {
log.info("[医保]获取用户信息 openid={}, qrCode={}", openid, qrCode); log.info("[医保]获取用户信息 openid={}, qrCode={}", openid, qrCode);
MedicalUserInfo info = WxFactory.Medical.Common().getUserInfo(WechatMIConfig.PARTNER_URL, openid, qrCode); MedicalUserInfo info = WxFactory.Medical.Common().getUserInfo(WxMedConfig.PARTNER_URL, openid, qrCode);
if (info == null || !info.isSuccess()) { if (info == null || !info.isSuccess()) {
String message = info == null ? "授权失败" : info.getMessage(); String message = info == null ? "授权失败" : info.getMessage();
log.info("[医保授权]失败 {}", message); log.info("[医保授权]失败 {}", message);
@ -78,7 +78,7 @@ public class WxMedicalHelper {
} }
// 签名验证 // 签名验证
if (!WxSignHelper.validateSign(paramsMap, WechatMIConfig.PAY_KEY)) { // 验证未通过,通知支付失败 if (!WxSignHelper.validateSign(paramsMap, WxMedConfig.PAY_KEY)) { // 验证未通过,通知支付失败
throw new ServiceException("[医保]回调通知签名验证未通过!"); throw new ServiceException("[医保]回调通知签名验证未通过!");
} }
@ -156,8 +156,8 @@ public class WxMedicalHelper {
, outTradeNo, openid, cardNo, realName, payOrdId, payAuthNo, totalFee, insuranceFee, cashFee, familyType, familyName, familyCardNo); , outTradeNo, openid, cardNo, realName, payOrdId, payAuthNo, totalFee, insuranceFee, cashFee, familyType, familyName, familyCardNo);
MedicalPayOrder order = WxFactory.Medical.Common().createOrder(OrderMIEnum, WxCacheHelper.getAccessToken(), MedicalPayOrder order = WxFactory.Medical.Common().createOrder(OrderMIEnum, WxCacheHelper.getAccessToken(),
WechatMIConfig.MD_APP_ID, WeChatConfig.MCH_ID, WechatMIConfig.PAY_KEY, WxMedConfig.MD_APP_ID, WeChatConfig.MCH_ID, WxMedConfig.PAY_KEY,
WechatMIConfig.CITY_CODE, WechatMIConfig.HOSPITAL_NAME, WechatMIConfig.ORG_NO, WechatMIConfig.CHANNEL, WxMedConfig.CITY_CODE, WxMedConfig.HOSPITAL_NAME, WxMedConfig.ORG_NO, WxMedConfig.CHANNEL,
openid, openid,
payAuthNo, payAuthNo,
payOrdId, payOrdId,
@ -204,9 +204,9 @@ public class WxMedicalHelper {
public static MIOrder queryOrder(String accessToken, String outTradeNo, String medTransId) { public static MIOrder queryOrder(String accessToken, String outTradeNo, String medTransId) {
return WxFactory.Medical.Common().queryOrder( return WxFactory.Medical.Common().queryOrder(
accessToken, accessToken,
WechatMIConfig.MD_APP_ID, WxMedConfig.MD_APP_ID,
WeChatConfig.MCH_ID, WeChatConfig.MCH_ID,
WechatMIConfig.PAY_KEY, WxMedConfig.PAY_KEY,
outTradeNo, outTradeNo,
medTransId); medTransId);
} }
@ -252,9 +252,9 @@ public class WxMedicalHelper {
public static MIOrder refund(String outTradeNo, String outRefundNo, String payOrdId, BigDecimal cashFee, String reason) { public static MIOrder refund(String outTradeNo, String outRefundNo, String payOrdId, BigDecimal cashFee, String reason) {
return WxFactory.Medical.Common().refund( return WxFactory.Medical.Common().refund(
WxCacheHelper.getAccessToken(), WxCacheHelper.getAccessToken(),
WechatMIConfig.MD_APP_ID, WxMedConfig.MD_APP_ID,
WeChatConfig.MCH_ID, WeChatConfig.MCH_ID,
WechatMIConfig.PAY_KEY, WxMedConfig.PAY_KEY,
outTradeNo, outTradeNo,
outRefundNo, outRefundNo,
payOrdId, payOrdId,
@ -270,9 +270,9 @@ public class WxMedicalHelper {
public static MIOrder refundCash(String outTradeNo, String outRefundNo, String payOrdId, BigDecimal cashFee, String reason) { public static MIOrder refundCash(String outTradeNo, String outRefundNo, String payOrdId, BigDecimal cashFee, String reason) {
return WxFactory.Medical.Common().refund( return WxFactory.Medical.Common().refund(
WxCacheHelper.getAccessToken(), WxCacheHelper.getAccessToken(),
WechatMIConfig.MD_APP_ID, WxMedConfig.MD_APP_ID,
WeChatConfig.MCH_ID, WeChatConfig.MCH_ID,
WechatMIConfig.PAY_KEY, WxMedConfig.PAY_KEY,
outTradeNo, outTradeNo,
outRefundNo, outRefundNo,
payOrdId, payOrdId,
@ -297,9 +297,9 @@ public class WxMedicalHelper {
return WxFactory.Medical.Common().downBill( return WxFactory.Medical.Common().downBill(
WxCacheHelper.getAccessToken(), WxCacheHelper.getAccessToken(),
WechatMIConfig.MD_APP_ID, WxMedConfig.MD_APP_ID,
WeChatConfig.MCH_ID, WeChatConfig.MCH_ID,
WechatMIConfig.PAY_KEY, WxMedConfig.PAY_KEY,
billDate, billDate,
billType); billType);
} }
@ -311,9 +311,9 @@ public class WxMedicalHelper {
public static MedicalRefundInfo queryRefund(String accessToken, String outTradeNo, String mdTransId) { public static MedicalRefundInfo queryRefund(String accessToken, String outTradeNo, String mdTransId) {
return WxFactory.Medical.Common().queryRefund( return WxFactory.Medical.Common().queryRefund(
accessToken, accessToken,
WechatMIConfig.MD_APP_ID, WxMedConfig.MD_APP_ID,
WeChatConfig.MCH_ID, WeChatConfig.MCH_ID,
WechatMIConfig.PAY_KEY, WxMedConfig.PAY_KEY,
outTradeNo, outTradeNo,
mdTransId); mdTransId);
} }
@ -330,7 +330,7 @@ public class WxMedicalHelper {
return cacheToken; return cacheToken;
} }
RespAccessToken response = WxFactory.Base.OAuth().getAccessToken(WechatMIConfig.MD_APP_ID, WechatMIConfig.MD_APP_SECRET); RespAccessToken response = WxFactory.Base.OAuth().getAccessToken(WxMedConfig.MD_APP_ID, WxMedConfig.MD_APP_SECRET);
if (!response.isSuccess()) { if (!response.isSuccess()) {
log.error("[微信]access_token请求失败 code={}, message={}", response.getErrCode(), response.getErrMsg()); log.error("[微信]access_token请求失败 code={}, message={}", response.getErrCode(), response.getErrMsg());
return null; return null;

@ -2,7 +2,7 @@ package com.ynxbd.wx.wxfactory;
import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResult;
import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.config.WeChatConfig;
import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import com.ynxbd.wx.wxfactory.message.MdClient; import com.ynxbd.wx.wxfactory.message.MdClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -26,7 +26,7 @@ public class WxMessageHelper {
public static void regPush(String url, Integer status, String patCardNo, String patName, String patHospitalId, String deptName, String docName, String appointmentTime, String memo) { public static void regPush(String url, Integer status, String patCardNo, String patName, String patHospitalId, String deptName, String docName, String appointmentTime, String memo) {
JsonResult result = new MdClient().push(WxCacheHelper.getAccessToken(), WeChatConfig.APP_ID, 9001, "123", JsonResult result = new MdClient().push(WxCacheHelper.getAccessToken(), WeChatConfig.APP_ID, 9001, "123",
messageType -> messageType.reg( messageType -> messageType.reg(
WechatMIConfig.HOSPITAL_NAME, WxMedConfig.HOSPITAL_NAME,
url, url,
status, status,
patCardNo, patCardNo,

@ -7,7 +7,6 @@ import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.http.OkHttpHelper; import com.ynxbd.common.helper.http.OkHttpHelper;
import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResult;
import com.ynxbd.wx.wxfactory.WxFactory;
import com.ynxbd.wx.wxfactory.bean.*; import com.ynxbd.wx.wxfactory.bean.*;
import com.ynxbd.wx.wxfactory.medical.enums.MdRefundTypeEnum; import com.ynxbd.wx.wxfactory.medical.enums.MdRefundTypeEnum;
import com.ynxbd.wx.wxfactory.utils.WxRequestHelper; import com.ynxbd.wx.wxfactory.utils.WxRequestHelper;
@ -32,7 +31,7 @@ public class Client {
* @param url url * @param url url
*/ */
public String getAuthUrl(String url) { public String getAuthUrl(String url) {
String configUrl = WechatMIConfig.getConfigUrl(url); String configUrl = WxMedConfig.getConfigUrl(url);
log.info("[医保]免密授权地址-{}", configUrl); log.info("[医保]免密授权地址-{}", configUrl);
return configUrl; return configUrl;
} }
@ -118,7 +117,7 @@ public class Client {
//========================================================== //==========================================================
params.put("hospital_name", hospitalName); // params.put("hospital_name", hospitalName); //
if (WechatMIConfig.IS_DEV) { if (WxMedConfig.IS_DEV) {
params.put("use_sandbox", 1); params.put("use_sandbox", 1);
} }
@ -141,10 +140,11 @@ public class Client {
params.put("channel_no", channel); // 渠道号 params.put("channel_no", channel); // 渠道号
//---------------------------------------------------------------- //----------------------------------------------------------------
params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey)); params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
log.info("[医保][下单] req={}", JsonHelper.toJsonString(params)); // [微信医保]测试报告内容[3]
log.info("[微信医保][下单] req={}", JsonHelper.toJsonString(params));
}); });
log.info("[医保][下单] resp={}", JsonHelper.toJsonString(jsonResult)); log.info("[微信医保][下单] resp={}", JsonHelper.toJsonString(jsonResult));
if (!jsonResult.success()) { if (!jsonResult.success()) {
return new MedicalPayOrder().createResult(jsonResult); return new MedicalPayOrder().createResult(jsonResult);
} }
@ -325,11 +325,11 @@ public class Client {
* @return 用户信息 * @return 用户信息
*/ */
public MedicalUserInfo getUserInfo(String reqUrl, String openid, String qrcode) { public MedicalUserInfo getUserInfo(String reqUrl, String openid, String qrcode) {
log.info("[医保]用户授权地址-{}", reqUrl); log.info("[微信医保][授权]请求地址-{}", reqUrl);
MedicalUserInfo info = new MedicalUserInfo(); MedicalUserInfo info = new MedicalUserInfo();
String timestamp = Long.toString(System.currentTimeMillis()); String timestamp = Long.toString(System.currentTimeMillis());
String signature = WechatMIConfig.createSignature(timestamp); String signature = WxMedConfig.createSignature(timestamp);
if (signature == null) { if (signature == null) {
info.setMessage("signature签名错误"); info.setMessage("signature签名错误");
return info; return info;
@ -337,7 +337,8 @@ public class Client {
JSONObject respJson = OkHttpHelper.postForm(reqUrl, params -> { JSONObject respJson = OkHttpHelper.postForm(reqUrl, params -> {
params.put("qrcode", qrcode); params.put("qrcode", qrcode);
params.put("openid", openid); params.put("openid", openid);
log.info("[医保][授权] req={}", JsonHelper.toJsonString(params)); // [微信医保]测试报告内容[1]
log.info("[微信医保][授权] req={}", JsonHelper.toJsonString(params));
}, headers -> { }, headers -> {
headers.set("Accept", "application/json"); headers.set("Accept", "application/json");
headers.set("Content-Type", "application/json"); headers.set("Content-Type", "application/json");
@ -353,7 +354,7 @@ public class Client {
String code = respJson.getString("code"); String code = respJson.getString("code");
String message = respJson.getString("message"); String message = respJson.getString("message");
if (!"0".equals(code)) { if (!"0".equals(code)) {
log.error("[医保授权]失败 resp={}", respJson); log.error("[微信医保][授权]失败 resp={}", respJson);
info.setMessage(String.format("[%s] %s", code, message)); info.setMessage(String.format("[%s] %s", code, message));
return info; return info;
@ -375,7 +376,7 @@ public class Client {
info.setCardNo(cardNo); info.setCardNo(cardNo);
respJson.remove("user_card_no"); respJson.remove("user_card_no");
} }
log.error("[医保授权]返回 resp={}", respJson); log.error("[微信医保][授权]返回 resp={}", respJson);
info.setUserName(userName); info.setUserName(userName);
info.setPayAuthNo(payAuthNo); info.setPayAuthNo(payAuthNo);

@ -9,8 +9,8 @@ import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
public class WechatMIConfig { public class WxMedConfig {
private WechatMIConfig() { private WxMedConfig() {
} }
// 免密授权 // 免密授权

@ -1,14 +1,15 @@
# \u533B\u4FDD\u914D\u7F6E # \u533B\u4FDD\u914D\u7F6E
mi_ali.is_dev=true med_ali.is_dev=true
mi_ali.is_enable=true med_ali.is_enable=true
mi_ali.is_auto_refund=true med_ali.is_auto_refund=true
# \u5B9A\u70B9\u533B\u7597\u673A\u6784\u540D\u79F0\uFF08\u652F\u4ED8\u5B9D\u53EF\u80FD\u4E0D\u540C\uFF09 # \u5B9A\u70B9\u533B\u7597\u673A\u6784\u540D\u79F0\uFF08\u652F\u4ED8\u5B9D\u53EF\u80FD\u4E0D\u540C\uFF09
mi_ali.org_hospital_name=\u4E91\u5357\u7701\u6EC7\u5357\u4E2D\u5FC3\u533B\u9662 med_ali.org_hospital_name=\u4E91\u5357\u7701\u6EC7\u5357\u4E2D\u5FC3\u533B\u9662
# \u57CE\u5E02\u7F16\u7801
med_ali.city_code=530700
# \u533B\u4FDD\uFF08PDF\u6587\u6863\uFF09---------------------------------------------------------------------------------- # \u533B\u4FDD\uFF08PDF\u6587\u6863\uFF09----------------------------------------------------------------------------------
# \u5B9A\u70B9\u533B\u836F\u673A\u6784\u7F16\u7801 # \u5B9A\u70B9\u533B\u836F\u673A\u6784\u7F16\u7801
mi_ali.org_no=H53250301796 med_ali.org_no=H53250301796
# \u5B9A\u70B9\u533B\u836F\u673A\u6784\u5C0F\u7A0B\u5E8F/h5\u5E94\u7528id\uFF08\u6B63\u5F0F\u73AF\u5883\uFF1A\u6E20\u9053\u7F16\u53F7\uFF09 # \u5B9A\u70B9\u533B\u836F\u673A\u6784\u5C0F\u7A0B\u5E8F/h5\u5E94\u7528id\uFF08\u6B63\u5F0F\u73AF\u5883\uFF1A\u6E20\u9053\u7F16\u53F7\uFF09
mi_ali.org_app_id=1J06MILHV0JM4460C80A0000F05B9B68 med_ali.org_app_id=1J06MILHV0JM4460C80A0000F05B9B68
# \u5B9A\u70B9\u533B\u836F\u673A\u6784\u6E20\u9053\u8BA4\u8BC1\u7F16\u7801 # \u5B9A\u70B9\u533B\u836F\u673A\u6784\u6E20\u9053\u8BA4\u8BC1\u7F16\u7801
mi_ali.org_chnl_crtf_codg=BqK1kMStlhVDgN2uHf4EsP9BQzovPtfTZGwRsyhqMMY05hWhBzmfAN/glcC2Qe8q med_ali.org_chnl_crtf_codg=BqK1kMStlhVDgN2uHf4EsP9BQzovPtfTZGwRsyhqMMY05hWhBzmfAN/glcC2Qe8q

Loading…
Cancel
Save