支付宝下单接口调整

debug
wangsq 10 hours ago
parent b330ad412a
commit e3cddf0807
  1. 65
      src/main/java/com/ynxbd/ali/helper/AliMedicalHelper.java
  2. 18
      src/main/java/com/ynxbd/ali/helper/AliMessageHelper.java
  3. 4
      src/main/java/com/ynxbd/common/action/pay/AliPayAction.java
  4. 2
      src/main/java/com/ynxbd/common/action/pay/MedicalAction.java
  5. 80
      src/main/java/com/ynxbd/common/action/test/TestAction.java
  6. 34
      src/main/java/com/ynxbd/common/bean/pay/MICreateOrder.java
  7. 3
      src/main/java/com/ynxbd/common/bean/pay/Order.java
  8. 14
      src/main/java/com/ynxbd/common/dao/RecipeDao.java
  9. 11
      src/main/java/com/ynxbd/common/dao/RegisterDao.java
  10. 105
      src/main/java/com/ynxbd/common/service/MedicalService.java
  11. 6
      src/main/java/com/ynxbd/wx/wxfactory/WxMedicalHelper.java
  12. 18
      src/main/java/com/ynxbd/wx/wxfactory/bean/MIOrder.java
  13. 2
      src/main/java/com/ynxbd/wx/wxfactory/bean/MedicalInfo.java
  14. 29
      src/main/java/com/ynxbd/wx/wxfactory/medical/Client.java

