1、支付宝医保接口调整,日志打印调整,自动退费调整

debug
wangsq 2 weeks ago
parent 310c580dbb
commit 1cff6ab923
  1. 6
      src/main/java/com/ynxbd/ali/helper/AliMedicalHelper.java
  2. 13
      src/main/java/com/ynxbd/common/action/XBDAction.java
  3. 12
      src/main/java/com/ynxbd/common/action/pay/AliPayAction.java
  4. 40
      src/main/java/com/ynxbd/common/action/pay/MedicalAction.java
  5. 23
      src/main/java/com/ynxbd/common/bean/pay/ApiResult.java
  6. 65
      src/main/java/com/ynxbd/common/service/MedicalService.java
  7. 2
      src/main/java/com/ynxbd/wx/wxfactory/WxMedicalHelper.java

@ -109,9 +109,9 @@ public class AliMedicalHelper {
return null;
}
public static AlipayClient getGBKAliClient() {
return new DefaultAlipayClient(AliConfig.SERVICE_URL, AliConfig.APP_ID, AliConfig.APP_PRIVATE_KEY, "json", "GBK", AliConfig.ALI_PUBLIC_KEY, "RSA2");
}
// public static AlipayClient getGBKAliClient() {
// return new DefaultAlipayClient(AliConfig.SERVICE_URL, AliConfig.APP_ID, AliConfig.APP_PRIVATE_KEY, "json", "GBK", AliConfig.ALI_PUBLIC_KEY, "RSA2");
// }
/**

@ -23,6 +23,9 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import java.util.HashMap;
import java.util.Map;
/**
* @author 李进才
* @ClassName XBDAction
@ -151,7 +154,7 @@ public class XBDAction extends BaseAction {
* @return 成功行数
*/
@Action("addMRReserve")
public Result addMRReserve(String openId, String patientId, String zyNum, String applyName, String relationship, String useToNo, String useToName, int getWay, String address, String phone, String ptImg1, String ptImg2, String ptImg3, String applyPtImg1, String applyPtImg2, String applicationImg) {
public Result addMRReserve(String openId, String patientId, String zyNum, String applyName, String relationship, String useToNo, String useToName, int getWay, String address, String phone, String ptImg1, String ptImg2, String ptImg3, String ptImg4, String ptImg5, String ptImg6, String applyPtImg1, String applyPtImg2, String applicationImg) {
try {
log.info("[病历复印]patientId-{},zyNum-{},applyName-{},useToNo-{},useToName-{},getWay-{},address-{},phone-{}", patientId, zyNum, applyName, useToNo, useToName, getWay, address, phone);
if (ObjectUtils.isEmpty(openId) || ObjectUtils.isEmpty(patientId)) {
@ -186,6 +189,14 @@ public class XBDAction extends BaseAction {
params.put("ptImg1", ptImg1);
params.put("ptImg2", ptImg2);
params.put("ptImg3", ptImg3);
params.put("ptImg4", ptImg4);
if (ptImg5 != null) {
params.put("ptImg5", ptImg5);
}
if (ptImg6 != null) {
params.put("ptImg6", ptImg6);
}
params.put("applyPtImg1", applyPtImg1);
params.put("applyPtImg2", applyPtImg2);
params.put("ApplicationImg", applicationImg);

@ -6,6 +6,7 @@ import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Order;
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.ServiceException;
import com.ynxbd.common.service.InHospService;
@ -96,6 +97,7 @@ public class AliPayAction extends BaseAction {
log.info(order.getErrorMsg());
return Result.error(order.getErrorMsg());
}
log.info("[支付宝][医保][收到通知] order={}", JsonHelper.toJsonString(order));
String openid = order.getOpenid();
String bankTransNo = order.getBankTransNo();
@ -104,6 +106,9 @@ public class AliPayAction extends BaseAction {
String payDate = DateHelper.getCurDate();
String payTime = DateHelper.getCurTime();
String body = AliMedicalHelper.queryTrade(outTradeNo, bankTransNo);
log.info("[支付宝][医保][查询订单] body={}", body);
new MedicalService().commonNotify(MerchantEnum.ALI_MEDICAL, notifyType, outTradeNo, totalFee, bankTransNo, payDate, payTime, openid, payInfo);
return Result.respStr();
}
@ -114,9 +119,10 @@ public class AliPayAction extends BaseAction {
* @return 是否成功
*/
@Action("queryMIAuth")
public Result queryMIAuth(String openId, String accessToken, String patientName, String patientCardNo, String callUrl) {
log.info("[支付宝][医保]授权查询 openId={}, accessToken={}, patientName={}, patientCardNo={}, callUrl={}", openId, accessToken, patientName, patientCardNo, callUrl);
String data = AliMedicalHelper.queryMIAuth(openId, accessToken, patientName, patientCardNo, callUrl);
public Result queryMIAuth(String openid, String accessToken, String patientName, String patientCardNo, String callUrl) {
log.info("[支付宝][医保]授权查询 openid={}, accessToken={}, patientName={}, patientCardNo={}, callUrl={}", openid, accessToken, patientName, patientCardNo, callUrl);
String data = AliMedicalHelper.queryMIAuth(openid, accessToken, patientName, patientCardNo, callUrl);
log.info("[支付宝][医保]授权查询 body={}", data);
if (data == null) {
return Result.error("授权查询失败");
}

@ -50,6 +50,11 @@ public class MedicalAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常
return Result.error(ResultEnum.PAY_TYPE_ERROR);
}
MedicalInfo medicalInfo;
switch (PEnum.toEnum(callNo)) {
case REG:
@ -61,7 +66,7 @@ public class MedicalAction extends BaseAction {
if (!DateHelper.isToday(reg.getRegDate())) {
return Result.error("医保支付仅支持今日挂号");
}
medicalInfo = new MedicalService().hisRegMIUploadFeeDetails(qrCode, openid, patientId, cardNo, realName, reg, isSplitTime);
medicalInfo = new MedicalService().hisRegMIUploadFeeDetails(merchantEnum, qrCode, openid, patientId, cardNo, realName, reg, isSplitTime);
break;
case RECIPE:
@ -70,7 +75,7 @@ public class MedicalAction extends BaseAction {
if (treatNum == null || recipeJson == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
medicalInfo = new MedicalService().hisRxUploadFeeDetails(qrCode, openid, patientId, cardNo, realName, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName);
medicalInfo = new MedicalService().hisRxUploadFeeDetails(merchantEnum, qrCode, openid, patientId, cardNo, realName, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName);
break;
default:
@ -144,19 +149,30 @@ public class MedicalAction extends BaseAction {
return Result.success(WxMedicalHelper.downBill(billDate, billType));
}
/**
* 医保支付下单
*
* @param openid openid
* @param payOrdId 医保订单号
* @param payAuthNo 用户授权码
* @param chrgBchno 收费单据号
* @param mdUserId 医保用户id
* @param totalFee 支付总金额
* @param acctFee 医保个账支付金额
* @param cashFee 现金支付金额
* @param cardNo 卡号
* @param realName 用户真实姓名
* @param callNo 业务类型[挂号:register; 处方缴费:recipe]
* @param payCode 调用码[wx_medical]
* @param openid openid
* @param patientId 患者id
* @param cardNo 患者证件号
* @param realName 患者真实姓名
* @param treatNum 门诊号挂号不传处方必传
* @param payOrdId -医保订单号id接口返回
* @param payAuthNo -医保授权码接口返回
* @param mdTrtId -医保-就诊ID接口返回
* @param chrgBchno -医保-收费单据号接口返回
* @param mdUserId -医保-用户ID接口返回
* @param totalFee -订单金额接口返回
* @param acctFee -医保-个人账户支付金额接口返回
* @param hifpFee -医保-统筹支付金额接口返回
* @param insuranceFee -个账 + 统筹支付金额接口返回
* @param cashFee -现金金额接口返回
* @param familyType 家庭关系非必传
* @param familyName 家人姓名非必传
* @param familyCardNo 家人证件号码非必传
*/
@Action("order")
public Result order(String callNo, String payCode, String openid, String patientId, String cardNo, String realName, String treatNum, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId,

@ -0,0 +1,23 @@
package com.ynxbd.common.bean.pay;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
@NoArgsConstructor
public class ApiResult {
private String code;
private String message;
private Object data;
private Boolean success; // 是否成功
public boolean isOk() { // 是否成功-名称区分-反正生成值被覆盖
return success != null && success;
}
}

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.ynxbd.ali.helper.AliMedicalHelper;
import com.ynxbd.common.action.pay.PEnum;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.ApiResult;
import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.dao.RecipeDao;
@ -61,10 +62,14 @@ public class MedicalService {
* @param realName 真实姓名
* @param reg 挂号信息
*/
public MedicalInfo hisRegMIUploadFeeDetails(String qrCode, String openid, String patientId, String cardNo, String realName, Register reg, Boolean isSplitTime) throws ServiceException {
MedicalUserInfo userInfo = WxMedicalHelper.getUserInfo(openid, qrCode, cardNo, realName);
String payAuthNo = userInfo.getPayAuthNo();
public MedicalInfo hisRegMIUploadFeeDetails(MerchantEnum merchantEnum, String qrCode, String openid, String patientId, String cardNo, String realName, Register reg, Boolean isSplitTime) throws ServiceException {
String payAuthNo;
if (merchantEnum == MerchantEnum.ALI_MEDICAL) { // 支付宝医保
payAuthNo = qrCode;
} else {
MedicalUserInfo userInfo = WxMedicalHelper.getUserInfo(openid, qrCode, cardNo, realName);
payAuthNo = userInfo.getPayAuthNo();
}
log.info("[医保]上传明细:patientId={}, cardNo={}, realName={}, reg={}", patientId, cardNo, realName, reg);
JsonResult result = HisMedicalDao.regTimeMdUploadFeeDetails(reg, payAuthNo, cardNo, MerchantEnum.WX, isSplitTime);
@ -83,10 +88,14 @@ public class MedicalService {
* @param recipeJson 处方json
* @param totalFee 订单金额
*/
public MedicalInfo hisRxUploadFeeDetails(String qrCode, String openid, String patientId, String cardNo, String realName, String treatNum, String recipeJson, BigDecimal totalFee, String ybAttrib, String ybBZCode, String ybBZName) throws ServiceException {
MedicalUserInfo userInfo = WxMedicalHelper.getUserInfo(openid, qrCode, cardNo, realName);
String payAuthNo = userInfo.getPayAuthNo();
public MedicalInfo hisRxUploadFeeDetails(MerchantEnum merchantEnum, String qrCode, String openid, String patientId, String cardNo, String realName, String treatNum, String recipeJson, BigDecimal totalFee, String ybAttrib, String ybBZCode, String ybBZName) throws ServiceException {
String payAuthNo;
if (merchantEnum == MerchantEnum.ALI_MEDICAL) {
payAuthNo = qrCode;
} else {
MedicalUserInfo userInfo = WxMedicalHelper.getUserInfo(openid, qrCode, cardNo, realName);
payAuthNo = userInfo.getPayAuthNo();
}
log.info("[医保]上传明细:patientId={}, totalFee={}, cardNo={}, recipeJson={}", patientId, totalFee, cardNo, recipeJson);
JsonResult result = HisMedicalDao.recipeMdUploadFeeDetails(payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName);
@ -426,7 +435,7 @@ public class MedicalService {
if (cashFee.compareTo(BigDecimal.ZERO) == 0) { // 现金部分为0
log.info("[医保][挂号]现金为0不执行退费-修改退费状态 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
if (!regDao.updateRefundByTradeNo(tradeNo, "OK")) {
log.info("【微信】[医保][挂号] 修改数据库退费状态失败 tradeNo={}", tradeNo);
log.info("[医保][挂号] 修改数据库退费状态失败 tradeNo={}", tradeNo);
}
return false;
}
@ -436,14 +445,14 @@ public class MedicalService {
return false;
}
// 微信医保自动退费
MedicalOrder order = WxMedicalHelper.refundCash(outTradeNo, tradeNo, cashFee, "系统繁忙缴费失败,自动退费");
boolean isOk = order.isOk();
String refundResult = order.isOk() ? WxPayHelper.OK : order.getMessage();
// 医保自动退费
ApiResult apiResult = new MedicalService().autoRefund(merchantEnum, outTradeNo, tradeNo, cashFee, "系统繁忙缴费失败,自动退费");
boolean isOk = apiResult.isOk();
String refundResult = apiResult.getMessage();
log.info("【微信】[医保][挂号]现金自动退费 outTradeNo={}, bankTransNo={}, tradeNo={} [{}]:{}", outTradeNo, bankTransNo, tradeNo, (isOk ? "成功" : "失败"), order.getMessage());
log.info("{}[挂号]现金自动退费 outTradeNo={}, bankTransNo={}, tradeNo={} [{}]:{}", merchantEnum.NAME, outTradeNo, bankTransNo, tradeNo, (isOk ? "成功" : "失败"), refundResult);
if (!regDao.updateRefundByTradeNo(tradeNo, refundResult)) {
log.info("【微信】[医保][挂号]现金自动退费 修改数据库状态失败 tradeNo={}, refundResult={}", tradeNo, refundResult);
log.info("{}[挂号]现金自动退费 修改数据库状态失败 tradeNo={}, refundResult={}", merchantEnum.NAME, tradeNo, refundResult);
}
return false;
}
@ -456,6 +465,19 @@ public class MedicalService {
return true;
}
private ApiResult autoRefund(MerchantEnum merchantEnum, String outTradeNo, String tradeNo, BigDecimal cashFee, String reason) {
ApiResult apiResult = new ApiResult();
if (MerchantEnum.WX_MEDICAL == merchantEnum) {
MedicalOrder order = WxMedicalHelper.refundCash(outTradeNo, tradeNo, cashFee, reason);
apiResult.setSuccess(order.isOk());
apiResult.setMessage(order.isOk() ? WxPayHelper.OK : order.getMessage());
} else {
log.info("[支付宝][医保]未开通自动退费.....");
apiResult.setMessage("[支付宝]未启用自动退费");
}
return apiResult;
}
/**
* [医保]处方缴费
@ -536,7 +558,7 @@ public class MedicalService {
if (cashFee.compareTo(BigDecimal.ZERO) == 0) { // 现金部分为0
log.info("[医保][处方]现金为0不执行退费-修改退费状态 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
if (!recipeDao.updateRefundByTradeNo(tradeNo, "OK")) {
log.info("【微信】[医保][处方]修改数据库退费状态失败 tradeNo={}", tradeNo);
log.info("[医保][处方]修改数据库退费状态失败 tradeNo={}", tradeNo);
}
return false;
}
@ -546,12 +568,13 @@ public class MedicalService {
return false;
}
MedicalOrder order = WxMedicalHelper.refundCash(outTradeNo, tradeNo, cashFee, "系统繁忙缴费失败,自动退费");
boolean isOk = order.isOk();
String refundResult = order.isOk() ? WxPayHelper.OK : order.getMessage();
log.info("【微信】[医保][处方]现金自动退费 outTradeNo={}, bankTransNo={}, tradeNo={} [{}]:{}", outTradeNo, bankTransNo, tradeNo, (isOk ? "成功" : "失败"), order.getMessage());
ApiResult apiResult = new MedicalService().autoRefund(merchantEnum, outTradeNo, tradeNo, cashFee, "系统繁忙缴费失败,自动退费");
boolean isOk = apiResult.isOk();
String refundResult = apiResult.getMessage();
log.info("{}[处方]现金自动退费 outTradeNo={}, bankTransNo={}, tradeNo={} [{}]:{}", merchantEnum.NAME, outTradeNo, bankTransNo, tradeNo, (isOk ? "成功" : "失败"), refundResult);
if (!recipeDao.updateRefundByTradeNo(tradeNo, refundResult)) {
log.info("【微信】[医保][处方]现金自动退费 修改数据库状态失败 tradeNo={}, refundResult={}", tradeNo, refundResult);
log.info("{}[处方]现金自动退费 修改数据库状态失败 tradeNo={}, refundResult={}", merchantEnum.NAME, tradeNo, refundResult);
}
return false;
}

@ -141,7 +141,7 @@ public class WxMedicalHelper {
* @param payOrdId 医保订单号
* @param payAuthNo 用户授权码
* @param totalFee 支付总金额
* @param insuranceFee 个账 + 统筹支付金额
* @param insuranceFee 个账 + 统筹支付金额
* @param cashFee 现金支付金额
* @param notifyUrl 回调地址
* @param callbackUrl 跳转地址

Loading…
Cancel
Save