@ -1,6 +1,5 @@
package com.ynxbd.ali.helper;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
@ -21,6 +20,7 @@ import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.wx.wxfactory.bean.OrderMIEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
@ -40,10 +40,9 @@ public class AliMedicalHelper {
* @param patientName 用户姓名
* @param patientCardNo 用户证件号
* @param callUrl 回调地址
* @return
* @return info
*/
public static MedicalNationalPayAuthInfo queryMIAuth(String openId, String accessToken, String patientName, String patientCardNo, String reqBizNo, String callUrl) {
try {
public static MedicalNationalPayAuthInfo queryMIAuth(String openId, String accessToken, String patientName, String patientCardNo, String reqBizNo, String callUrl) throws Exception {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(AliConfig.getAlipayConfig());
// 构造请求参数以调用接口
@ -104,13 +103,11 @@ public class AliMedicalHelper {
if (response.isSuccess()) {
return response.getData();
}
// 异常:商户未上线(白名单未添加或已过期-10到15天,会自动下架)
throw new ServiceException(response.getErrorMessage());
// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
// System.out.println(diagnosisUrl);
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
// public static AlipayClient getGBKAliClient() {
@ -124,6 +121,7 @@ public class AliMedicalHelper {
* @param orderMIEnum 医保订单类型
* @param openid openid
* @param outTradeNo 商户订单号
* @param medOrgOrd HIS医院订单号
* @param payOrdId 医保订单id
* @param payAuthNo 医保授权
* @param totalAmount 总金额
@ -138,7 +136,7 @@ public class AliMedicalHelper {
* @param medicalCardId 医保电子凭证授权码 获取线上医保业务授权接口返回medicalCardId参数"6638aabe-7b4d-4d10-bdf0-b44804da3dab"
* @return map
*/
public static Map<String, Object> createOrder(OrderMIEnum orderMIEnum, String openid, String outTradeNo, String payOrdId, String payAuthNo, BigDecimal totalAmount, BigDecimal cashFee, String subject, String notifyUrl, String notifyType, String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) {
public static Map<String, Object> createOrder(OrderMIEnum orderMIEnum, String openid, String outTradeNo, String medOrgOrd, String payOrdId, String payAuthNo, BigDecimal totalAmount, BigDecimal cashFee, String subject, String notifyUrl, String notifyType, String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) {
try {
AlipayClient alipayClient = new DefaultAlipayClient(AliConfig.getAlipayConfig());
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
@ -164,8 +162,8 @@ public class AliMedicalHelper {
extendParams.put("medical_request_content", JSONObject.toJSONString(medicalRequestContent));
JSONObject medicalRequestExt = new JSONObject(); //医保扩展参数
medicalRequestExt.put("gmt_out_create", DateHelper.getCurDateTime());//医疗机构下单时间
medicalRequestExt.put("out_trade_no", outTradeNo); //商户网站唯一订单号 医院订单号medOrgOrd
medicalRequestExt.put("gmt_out_create", DateHelper.getCurDateTime()); // 医疗机构下单时间
medicalRequestExt.put("out_trade_no", medOrgOrd); // 商户网站唯一订单号 医院订单号medOrgOrd
medicalRequestExt.put("serial_no", payOrdId); // 移动支付中心订单号payOrdId
medicalRequestExt.put("bill_no", payOrdId); // 移动支付中心订单号payOrdId
medicalRequestExt.put("pay_auth_no", payAuthNo); // 移动支付中心返回授权编号 获取线上医保业务授权接口返回payAuthNo参数
@ -174,27 +172,38 @@ public class AliMedicalHelper {
medicalRequestExt.put("org_name", AliMIConfig.ORG_HOSPITAL_NAME); // 医药机构名称
medicalRequestExt.put("payment_city_code", AliMIConfig.CITY_CODE); // 医保结算地城市编码(国标)
//
medicalRequestExt.put("industry", "HOSPITAL"); //行业标识 医院:HOSPITAL
medicalRequestExt.put("industry", "HOSPITAL"); // 行业标识 医院:HOSPITAL
medicalRequestExt.put("chinfo", "gjydzf"); // 渠道标识-默认为gjydzf
medicalRequestExt.put("scene", "TREATMENT"); //使用场景
medicalRequestExt.put("insurance_pay_scene", orderMIEnum.ALI_MI_CODE); // 医保结算场景 是 医保结算场景:OUTPATIENT - 门诊;INPATIENT - 住院;APPOINTMENT- 挂号;DRUGSTORE- 药店
// if (isZeroCash) { // 额外支付金额
// // 同时需要增加医保补充计算字段 extend_params.medical_request_ex.insurance_subsidy_mode:involve。示例为:
// // {"insurance_subsidy_mode":"involve","insurance_subsidy_amount":"0.01","insurance_subsidy_type":"OTHER"}
// medicalRequestExt.put("insurance_subsidy_mode", "involve");
// medicalRequestExt.put("insurance_subsidy_type", "OTHER");
// medicalRequestExt.put("insurance_subsidy_amount", "0.01"); // (如自费部分增加10元运费)
// }
extendParams.put("medical_request_ext", JSONObject.toJSONString(medicalRequestExt));
bizContent.put("extend_params", extendParams);
// 如需补充资产,如院内预交金等 begin
if (cashFee.compareTo(BigDecimal.ZERO) == 0) { // 0元现金支付
JSONArray merchantCardZkt = new JSONArray();
JSONObject zkt = new JSONObject();
zkt.put("amount", totalAmount); // 总金额
zkt.put("forceUse", "Y"); // 固定为Y
zkt.put("templateId", "2023062500391002246600206403");
merchantCardZkt.add(zkt);
JSONObject presetPayTool = new JSONObject();
presetPayTool.put("MERCHANTCARD_ZKT", merchantCardZkt);
extendParams.put("preset_pay_tool", JSONObject.toJSONString(presetPayTool));
extendParams.put("scene", "PLATFORM_DRUG_STORE"); //场景(有三方购药渠道场景使用)
}
// 如需补充资产,如院内预交金等 end
// // 如需补充资产,如院内预交金等 begin
// if (isZeroCash) { // 0元义诊-需上报医保
// // 文档(特别注意1:当出现义诊等纯0元订单,又需要完成医保登记场景)
// // 示例为:"preset_pay_tool": "{\"MERCHANTCARD_ZKT\":[{\"amount\":\"0.01\",\"templateId\":\"2023062500391002246600208318\",\"forceUse\":\"Y\"}]}"。
// JSONArray merchantCardZkt = new JSONArray();
// JSONObject zkt = new JSONObject();
// zkt.put("amount", "0.01"); // 总金额
// zkt.put("forceUse", "Y"); // 固定为Y
// zkt.put("templateId", "2023062500391002246600208318");
// merchantCardZkt.add(zkt);
// JSONObject presetPayTool = new JSONObject();
// presetPayTool.put("MERCHANTCARD_ZKT", merchantCardZkt);
// extendParams.put("preset_pay_tool", JSONObject.toJSONString(presetPayTool));
//// extendParams.put("scene", "PLATFORM_DRUG_STORE"); // 场景(有三方购药渠道场景使用)
// }
// // 如需补充资产,如院内预交金等 end
bizContent.put("extend_params", extendParams);
request.setBizContent(JSONObject.toJSONString(bizContent));
log.info("[支付宝]医保下单-入参 {}", JSONObject.toJSONString(request));
@ -214,8 +223,6 @@ public class AliMedicalHelper {
}
// 5.2.2.5 线下交易查询alipay.trade.query
public static Order queryTrade(String outTradeNo, String tradeNo) {
Order order = new Order();

@ -107,15 +107,15 @@ public class AliMessageHelper {
ext_info.put("hospital", AliConfig.HOSP_NAME); //医院名称
ext_info.put("hospital_register_id", AliConfig.HOSP_REGISTER_ID); // 医院登记号
ext_info.put("department", deptName); //就诊科室
ext_info.put("dept_num", deptCode); //诊室编号
ext_info.put("dept_loc", "暂无");//科室位置
// ext_info.put("navigation", "导航地址");//导航地址
ext_info.put("doctor", doctName); //医生名称
// ext_info.put("doctor_rank", "医生职级"); //医生职级
// ext_info.put("doctor_id", "医生 id");//医生 id
// ext_info.put("doctor_avatar", "医生头像 url");//医生头像 url
ext_info.put("department", deptName); // 就诊科室
ext_info.put("dept_num", deptCode); // 诊室编号
ext_info.put("dept_loc", "暂无"); // 科室位置
// ext_info.put("navigation", "导航地址"); // 导航地址
ext_info.put("doctor", doctName); // 医生名称
// ext_info.put("doctor_rank", "医生职级"); // 医生职级
// ext_info.put("doctor_id", "医生 id"); // 医生 id
// ext_info.put("doctor_avatar", "医生头像 url"); // 医生头像 url
ext_info.put("patient", trueName); // 就诊人 必须与 buy_id 对 应的姓名一致
if ((DateHelper.isToday(regDate))) { // 今日挂号

@ -120,12 +120,16 @@ public class AliPayAction extends BaseAction {
@Action("queryMIAuth")
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);
try {
MedicalNationalPayAuthInfo dataInfo = AliMedicalHelper.queryMIAuth(openid, accessToken, patientName, patientCardNo, reqBizNo, callUrl);
log.info("[支付宝][医保]授权查询 {}", JsonHelper.toJsonString(dataInfo));
if (dataInfo == null) {
return Result.error("授权查询失败");
}
return Result.success(dataInfo);
} catch (Exception e) {
return Result.error(e);
}
}
// /**

@ -1,7 +1,6 @@
package com.ynxbd.common.action.pay;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.ali.config.AliMIConfig;
import com.ynxbd.ali.helper.AliMedicalHelper;
import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.enums.MerchantEnum;
@ -12,7 +11,6 @@ import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.RecipeDao;
import com.ynxbd.common.dao.his.HisMIDao;
import com.ynxbd.common.helper.common.AesMicroHelper;
import com.ynxbd.common.helper.common.Base64Helper;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.HttpHelper;
import com.ynxbd.common.result.JsonResult;

@ -1,22 +1,27 @@
package com.ynxbd.common.action.test;
import com.alibaba.fastjson.JSONObject;
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.xbd.EncHelper;
import com.ynxbd.common.helper.xbd.XBDHttpHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.wx.wxfactory.WxCacheHelper;
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 org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;
/**
* @Author wsq
@ -87,20 +92,65 @@ public class TestAction extends BaseAction {
return Result.success();
}
@Action("test_image")
public Result test_image(String image) {
@Action("md_add")
public Result md_add(String outTradeNo) {
try {
System.out.println(image);
System.out.println("=============================");
String data = EncHelper.AES_Encrypt(image);
System.out.println("1--------------------------");
System.out.println(data);
System.out.println("2--------------------------");
String data2 = XBDHttpHelper.compress(URLEncoder.encode(data, StandardCharsets.UTF_8.toString()));
System.out.println(data2);
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.setPatientId("1xbd");
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.setMdTrtId("xbd-med");
recipe.setMdUserId("xbd-med");
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());
e.printStackTrace();
}
return Result.success();
}

@ -0,0 +1,34 @@
package com.ynxbd.common.bean.pay;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.apache.commons.lang3.ObjectUtils;
import java.util.Map;
@Setter
@Getter
@ToString
@NoArgsConstructor
public class MICreateOrder {
private Boolean isHasMerOrder;
private Map<String, Object> map;
// 未创建商户订单-可用旧订单号支付
public boolean hasCreateMerOrder() {
return isHasMerOrder != null && isHasMerOrder;
}
public boolean hasMapData() {
return map != null;
}
public String mapGetBankTansNo() {
Object bankTransNoVal = this.map.get("bankTransNo");
return ObjectUtils.isEmpty(bankTransNoVal) ? null : String.valueOf(bankTransNoVal);
}
}

@ -182,6 +182,9 @@ public class Order implements Serializable {
}
}
public boolean hasTradeState() {
return !ObjectUtils.isEmpty(this.tradeState);
}
// 是否已付款
public boolean hasPayStatusPaid() {

@ -190,8 +190,6 @@ public class RecipeDao {
}
/**
* 查询同一次支付的所有处方信息多处方一次支付多张发票
*
@ -597,4 +595,16 @@ public class RecipeDao {
ps.setString(3, outTradeNo);
}) > 0;
}
// 查询30天是否有发起过医保支付的订单
public Order selectMIOrderByPayOrdId(String payOrdId) {
String sql = "select * from pay where updateTime >= DATE_SUB(CurDate(), INTERVAL 30 DAY) and tradeNo= ?";
List<Order> dataList = DataBase.select(sql, Order.class, ps -> {
ps.setString(1, payOrdId);
});
if (dataList.isEmpty()) {
return null;
}
return dataList.get(0);
}
}

@ -803,4 +803,15 @@ public class RegisterDao {
});
}
// 查询30天是否有发起过医保支付的订单
public Order selectMIOrderByPayOrdId(String payOrdId) {
String sql = "select * from register where updateTime >= DATE_SUB(CurDate(), INTERVAL 30 DAY) and tradeNo= ?";
List<Order> dataList = DataBase.select(sql, Order.class, ps -> {
ps.setString(1, payOrdId);
});
if (dataList.isEmpty()) {
return null;
}
return dataList.get(0);
}
}

@ -5,10 +5,7 @@ import com.ynxbd.ali.config.AliMIConfig;
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.Order;
import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.bean.pay.*;
import com.ynxbd.common.dao.RecipeDao;
import com.ynxbd.common.dao.RegisterDao;
import com.ynxbd.common.dao.his.HisMIDao;
@ -50,7 +47,7 @@ public class MedicalService {
break;
case REG: // 挂号
regPayNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
regPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
break;
case IN_HOSP:
@ -185,11 +182,13 @@ public class MedicalService {
}
// 创建医保订单
private Map<String, Object> createMIOrder(MerchantEnum merchantEnum, OrderMIEnum orderMIEnum, String orderTitle, String openid, String outTradeNo, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String chrgBchno,
private MICreateOrder createMIOrder(MerchantEnum merchantEnum, OrderMIEnum orderMIEnum, boolean hasDBOrder, String orderTitle, String openid, String outTradeNo, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String chrgBchno,
BigDecimal totalFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType,
String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) throws ServiceException {
MICreateOrder miCreateOrder = new MICreateOrder();
if (MerchantEnum.WX_MEDICAL.equals(merchantEnum)) {
return WxMedicalHelper.createOrder(orderMIEnum,
Map<String, Object> map = WxMedicalHelper.createOrder(orderMIEnum,
openid,
outTradeNo,
chrgBchno,
@ -208,16 +207,20 @@ public class MedicalService {
familyType,
familyName,
familyCardNo);
miCreateOrder.setIsHasMerOrder(null);
miCreateOrder.setMap(map);
} else if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) {
if (ObjectUtils.isEmpty(medicalCardId)) {
throw new ServiceException("【支付宝】医保授权码medicalCardId为空");
}
Order order = hasDBOrder ? AliMedicalHelper.queryTrade(outTradeNo, null) : new Order();
String notifyUrl = WeChatConfig.getHttpsBaseUrl() + merchantEnum.getNotifyUrl(outTradeNo, notifyType);
return AliMedicalHelper.createOrder(orderMIEnum,
Map<String, Object> map = AliMedicalHelper.createOrder(orderMIEnum,
openid,
outTradeNo,
chrgBchno,
payOrdId,
payAuthNo,
totalFee,
@ -230,10 +233,15 @@ public class MedicalService {
familyCardNo,
medicalCardInstId,
medicalCardId);
miCreateOrder.setIsHasMerOrder(order.hasTradeState());
miCreateOrder.setMap(map);
return miCreateOrder;
}
return null;
return miCreateOrder;
}
/**
* [医保]处方下单
*/
@ -262,22 +270,32 @@ public class MedicalService {
return Result.error(ResultEnum.PAY_PREPAY_SAVE_ERROR);
}
log.info("[医保][处方]下单 openid={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}", openid, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, cashFee, cardNo, realName, familyType, familyName, medicalCardId, medicalCardInstId);
try {
boolean hasDBOrder = false;
RecipeDao recipeDao = new RecipeDao();
if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付取消支付可重新支付
Order findOrder = recipeDao.selectMIOrderByPayOrdId(payOrdId);
if (findOrder != null) {
if (findOrder.hasPayStatusPaid()) {
return Result.error(ResultEnum.PAY_REPEAT);
}
hasDBOrder = true;
outTradeNo = findOrder.getOutTradeNo();
}
}
log.info("[医保][处方]下单 hasDBOrder={}, openid={}, patientId={}, treatNum={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, hifpFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}", hasDBOrder, openid, patientId, treatNum, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, hifpFee, cashFee, cardNo, realName, familyType, familyName, medicalCardId, medicalCardInstId);
String orderTitle = "门诊号:" + treatNum;
Map<String, Object> map = createMIOrder(merchantEnum, OrderMIEnum.DIAG_PAY, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno,
MICreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.DIAG_PAY, hasDBOrder, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno,
totalFee, insuranceFee, cashFee, notifyType,
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
if (map == null) {
if (!miOrder.hasMapData()) {
return Result.error(ResultEnum.PAY_ERROR_ORDER);
}
Object bankTransNoVal = map.get("bankTransNo");
String bankTransNo = ObjectUtils.isEmpty(bankTransNoVal) ? null : String.valueOf(bankTransNoVal);
RecipeDao recipeDao = new RecipeDao();
// Recipe recipeInfo = recipeDao.selectByTradeNo(payOrdId);
String bankTransNo = miOrder.mapGetBankTansNo();
Recipe addRecipe = new Recipe();
addRecipe.setOutTradeNo(outTradeNo);
addRecipe.setTradeNo(payOrdId);
@ -305,6 +323,17 @@ public class MedicalService {
addRecipe.setPayStatus(-1);
addRecipe.setHisStatus(-1);
Map<String, Object> map = miOrder.getMap();
if (miOrder.hasCreateMerOrder()) { // 订单已发起支付
log.info("[医保][处方]订单已发起支付 hasDBOrder={}, outTradeNo={}, payOrdId={}", hasDBOrder, outTradeNo, payOrdId);
return Result.error(ResultEnum.PAY_REPEAT);
} else {
if (hasDBOrder) {
log.info("[医保][处方]已有订单 hasDBOrder={}, outTradeNo={}, rxInfo={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(addRecipe));
return Result.success(map);
}
}
if (!recipeDao.insertMedical(addRecipe)) {
return Result.error(ResultEnum.DATA_INSERT_ERROR);
}
@ -333,22 +362,37 @@ public class MedicalService {
}
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum);
log.info("[医保][挂号]下单 openid={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, cashFee={}, idCardNo={}, realName={}, medicalCardInstId={}, medicalCardId={}", openid, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, cashFee, cardNo, realName, medicalCardId, medicalCardInstId);
try {
boolean hasDBOrder = false;
RegisterDao regDao = new RegisterDao();
if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付取消支付可重新支付
Order findOrder = regDao.selectMIOrderByPayOrdId(payOrdId);
if (findOrder != null) {
if (findOrder.hasPayStatusPaid()) {
return Result.error(ResultEnum.PAY_REPEAT);
}
hasDBOrder = true;
outTradeNo = findOrder.getOutTradeNo();
}
}
String treatNum = reg.getTreatNum();
String patientId = reg.getPatientId();
log.info("[医保][挂号]下单 hasDBOrder={}, openid={}, patientId={}, treatNum={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, hifpFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}", hasDBOrder, openid, patientId, treatNum, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, hifpFee, cashFee, cardNo, realName, familyType, familyName, medicalCardId, medicalCardInstId);
String orderTitle = "挂号";
Map<String, Object> map = createMIOrder(merchantEnum, OrderMIEnum.REG_PAY, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno,
MICreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.REG_PAY, hasDBOrder, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno,
totalFee, insuranceFee, cashFee, notifyType,
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
if (map == null) {
if (!miOrder.hasMapData()) {
return Result.error(ResultEnum.PAY_ERROR_ORDER);
}
String bankTransNo = String.valueOf(map.get("bankTransNo"));
RegisterDao regDao = new RegisterDao();
String bankTransNo = miOrder.mapGetBankTansNo();
reg.setOutTradeNo(outTradeNo);
reg.setTradeNo(payOrdId);
reg.setPayOrdId(payOrdId);
reg.setPayMoney(cashFee);
reg.setAcctFee(acctFee);
reg.setHifpFee(hifpFee);
@ -361,6 +405,17 @@ public class MedicalService {
reg.setBankTransNo(bankTransNo);
reg.setPayWay(merchantEnum.PAY_WAY_IN);
Map<String, Object> map = miOrder.getMap();
if (miOrder.hasCreateMerOrder()) { // 订单已发起支付
log.info("[医保][挂号]订单已发起支付 hasDBOrder={}, outTradeNo={}, payOrdId={}", hasDBOrder, outTradeNo, payOrdId);
return Result.error(ResultEnum.PAY_REPEAT);
} else {
if (hasDBOrder) {
log.info("[医保][挂号]已有订单 hasDBOrder={}, outTradeNo={}, rxInfo={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(reg));
return Result.success(map);
}
}
if (!regDao.insertMedical(reg)) {
return Result.error(ResultEnum.DATA_INSERT_ERROR);
}
@ -383,7 +438,7 @@ public class MedicalService {
* @param openid openid
* @param payInfo 支付信息
*/
public boolean regPayNotify(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
public boolean regPaidNotify(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
if (outTradeNo == null || bankTransNo == null || payDate == null || payTime == null) {
log.info("[医保][挂号]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, payDate={}, payTime={}", outTradeNo, bankTransNo, payDate, payTime);
return false;
@ -542,7 +597,6 @@ public class MedicalService {
}
JsonResult jsonResult = HisMIDao.rxMIPay(merchantEnum, mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee);
if (!jsonResult.success()) {
String respCode = jsonResult.getCode();
String respMessage = jsonResult.getMessage();
@ -668,7 +722,6 @@ public class MedicalService {
return Result.error(order.getMessage());
} else {
// 支付宝
String respBody = AliMedicalHelper.refundTrade(outTradeNo, outRefundNo, tradeNo, cashFee, "线上退费");
boolean isOk = respBody != null;

@ -363,4 +363,10 @@ public class WxMedicalHelper {
token.setCreateTime(DateHelper.getCurDateTime());
return token;
}
public static void main(String[] args) {
String a = "{\\\"payAuthNo\\\":\\\"AUTH530100202509151551446281313\\\",\\\"setlLatlnt\\\":\\\"0,0\\\",\\\"payOrdId\\\":\\\"ORD530100202509151551510239700\\\"}";
}
}

@ -6,6 +6,8 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
// 医保查询订单
@ -24,15 +26,19 @@ public class MIOrder extends WxFactory.ResponseCheck.ResultBase {
private String openid;
private String subOpenid;
private String nonceStr;
private String totalFee;
private String cashFee;
private String allowFeeChange;
private String spbillCreateIp;
private String notifyUrl;
private String insuranceFee;
private String insuranceSelfFee;
private String insuranceFundFee;
private String insuranceOtherFee;
private BigDecimal totalFee;
private BigDecimal cashFee;
private BigDecimal insuranceFee;
private BigDecimal insuranceSelfFee;
private BigDecimal insuranceFundFee;
private BigDecimal insuranceOtherFee;
private String hospOutTradeNo;
private String serialNo;
private String orgNo;

@ -23,7 +23,7 @@ public class MedicalInfo {
private String payOrdId; // 订单号
private String payToken; // token
private String payAuthNo; // 授权码
private String chrgBchno; // 收费批次(去掉M作为发票号,用于退费)
private String chrgBchno; // 收费批次(去掉M作为发票号,用于退费)-医院订单号
private String mdUserId; // 医保支付用户id
private String mdTrtId; // 医保就诊号

@ -92,7 +92,6 @@ public class Client {
try {
BigDecimal finalCashFee = cashFee;
JsonResult jsonResult = WxRequestHelper.postMdXml(("https://api.weixin.qq.com/payinsurance/unifiedorder?access_token=" + accessToken), params -> {
params.put("insurance_fee", insuranceFee.movePointRight(2)); // 医保支付金额(分)
params.put("total_fee", totalFee.movePointRight(2)); // 总金额(分)
params.put("cash_fee", finalCashFee.movePointRight(2)); // 现金需要支付的金额 { 单位为分>=0 线上预结算模式金额填0; 线下预结算模式填实际自费金额 }
@ -124,7 +123,6 @@ public class Client {
}
//=========================================================
params.put("allow_fee_change", 1); // 是否允许预结算费用发生变化 {0:不允许 1:允许 当医保局返回的预结算金额与医院上传的金额不一致时,此字段为0则直接报错,为1则以医保局金额为准}
params.put("spbill_create_ip", ip); // 客户端ip
@ -134,7 +132,6 @@ public class Client {
params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
params.put("gmt_out_create", DateHelper.dateToStr(new Date(), DateHelper.DateEnum.yyyyMMddHHmmss)); // 医院下单时间
Map<String, String> requestContent = new HashMap<>();
requestContent.put("payAuthNo", payAuthNo); // 授权码
requestContent.put("payOrdId", payOrdId); // 处方号
@ -175,7 +172,17 @@ public class Client {
return new MIOrder().createResult(jsonResult);
}
log.info("[医保][查询订单] req={}", JsonHelper.toJsonString(jsonResult));
return jsonResult.dataMapToBean(MIOrder.class);
MIOrder order = jsonResult.dataMapToBean(MIOrder.class);
order.setCashFee(order.getCashFee().movePointLeft(2));
order.setTotalFee(order.getTotalFee().movePointLeft(2));
order.setInsuranceFee(order.getInsuranceFee().movePointLeft(2));
order.setInsuranceSelfFee(order.getInsuranceSelfFee().movePointLeft(2));
order.setInsuranceFundFee(order.getInsuranceFundFee().movePointLeft(2));
order.setInsuranceOtherFee(order.getInsuranceOtherFee().movePointLeft(2));
return order;
}
@ -378,20 +385,6 @@ public class Client {
return info;
}
public static void main(String[] args) {
WxFactory.Medical.Common().getUserInfo("http://www.baidu.com", "123", "222");
// WxFactory.Medical.Common().downBill("", "", "", "", "", "");
}
// public static void main(String[] args) {
// String accessToken = "57_WiWb2k55Xv1Lbj9y0rEW1wFxKzQPiaaFJ4oOdJwYvb2TlGOHgqi4pQt4dLFKv7EqF7939o6jk0d9QAyTKxrSF3rcCVRo73SnSpNGVjYbBlxe7vv7XlGWiax5ApS8Ut5gP-PMU_eIr9W4O5BxXLAgADAIWL";
// String payAuthNo = "AUTH530100202205071850280000014";
// createOrder(OrderTypeEnum.DIAG_PAY, accessToken, "wxd503671f502bd89d", "1288583001", "216677bcfa51be03905c867dd71f2952", "oeso-t62kkoRwLVVkSkwmmjPfUXk", payAuthNo,
// null, null, null, null, null, null, null);
// }
// public String getUserInfo(String reqUrl, String openid, String qrcode) {
// Map<String, Object> dataMap = new HashMap<>();
// dataMap.put("qrcode", qrcode);

Loading…
Cancel
Save