1、支付相关下单和退费接口调整

debug
王绍全 1 week ago
parent bc10372a7d
commit e0f05ffd2f
  1. 4
      src/main/java/com/ynxbd/common/action/WechatMiniAction.java
  2. 4
      src/main/java/com/ynxbd/common/action/XBDAction.java
  3. 11
      src/main/java/com/ynxbd/common/action/auth/WxAuthAction.java
  4. 6
      src/main/java/com/ynxbd/common/action/pay/MedicalAction.java
  5. 40
      src/main/java/com/ynxbd/common/action/pay/PayAction.java
  6. 9
      src/main/java/com/ynxbd/common/action/pay/ThirdPartyPayAction.java
  7. 2
      src/main/java/com/ynxbd/common/action/test/TestAction.java
  8. 98
      src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java
  9. 7
      src/main/java/com/ynxbd/common/bean/pay/Order.java
  10. 24
      src/main/java/com/ynxbd/common/bean/pay/Register.java
  11. 4
      src/main/java/com/ynxbd/common/dao/InHospPayDao.java
  12. 85
      src/main/java/com/ynxbd/common/dao/RecipeDao.java
  13. 16
      src/main/java/com/ynxbd/common/dao/RegisterDao.java
  14. 27
      src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java
  15. 37
      src/main/java/com/ynxbd/common/helper/common/CodeHelper.java
  16. 2
      src/main/java/com/ynxbd/common/helper/his/HisHelper.java
  17. 6
      src/main/java/com/ynxbd/common/service/CasebookService.java
  18. 2
      src/main/java/com/ynxbd/common/service/InHospService.java
  19. 28
      src/main/java/com/ynxbd/common/service/MedicalService.java
  20. 15
      src/main/java/com/ynxbd/common/service/PayService.java
  21. 29
      src/main/java/com/ynxbd/common/service/RecipeService.java
  22. 37
      src/main/java/com/ynxbd/common/service/RegService.java
  23. 14
      src/main/java/com/ynxbd/wx/config/WeChatConfig.java
  24. 2
      src/main/java/com/ynxbd/wx/servlet/oldpay/QRPayServlet.java
  25. 10
      src/main/java/com/ynxbd/wx/wxfactory/AesWxHelper.java
  26. 12
      src/main/java/com/ynxbd/wx/wxfactory/WxMiniHelper.java
  27. 25
      src/main/java/com/ynxbd/wx/wxfactory/WxPayHelper.java
  28. 2
      src/main/resources/webservice.properties
  29. 3
      src/main/resources/wx.properties

@ -36,7 +36,7 @@ public class WechatMiniAction extends BaseAction {
return result; return result;
} }
MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByAuthCode(authCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByAuthCode(authCode);
if (merchantEnum == null) { if (merchantEnum == null) {
log.info("[外采支付]条码不符合规则 authCode={}", authCode); log.info("[外采支付]条码不符合规则 authCode={}", authCode);
return Result.error(ResultEnum.PAY_AUTH_CODE_RULES_ERROR); // 条码不符合规则 return Result.error(ResultEnum.PAY_AUTH_CODE_RULES_ERROR); // 条码不符合规则
@ -48,7 +48,7 @@ public class WechatMiniAction extends BaseAction {
} }
String ip = HttpHelper.getIpAddress(request); String ip = HttpHelper.getIpAddress(request);
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
Order order = PayService.payMicro(merchantEnum, outTradeNo, title, totalFee, authCode, ip); Order order = PayService.payMicro(merchantEnum, outTradeNo, title, totalFee, authCode, ip);
if (!order.isSuccess()) { if (!order.isSuccess()) {

@ -252,7 +252,7 @@ public class XBDAction extends BaseAction {
* @return 支付回调参数 * @return 支付回调参数
*/ */
@Action("caseBookPay") @Action("caseBookPay")
public Result caseBookPay(String payCode, String openid, @AesDecode String patientId, String patientName, String treatNum, BigDecimal totalFee, String applyId, Integer getWay, String useToNo, String useToName, String address, String phone) { public Result caseBookPay(String payCode, String payOpenId, String openid, @AesDecode String patientId, String patientName, String treatNum, BigDecimal totalFee, String applyId, Integer getWay, String useToNo, String useToName, String address, String phone) {
try { try {
log.info("[病历复印]下单 payCode={}, openid={}, patientId={}, patientName={}, treatNum={}, totalFee={}, useToName={}", payCode, openid, patientId, patientName, treatNum, totalFee, useToName); log.info("[病历复印]下单 payCode={}, openid={}, patientId={}, patientName={}, treatNum={}, totalFee={}, useToName={}", payCode, openid, patientId, patientName, treatNum, totalFee, useToName);
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
@ -260,7 +260,7 @@ public class XBDAction extends BaseAction {
return Result.error(ResultEnum.PAY_TYPE_ERROR); return Result.error(ResultEnum.PAY_TYPE_ERROR);
} }
String ip = request.getRemoteAddr(); String ip = request.getRemoteAddr();
return new CasebookService().placeOrder(merchantEnum, ip, openid, patientId, patientName, treatNum, totalFee, applyId, getWay, useToNo, useToName, address, phone); return new CasebookService().placeOrder(merchantEnum, ip, payOpenId, openid, patientId, patientName, treatNum, totalFee, applyId, getWay, useToNo, useToName, address, phone);
} catch (Exception e) { } catch (Exception e) {
return Result.error(e); return Result.error(e);
} }

@ -1,10 +1,14 @@
package com.ynxbd.common.action.auth; package com.ynxbd.common.action.auth;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.wx.config.WeChatConfig;
import com.ynxbd.wx.wxfactory.WxAuthHelper; import com.ynxbd.wx.wxfactory.WxAuthHelper;
import com.ynxbd.wx.wxfactory.WxMiniHelper; import com.ynxbd.wx.wxfactory.WxMiniHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
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;
@ -38,7 +42,10 @@ public class WxAuthAction extends BaseAction {
@Action("mini_auth") @Action("mini_auth")
public Result mini_auth(String jsCode) { public Result mini_auth(String jsCode) {
String auth = WxMiniHelper.auth(jsCode); if (ObjectUtils.isEmpty(jsCode)) {
return Result.success(); return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
JSONObject auth = WxMiniHelper.auth(WeChatConfig.GMC_MINI_APP_ID, WeChatConfig.GMC_MINI_APP_SECRET, jsCode);
return Result.success(auth);
} }
} }

@ -174,7 +174,7 @@ public class MedicalAction extends BaseAction {
* @param familyCardNo 家人证件号码非必传 * @param familyCardNo 家人证件号码非必传
*/ */
@Action("order") @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, public Result order(String callNo, String payCode, String payOpenId, String openid, String patientId, String cardNo, String realName, String treatNum, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId,
BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) { BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) {
try { try {
log.info("[医保]下单入参 callNo={}, payCode={}, openid={}, patientId={}, totalFee={}", callNo, payCode, openid, patientId, totalFee); log.info("[医保]下单入参 callNo={}, payCode={}, openid={}, patientId={}, totalFee={}", callNo, payCode, openid, patientId, totalFee);
@ -186,7 +186,7 @@ public class MedicalAction extends BaseAction {
case REG: case REG:
Register reg = new Register().getRegParams(new RequestParams(request), true); Register reg = new Register().getRegParams(new RequestParams(request), true);
return new MedicalService().createRegOrder(payCode, openid, cardNo, realName, ip, payOrdId, payAuthNo, mdTrtId, chrgBchno, mdUserId, return new MedicalService().createRegOrder(payCode, payOpenId, openid, cardNo, realName, ip, payOrdId, payAuthNo, mdTrtId, chrgBchno, mdUserId,
totalFee, acctFee, hifpFee, insuranceFee, cashFee, callNo, reg, totalFee, acctFee, hifpFee, insuranceFee, cashFee, callNo, reg,
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId); familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
@ -196,7 +196,7 @@ public class MedicalAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_BLANK); return Result.error(ResultEnum.PARAM_IS_BLANK);
} }
String payWay = getString("payWay"); String payWay = getString("payWay");
return new MedicalService().createRxOrder(payCode, openid, patientId, cardNo, realName, ip, return new MedicalService().createRxOrder(payCode, payOpenId, openid, patientId, cardNo, realName, ip,
payOrdId, payAuthNo, mdTrtId, chrgBchno, mdUserId, payOrdId, payAuthNo, mdTrtId, chrgBchno, mdUserId,
totalFee, acctFee, hifpFee, insuranceFee, cashFee, totalFee, acctFee, hifpFee, insuranceFee, cashFee,
callNo, recipeJson, treatNum, payWay, familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId); callNo, recipeJson, treatNum, payWay, familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);

@ -54,7 +54,6 @@ public class PayAction extends BaseAction {
log.info("[挂号]下单 payCode={}, isOccupySource={}, isZeroPay={}", payCode, isOccupySource, isZeroPay); log.info("[挂号]下单 payCode={}, isOccupySource={}, isZeroPay={}", payCode, isOccupySource, isZeroPay);
try { try {
Register reg = new Register().getRegParams(new RequestParams(request), true); Register reg = new Register().getRegParams(new RequestParams(request), true);
String ip = HttpHelper.getIpAddress(request); String ip = HttpHelper.getIpAddress(request);
return new RegService().createRegOrder(payCode, ip, isOccupySource, isZeroPay, reg, isHttpsWithProxy()); return new RegService().createRegOrder(payCode, ip, isOccupySource, isZeroPay, reg, isHttpsWithProxy());
@ -78,7 +77,7 @@ public class PayAction extends BaseAction {
* @param awaitSecond 待秒数0继续执行不等待不传或null 为0 * @param awaitSecond 待秒数0继续执行不等待不传或null 为0
*/ */
@Action("recipePay") @Action("recipePay")
public Result recipePay(boolean isPrepay, String payCode, String openid, String patientId, String treatNum, String totalFee, String recipeJson, String payWay, Integer awaitSecond) { public Result recipePay(boolean isPrepay, String payCode, String payOpenId, String openid, String patientId, String treatNum, String totalFee, String recipeJson, String payWay, Integer awaitSecond) {
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常 if (merchantEnum == null) { // 支付方式异常
return Result.error(ResultEnum.PAY_TYPE_ERROR); return Result.error(ResultEnum.PAY_TYPE_ERROR);
@ -94,7 +93,7 @@ public class PayAction extends BaseAction {
} }
} }
Result result = recipeService.recipeHand(merchantEnum, openid, patientId, treatNum, totalFee, recipeJson, payWay, awaitSecond, isHttpsWithProxy()); Result result = recipeService.recipeHand(merchantEnum, payOpenId, openid, patientId, treatNum, totalFee, recipeJson, payWay, awaitSecond, isHttpsWithProxy());
if (!result.isOK() || result.getData() != null) { // 业务错误 || 存在返回数据-需提前返回 if (!result.isOK() || result.getData() != null) { // 业务错误 || 存在返回数据-需提前返回
return result; return result;
} }
@ -111,9 +110,9 @@ public class PayAction extends BaseAction {
} }
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
// 订单信息预存 // 订单信息预存
if (!recipeService.isSaveRecipeInfo(recipeJson, payWay, openid, patientId, treatNum, outTradeNo, totalFee)) { if (!recipeService.saveRecipeInfo(merchantEnum, payOpenId, openid, recipeJson, payWay, patientId, treatNum, outTradeNo, totalFee)) {
log.info("{} [处方支付]预存支付信息失败 patientId={}", merchantEnum.NAME, patientId); log.info("{} [处方支付]预存支付信息失败 patientId={}", merchantEnum.NAME, patientId);
return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST); return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST);
} }
@ -121,7 +120,7 @@ public class PayAction extends BaseAction {
String ip = request.getRemoteAddr(); String ip = request.getRemoteAddr();
String body = "诊间支付 患者:" + patientId + "\n门诊号:" + treatNum; String body = "诊间支付 患者:" + patientId + "\n门诊号:" + treatNum;
JSONObject respJson = PayService.createOrder(merchantEnum, openid, patientId, totalFee, outTradeNo, PEnum.RECIPE.CODE, ip, body); JSONObject respJson = PayService.createOrder(merchantEnum, payOpenId, openid, patientId, totalFee, outTradeNo, PEnum.RECIPE.CODE, ip, body);
// 支付异常 // 支付异常
if (respJson == null) { if (respJson == null) {
return Result.error(ResultEnum.PAY_ERROR); return Result.error(ResultEnum.PAY_ERROR);
@ -136,15 +135,14 @@ public class PayAction extends BaseAction {
* * @param payCode 退款支付方式 { ali支付宝wx微信 } * * @param payCode 退款支付方式 { ali支付宝wx微信 }
*/ */
@Action("inHospDepositPay") @Action("inHospDepositPay")
public Result inHospDepositPay(String openid, String patientId, String patientName, String treatNum, String payMoney, String payWay, String payCode) { public Result inHospDepositPay(String payCode, String payOpenId, String openid, String patientId, String patientName, String treatNum, String payMoney, String payWay) {
Result result = PayService.isPaymentPermittedByTime(); Result result = PayService.isPaymentPermittedByTime();
if (result != null) { if (result != null) {
return result; return result;
} }
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { if (merchantEnum == null) { // 支付方式异常
// 支付方式异常
return Result.error(ResultEnum.PAY_TYPE_ERROR); return Result.error(ResultEnum.PAY_TYPE_ERROR);
} }
log.info("{} [住院]预交金信息预存 payCode={}, openid={}, patientId={}, patientName={}, payMoney={}, treatNum={}", merchantEnum.NAME, payCode, openid, patientId, patientName, payMoney, treatNum); log.info("{} [住院]预交金信息预存 payCode={}, openid={}, patientId={}, patientName={}, payMoney={}, treatNum={}", merchantEnum.NAME, payCode, openid, patientId, patientName, payMoney, treatNum);
@ -155,7 +153,7 @@ public class PayAction extends BaseAction {
String ip = request.getRemoteAddr(); String ip = request.getRemoteAddr();
String body = "住院缴费 患者:" + patientId + " 住院号:" + treatNum; String body = "住院缴费 患者:" + patientId + " 住院号:" + treatNum;
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
PayInHosp payInHosp = new PayInHosp(); PayInHosp payInHosp = new PayInHosp();
payInHosp.setOpenid(openid); payInHosp.setOpenid(openid);
@ -166,6 +164,8 @@ public class PayAction extends BaseAction {
payInHosp.setTotalFee(new BigDecimal(payMoney)); payInHosp.setTotalFee(new BigDecimal(payMoney));
payInHosp.setPayWay(payWay); payInHosp.setPayWay(payWay);
payInHosp.setOutTradeNo(outTradeNo); payInHosp.setOutTradeNo(outTradeNo);
payInHosp.setPayOpenId(payOpenId);
payInHosp.setPayMchCode(merchantEnum.CODE);
boolean isResult = new InHospService().saveInHospPayInfo(payInHosp); boolean isResult = new InHospService().saveInHospPayInfo(payInHosp);
if (!isResult) { if (!isResult) {
@ -173,7 +173,7 @@ public class PayAction extends BaseAction {
return Result.error(ResultEnum.PAY_PREPAY_SAVE_ERROR); return Result.error(ResultEnum.PAY_PREPAY_SAVE_ERROR);
} }
JSONObject respJson = PayService.createOrder(merchantEnum, openid, patientId, payMoney, outTradeNo, PEnum.IN_HOSP.CODE, ip, body); JSONObject respJson = PayService.createOrder(merchantEnum, payOpenId, openid, patientId, payMoney, outTradeNo, PEnum.IN_HOSP.CODE, ip, body);
if (respJson == null) { if (respJson == null) {
// 支付异常 // 支付异常
return Result.error(ResultEnum.PAY_ERROR); return Result.error(ResultEnum.PAY_ERROR);
@ -203,7 +203,7 @@ public class PayAction extends BaseAction {
return result; return result;
} }
MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByAuthCode(authCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByAuthCode(authCode);
if (merchantEnum == null) { if (merchantEnum == null) {
log.info("[盒子支付]条码不符合规则 authCode={}", authCode); log.info("[盒子支付]条码不符合规则 authCode={}", authCode);
return Result.error(ResultEnum.PAY_AUTH_CODE_RULES_ERROR); // 条码不符合规则 return Result.error(ResultEnum.PAY_AUTH_CODE_RULES_ERROR); // 条码不符合规则
@ -230,7 +230,7 @@ public class PayAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
Order order = PayService.saveMicroOrderNo(pEnum, merchantEnum, outTradeNo, authCode, treatNum, patientId, operateUser, invoiceTransNo, totalFee, regDate); Order order = PayService.saveMicroOrderNo(pEnum, merchantEnum, outTradeNo, authCode, treatNum, patientId, operateUser, invoiceTransNo, totalFee, regDate);
if (!order.isSuccess()) { if (!order.isSuccess()) {
return Result.error(order.getErrorMsg()); return Result.error(order.getErrorMsg());
@ -736,7 +736,7 @@ public class PayAction extends BaseAction {
* [在线问诊]支付 * [在线问诊]支付
*/ */
@Action("createOLOrder") @Action("createOLOrder")
public Result createOLOrder(String payCode, String outTradeNo, String enOutTradeNo, String openid, String patientId, BigDecimal totalFee, String deptCode, String deptName, String doctName, String doctCode) { public Result createOLOrder(String payCode, String payOpenId, String openid, String outTradeNo, String enOutTradeNo, String patientId, BigDecimal totalFee, String deptCode, String deptName, String doctName, String doctCode) {
log.info("[问诊]订单创建 payCode={}, outTradeNo={}, enOutTradeNo={}, deptCode={}, doctCode={}, totalFee={}", payCode, outTradeNo, enOutTradeNo, deptCode, doctCode, totalFee); log.info("[问诊]订单创建 payCode={}, outTradeNo={}, enOutTradeNo={}, deptCode={}, doctCode={}, totalFee={}", payCode, outTradeNo, enOutTradeNo, deptCode, doctCode, totalFee);
if (totalFee == null || ObjectUtils.isEmpty(openid) || ObjectUtils.isEmpty(patientId) || ObjectUtils.isEmpty(deptName) || ObjectUtils.isEmpty(doctName)) { if (totalFee == null || ObjectUtils.isEmpty(openid) || ObjectUtils.isEmpty(patientId) || ObjectUtils.isEmpty(deptName) || ObjectUtils.isEmpty(doctName)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
@ -745,7 +745,7 @@ public class PayAction extends BaseAction {
return Result.error(ResultEnum.PAY_MONEY_IS_ZERO); return Result.error(ResultEnum.PAY_MONEY_IS_ZERO);
} }
if (ObjectUtils.isEmpty(outTradeNo)) { if (ObjectUtils.isEmpty(outTradeNo)) {
outTradeNo = CodeHelper.getOutTradeNo(MerchantEnum.WX); outTradeNo = MerchantEnum.WX.createOutTradeNo();
} else { } else {
if (outTradeNo.length() > 32) { if (outTradeNo.length() > 32) {
return Result.error(ResultEnum.PARAM_IS_INVALID); return Result.error(ResultEnum.PARAM_IS_INVALID);
@ -762,7 +762,7 @@ public class PayAction extends BaseAction {
String ip = HttpHelper.getIpAddress(request); String ip = HttpHelper.getIpAddress(request);
String body = "在线问诊:" + deptName + "-" + doctName; String body = "在线问诊:" + deptName + "-" + doctName;
JSONObject respJson = PayService.createOrder(merchantEnum, openid, patientId, totalFee.toString(), outTradeNo, PEnum.OL_REG.CODE, ip, body); JSONObject respJson = PayService.createOrder(merchantEnum, payOpenId, openid, patientId, totalFee.toString(), outTradeNo, PEnum.OL_REG.CODE, ip, body);
if (respJson == null) { if (respJson == null) {
return Result.error(ResultEnum.PAY_ERROR); // 支付异常 return Result.error(ResultEnum.PAY_ERROR); // 支付异常
} }
@ -824,7 +824,7 @@ public class PayAction extends BaseAction {
return Result.error(ResultEnum.PAY_MONEY_IS_ZERO); return Result.error(ResultEnum.PAY_MONEY_IS_ZERO);
} }
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
try { try {
new OutCollectService().creatorOCOrder(outTradeNo, totalFee, collectId, openid, mid, name, cardNo, patientId, remark); new OutCollectService().creatorOCOrder(outTradeNo, totalFee, collectId, openid, mid, name, cardNo, patientId, remark);
@ -861,7 +861,7 @@ public class PayAction extends BaseAction {
* @param noticeOrderNo 体检订单号 * @param noticeOrderNo 体检订单号
*/ */
@Action("createPEISOrder") @Action("createPEISOrder")
public Result createPEISOrder(String payCode, String openid, String patientId, String treatNum, String totalFee, String noticeOrderNo) { public Result createPEISOrder(String payCode, String payOpenId, String openid, String patientId, String treatNum, String totalFee, String noticeOrderNo) {
log.info("[体检预约]下单 payCode={}, openid={}, patientId={}, treatNum={}, totalFee={}, noticeOrderNo={}", payCode, openid, patientId, treatNum, totalFee, noticeOrderNo); log.info("[体检预约]下单 payCode={}, openid={}, patientId={}, treatNum={}, totalFee={}, noticeOrderNo={}", payCode, openid, patientId, treatNum, totalFee, noticeOrderNo);
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常 if (merchantEnum == null) { // 支付方式异常
@ -879,7 +879,7 @@ public class PayAction extends BaseAction {
return Result.error(ResultEnum.PAY_MONEY_IS_ZERO); return Result.error(ResultEnum.PAY_MONEY_IS_ZERO);
} }
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
PEISService peisService = new PEISService(); PEISService peisService = new PEISService();
if (peisService.hasPaidByNoticeOrderNo(noticeOrderNo)) { if (peisService.hasPaidByNoticeOrderNo(noticeOrderNo)) {
@ -894,7 +894,7 @@ public class PayAction extends BaseAction {
String ip = request.getRemoteAddr(); String ip = request.getRemoteAddr();
String body = "体检预约 患者:" + patientId + "\n体检号:" + treatNum + "\n订单号:" + noticeOrderNo; String body = "体检预约 患者:" + patientId + "\n体检号:" + treatNum + "\n订单号:" + noticeOrderNo;
JSONObject respJson = PayService.createOrder(merchantEnum, openid, patientId, totalFee, outTradeNo, PEnum.PEIS_RESERVE.CODE, ip, body); JSONObject respJson = PayService.createOrder(merchantEnum, payOpenId, openid, patientId, totalFee, outTradeNo, PEnum.PEIS_RESERVE.CODE, ip, body);
if (respJson == null) { if (respJson == null) {
return Result.error(ResultEnum.PAY_ERROR); return Result.error(ResultEnum.PAY_ERROR);
} }

@ -45,7 +45,7 @@ public class ThirdPartyPayAction extends BaseAction {
} }
@Action("qr_reg_pay") @Action("qr_reg_pay")
public Result qr_reg_pay(String payCode, String openid, String sourceId, String patientId, BigDecimal money, String date) { public Result qr_reg_pay(String payCode, String payOpenId, String openid, String sourceId, String patientId, BigDecimal money, String date) {
log.info("[第三方][扫码挂号-支付] sourceId={}, patientId={}, money={}, date={}", sourceId, patientId, money, date); log.info("[第三方][扫码挂号-支付] sourceId={}, patientId={}, money={}, date={}", sourceId, patientId, money, date);
if (ObjectUtils.isEmpty(openid)) { if (ObjectUtils.isEmpty(openid)) {
return Result.error(ResultEnum.PARAM_IS_INVALID); return Result.error(ResultEnum.PARAM_IS_INVALID);
@ -77,11 +77,12 @@ public class ThirdPartyPayAction extends BaseAction {
reg.setPayDeviceId("mobile"); reg.setPayDeviceId("mobile");
reg.setPayWay(merchantEnum.PAY_WAY_IN); reg.setPayWay(merchantEnum.PAY_WAY_IN);
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
reg.setOutTradeNo(outTradeNo); reg.setOutTradeNo(outTradeNo);
log.info("{} [第三方-扫码挂号]生成 outTradeNo={}", merchantEnum.NAME, outTradeNo); log.info("{} [第三方-扫码挂号]生成 outTradeNo={}", merchantEnum.NAME, outTradeNo);
if (!new RegService().updateRegPrepay(reg)) { if (!new RegService().saveRegPrepay(reg)) {
log.info("{} [第三方-扫码挂号]预存支付信息失败 patientId={}, sourceId={}", merchantEnum.NAME, patientId, sourceId); log.info("{} [第三方-扫码挂号]预存支付信息失败 patientId={}, sourceId={}", merchantEnum.NAME, patientId, sourceId);
return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST); return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST);
} }
@ -90,7 +91,7 @@ public class ThirdPartyPayAction extends BaseAction {
String ip = request.getRemoteAddr(); String ip = request.getRemoteAddr();
String body = "扫码挂号" + date + " 患者:" + patientId; String body = "扫码挂号" + date + " 患者:" + patientId;
JSONObject respJson = PayService.createOrder(merchantEnum, openid, patientId, money.toString(), outTradeNo, PEnum.TPP_QR_REG.CODE, ip, body); JSONObject respJson = PayService.createOrder(merchantEnum, payOpenId, openid, patientId, money.toString(), outTradeNo, PEnum.TPP_QR_REG.CODE, ip, body);
if (respJson == null) { if (respJson == null) {
return Result.error(ResultEnum.PAY_ERROR); // 支付异常 return Result.error(ResultEnum.PAY_ERROR); // 支付异常
} }

@ -32,7 +32,7 @@ public class TestAction extends BaseAction {
public synchronized void refund_handle() { public synchronized void refund_handle() {
if (i == 0) { if (i == 0) {
i++; i++;
WxPayHelper.refund("", "", new BigDecimal("6.230"), new BigDecimal("6.230"), "手动退费"); WxPayHelper.refund(null, "", "", new BigDecimal(" 6.230 "), new BigDecimal(" 6.230 "), " 手动退费 ");
} }
} }

@ -1,6 +1,9 @@
package com.ynxbd.common.bean.enums; package com.ynxbd.common.bean.enums;
import com.ynxbd.ali.config.AliConfig;
import com.ynxbd.ali.config.AliMedConfig; import com.ynxbd.ali.config.AliMedConfig;
import com.ynxbd.common.helper.common.CodeHelper;
import com.ynxbd.wx.config.WeChatConfig;
import com.ynxbd.wx.wxfactory.medical.WxMedConfig; import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import lombok.ToString; import lombok.ToString;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -21,7 +24,7 @@ import java.util.List;
public enum MerchantEnum { public enum MerchantEnum {
// 支付宝 // 支付宝
ALI("ali", "【支付宝】", ALI("ali", "【支付宝】", AliConfig.APP_ID, "ALI",
false, false,
"3", "3",
"25,26,27,28,29,30", "25,26,27,28,29,30",
@ -30,15 +33,32 @@ public enum MerchantEnum {
"10", "11", "12"), "10", "11", "12"),
// 微信 // 微信
WX("wx", "【微信】", WX("wx", "【微信】", WeChatConfig.APP_ID, "WX"
false, , false,
"4", "4",
"10,11,12,13,14,15", "10,11,12,13,14,15",
"wx_pay/apiNotify", "wx_pay/apiNotify",
"wx_pay/nativeNotify", "wx_pay/nativeNotify",
"0", "1", "2"), "0", "1", "2"),
BCM("bcm", "【交行】", // Global Medical Communities
WX_GMC("wx_gmc_mini", "【微信医共体】", WeChatConfig.GMC_MINI_APP_ID, "WMC",
WX.IS_DEV,
WX.HIS_PAY_WAY,
WX.BAR_CODE_RULES,
WX.NOTIFY_URL,
WX.QR_NOTIFY_URL,
WX.PAY_WAY_IN, WX.PAY_WAY_QR, WX.PAY_WAY_MICRO),
WX_MEDICAL("wx_medical", "【微信医保】", WxMedConfig.MD_APP_ID, WX.OUT_TRADE_NO_PREFIX,
WxMedConfig.IS_DEV,
WX.HIS_PAY_WAY,
WX.BAR_CODE_RULES,
"medical/payNotify",
"",
WX.PAY_WAY_IN, WX.PAY_WAY_QR, WX.PAY_WAY_MICRO),
BCM("bcm", "【交行】", "", "BCM",
false, false,
"4", "4",
"", "",
@ -46,15 +66,8 @@ public enum MerchantEnum {
"", "",
"20", "21", "22"), "20", "21", "22"),
WX_MEDICAL("wx_medical", "【微信医保】",
WxMedConfig.IS_DEV,
"4",
"10,11,12,13,14,15",
"medical/payNotify",
"",
"0", "1", "2"),
ALI_MEDICAL("ali_medical", "【支付宝医保】", ALI_MEDICAL("ali_medical", "【支付宝医保】", AliConfig.APP_ID, ALI.OUT_TRADE_NO_PREFIX,
AliMedConfig.IS_DEV, AliMedConfig.IS_DEV,
"3", "3",
"25,26,27,28,29,30", "25,26,27,28,29,30",
@ -68,6 +81,10 @@ public enum MerchantEnum {
public final String NAME; public final String NAME;
public final String APP_ID;
// 商户订单号前缀
public final String OUT_TRADE_NO_PREFIX;
public final boolean IS_DEV; public final boolean IS_DEV;
public final String HIS_PAY_WAY; public final String HIS_PAY_WAY;
@ -84,9 +101,11 @@ public enum MerchantEnum {
// 盒子支付代码 // 盒子支付代码
public final String PAY_WAY_MICRO; public final String PAY_WAY_MICRO;
MerchantEnum(String CODE, String NAME, boolean IS_DEV, String HIS_PAY_WAY, String BAR_CODE_RULES, String NOTIFY_URL, String QR_NOTIFY_URL, String PAY_WAY_IN, String PAY_WAY_QR, String PAY_WAY_MICRO) { MerchantEnum(String CODE, String NAME, String APP_ID, String OUT_TRADE_NO_PREFIX, boolean IS_DEV, String HIS_PAY_WAY, String BAR_CODE_RULES, String NOTIFY_URL, String QR_NOTIFY_URL, String PAY_WAY_IN, String PAY_WAY_QR, String PAY_WAY_MICRO) {
this.CODE = CODE; this.CODE = CODE;
this.NAME = NAME; this.NAME = NAME;
this.APP_ID = APP_ID;
this.OUT_TRADE_NO_PREFIX = OUT_TRADE_NO_PREFIX;
this.IS_DEV = IS_DEV; this.IS_DEV = IS_DEV;
this.HIS_PAY_WAY = HIS_PAY_WAY; this.HIS_PAY_WAY = HIS_PAY_WAY;
this.BAR_CODE_RULES = BAR_CODE_RULES; this.BAR_CODE_RULES = BAR_CODE_RULES;
@ -98,7 +117,19 @@ public enum MerchantEnum {
} }
/** /**
* 查询支付类型 * 获取不重复的商户订单号
*/
public String createOutTradeNo() {
String prefix = this.OUT_TRADE_NO_PREFIX;
if (prefix.length() > 4) {
prefix = prefix.substring(0, 4);
}
prefix = prefix.toUpperCase();
return prefix + CodeHelper.get28UUID();
}
/**
* 匹配支付类型
* *
* @param code 用于匹配的编码 * @param code 用于匹配的编码
* @param defaultMerchant 为空时的返回 * @param defaultMerchant 为空时的返回
@ -134,17 +165,20 @@ public enum MerchantEnum {
} }
if (outTradeNo.length() < 12) { if (outTradeNo.length() < 12) {
log.error("订单号长度小于4 outTradeNo={}", outTradeNo); log.error("商户订单号长度小于12位 outTradeNo={}", outTradeNo);
return null; return null;
} }
if (MerchantEnum.WX.CODE.toUpperCase().equals(outTradeNo.substring(0, 2))) { if (MerchantEnum.WX.OUT_TRADE_NO_PREFIX.toUpperCase().equals(outTradeNo.substring(0, MerchantEnum.WX.OUT_TRADE_NO_PREFIX.length()))) {
return MerchantEnum.WX; return MerchantEnum.WX;
} else if (MerchantEnum.ALI.CODE.toUpperCase().equals(outTradeNo.substring(0, 3))) { } else if (MerchantEnum.WX_GMC.OUT_TRADE_NO_PREFIX.toUpperCase().equals(outTradeNo.substring(0, MerchantEnum.WX_GMC.OUT_TRADE_NO_PREFIX.length()))) {
return MerchantEnum.WX_GMC;
} else if (MerchantEnum.ALI.OUT_TRADE_NO_PREFIX.toUpperCase().equals(outTradeNo.substring(0, MerchantEnum.ALI.OUT_TRADE_NO_PREFIX.length()))) {
return MerchantEnum.ALI; return MerchantEnum.ALI;
} else if (MerchantEnum.BCM.CODE.toUpperCase().equals(outTradeNo.substring(0, 3))) { } else if (MerchantEnum.BCM.OUT_TRADE_NO_PREFIX.toUpperCase().equals(outTradeNo.substring(0, MerchantEnum.BCM.OUT_TRADE_NO_PREFIX.length()))) {
return MerchantEnum.BCM; return MerchantEnum.BCM;
} else { } else {
@ -189,37 +223,13 @@ public enum MerchantEnum {
} }
/**
* 根据支付方式获取支付代码集合
*
* @param merchantEnum 支付方式
* @return 支付代码集合
*/
public static List<String> getPayWayValues(MerchantEnum merchantEnum) {
List<String> resultList = new ArrayList<>();
if (merchantEnum == null) {
return resultList;
}
for (MerchantEnum item : MerchantEnum.values()) {
if (item.CODE.equals(merchantEnum.CODE)) {
resultList.add(item.PAY_WAY_IN);
resultList.add(item.PAY_WAY_QR);
resultList.add(item.PAY_WAY_MICRO);
return resultList;
}
}
return resultList;
}
/** /**
* 根据扫码的客户端判断支付类型 * 根据扫码的客户端判断支付类型
* *
* @param authCode 编码 * @param authCode 编码
* @return 支付类型 * @return 支付类型
*/ */
public static MerchantEnum getMerchantEnumByAuthCode(String authCode) { public static MerchantEnum findEnumByAuthCode(String authCode) {
if (StringUtils.isEmpty(authCode) || authCode.length() < 16) { if (StringUtils.isEmpty(authCode) || authCode.length() < 16) {
return null; return null;
} }
@ -245,4 +255,6 @@ public enum MerchantEnum {
public boolean isWx() { public boolean isWx() {
return this == MerchantEnum.WX || this == MerchantEnum.WX_MEDICAL; return this == MerchantEnum.WX || this == MerchantEnum.WX_MEDICAL;
} }
} }

@ -33,6 +33,10 @@ public class Order implements Serializable {
private Date updateTime; private Date updateTime;
// openid // openid
private String openid; private String openid;
// 用于支付的openId
private String payOpenId;
// 支付商户编码
private String payMchCode;
// 患者id // 患者id
private String patientId; private String patientId;
// 加密的patientId // 加密的patientId
@ -69,8 +73,11 @@ public class Order implements Serializable {
private String merchantName; private String merchantName;
// 单笔金额 // 单笔金额
private BigDecimal payMoney; private BigDecimal payMoney;
// 加密支付金额
private String enPayMoney;
// 订单总金额 // 订单总金额
private BigDecimal totalFee; private BigDecimal totalFee;
// 记录支付完成状态的时间 // 记录支付完成状态的时间
private Date payStatusTime; private Date payStatusTime;
// 商户支付状态 // 商户支付状态

@ -1,14 +1,17 @@
package com.ynxbd.common.bean.pay; package com.ynxbd.common.bean.pay;
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.common.service.RegService; import com.ynxbd.common.service.RegService;
import com.ynxbd.common.service.params.RequestParams; import com.ynxbd.common.service.params.RequestParams;
import com.ynxbd.wx.wxfactory.AesWxHelper;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -40,7 +43,6 @@ public class Register extends Order {
private BigDecimal regFee; private BigDecimal regFee;
private BigDecimal clinicFee; private BigDecimal clinicFee;
private String enTotalFee; // 加密订单总金额
private String clinicCode; private String clinicCode;
private String clinicName; private String clinicName;
@ -125,15 +127,25 @@ public class Register extends Order {
*/ */
public Register getRegParams(RequestParams params, boolean isDesc) throws ServiceException { public Register getRegParams(RequestParams params, boolean isDesc) throws ServiceException {
String openid = params.getString("openid"); String openid = params.getString("openid");
String patientId = params.getString("patientId"); String payOpenId = params.getString("payOpenId"); // 下单的openId
String cardNo = params.getString("idCardNo");
String patientName = params.getString("patientName"); String patientName = params.getString("patientName");
if (cardNo == null) {
String patientId = AesWxHelper.decode(params.getString("enPatientId"));
if (ObjectUtils.isEmpty(patientId)) {
patientId = params.getString("patientId");
}
String cardNo = AesWxHelper.decode(params.getString("enCardNo"));
if (ObjectUtils.isEmpty(cardNo)) {
cardNo = params.getString("idCardNo");
}
if (ObjectUtils.isEmpty(cardNo)) {
cardNo = params.getString("cardNo"); cardNo = params.getString("cardNo");
} }
BigDecimal payMoney = params.getBigDecimal("payMoney"); BigDecimal payMoney = params.getBigDecimal("payMoney");
BigDecimal totalFee = params.getBigDecimal("totalFee"); BigDecimal totalFee = params.getBigDecimal("totalFee");
String enPayMoney = params.getString("enPayMoney");
String deptCode = params.getString("deptCode"); String deptCode = params.getString("deptCode");
String subDeptCode = params.getString("subDeptCode"); String subDeptCode = params.getString("subDeptCode");
@ -230,11 +242,15 @@ public class Register extends Order {
// 金额 // 金额
this.setPayMoney(payMoney); this.setPayMoney(payMoney);
this.setTotalFee(totalFee); this.setTotalFee(totalFee);
this.setEnPayMoney(enPayMoney);
// 个人信息 // 个人信息
this.setOpenid(openid); this.setOpenid(openid);
this.setPayOpenId(payOpenId);
this.setPatientId(patientId); this.setPatientId(patientId);
this.setPatientName(patientName); this.setPatientName(patientName);
this.setIdCardNo(cardNo); this.setIdCardNo(cardNo);
return this; return this;
} }
} }

@ -33,7 +33,7 @@ public class InHospPayDao {
* @return 是否成功 * @return 是否成功
*/ */
public boolean insert(PayInHosp payInHosp) { public boolean insert(PayInHosp payInHosp) {
String sql = "insert into pay_in_hosp(updateTime, hisStatus, payStatus, openid, patientId, patientName, outTradeNo, bankTransNo, tradeNo, treatNum, payWay, payMoney, authCode, invoiceTransNo, hisTransNo, operateUser, totalFee, payOrdId, AcctFee, HifpFee, ChrgBchno, MdTrtId, MdUserId) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?)"; String sql = "insert into pay_in_hosp(updateTime, hisStatus, payStatus, openid, patientId, patientName, outTradeNo, bankTransNo, tradeNo, treatNum, payWay, payMoney, authCode, invoiceTransNo, hisTransNo, operateUser, totalFee, payOrdId, AcctFee, HifpFee, ChrgBchno, MdTrtId, MdUserId, payMchCode, payOpenId) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
return DataBase.insert(sql, ps -> { return DataBase.insert(sql, ps -> {
ps.setInt(1, payInHosp.getHisStatus()); ps.setInt(1, payInHosp.getHisStatus());
ps.setInt(2, payInHosp.getPayStatus()); ps.setInt(2, payInHosp.getPayStatus());
@ -58,6 +58,8 @@ public class InHospPayDao {
ps.setString(20, payInHosp.getChrgBchno()); ps.setString(20, payInHosp.getChrgBchno());
ps.setString(21, payInHosp.getMdTrtId()); ps.setString(21, payInHosp.getMdTrtId());
ps.setString(22, payInHosp.getMdUserId()); ps.setString(22, payInHosp.getMdUserId());
ps.setString(23, payInHosp.getPayMchCode());
ps.setString(24, payInHosp.getPayOpenId());
}) > 0; }) > 0;
} }

@ -9,6 +9,8 @@ import com.ynxbd.common.helper.his.HisHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -58,48 +60,9 @@ public class RecipeDao {
*/ */
public boolean isHisPaidByOutTradeNo(String outTradeNo) { public boolean isHisPaidByOutTradeNo(String outTradeNo) {
String sql = "select * from pay where outTradeNo=? and hisStatus=0"; String sql = "select * from pay where outTradeNo=? and hisStatus=0";
return DataBase.select(sql, Recipe.class, ps -> { return !DataBase.select(sql, Recipe.class, ps -> {
ps.setString(1, outTradeNo); ps.setString(1, outTradeNo);
}).size() > 0; }).isEmpty();
}
/**
* 处方支付数据预存单个
*
* @param recipe 支付信息
* @return 是否存储成功
*/
public boolean insert(Recipe recipe) {
String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, feeId, feeInfo, orderType) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?)";
return DataBase.insert(sql, ps -> {
ps.setInt(1, recipe.getHisStatus());
ps.setInt(2, recipe.getPayStatus());
ps.setString(3, recipe.getOpenid());
ps.setString(4, recipe.getPatientId());
ps.setString(5, recipe.getPayWay());
ps.setBigDecimal(6, recipe.getPayMoney());
ps.setBigDecimal(7, recipe.getTotalFee());
//
ps.setString(8, recipe.getOutTradeNo());
ps.setString(9, recipe.getBankTransNo());
ps.setString(10, recipe.getTradeNo());
ps.setString(11, recipe.getRecipeId());
ps.setString(12, recipe.getTreatNum());
ps.setString(13, recipe.getAuthCode());
ps.setString(14, recipe.getInvoiceTransNo());
ps.setString(15, recipe.getHisTransNo());
ps.setString(16, recipe.getOperateUser());
ps.setString(17, recipe.getDeptCode());
ps.setString(18, recipe.getDeptName());
ps.setString(19, recipe.getReqDeptCode());
ps.setString(20, recipe.getReqDeptName());
ps.setString(21, recipe.getHospitalArea());
ps.setString(22, recipe.getFeeId());
ps.setString(23, recipe.getFeeInfo());
ps.setString(24, recipe.getOrderType());
}) > 0;
} }
@ -110,7 +73,7 @@ public class RecipeDao {
* @return 是否存储成功 * @return 是否存储成功
*/ */
public boolean insertMedical(Recipe recipe) { public boolean insertMedical(Recipe recipe) {
String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, PayOrdId, AcctFee, HifpFee, ChrgBchno, MdTrtId, MdUserId, RecipeJson) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?)"; String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, PayOrdId, AcctFee, HifpFee, ChrgBchno, MdTrtId, MdUserId, RecipeJson, PayMchCode, PayOpenId) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?)";
return DataBase.insert(sql, ps -> { return DataBase.insert(sql, ps -> {
ps.setInt(1, recipe.getHisStatus()); ps.setInt(1, recipe.getHisStatus());
ps.setInt(2, recipe.getPayStatus()); ps.setInt(2, recipe.getPayStatus());
@ -144,20 +107,13 @@ public class RecipeDao {
ps.setString(26, recipe.getMdTrtId()); ps.setString(26, recipe.getMdTrtId());
ps.setString(27, recipe.getMdUserId()); ps.setString(27, recipe.getMdUserId());
ps.setString(28, recipe.getRecipeJson()); ps.setString(28, recipe.getRecipeJson());
ps.setString(29, recipe.getPayMchCode());
ps.setString(30, recipe.getPayOpenId());
}) > 0; }) > 0;
} }
/** private void setRxInsertPs(PreparedStatement ps, Recipe recipe) throws SQLException {
* 处方支付数据预存(集合)
*
* @param recipeList 处方集
* @return 是否存储成功
*/
public int insertBatch(List<Recipe> recipeList) {
String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, feeId, feeInfo, orderType) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?)";
return DataBase.insertBatch(sql, ps -> {
for (Recipe recipe : recipeList) {
ps.setInt(1, recipe.getHisStatus()); ps.setInt(1, recipe.getHisStatus());
ps.setInt(2, recipe.getPayStatus()); ps.setInt(2, recipe.getPayStatus());
ps.setString(3, recipe.getOpenid()); ps.setString(3, recipe.getOpenid());
@ -184,11 +140,36 @@ public class RecipeDao {
ps.setString(22, recipe.getFeeId()); ps.setString(22, recipe.getFeeId());
ps.setString(23, recipe.getFeeInfo()); ps.setString(23, recipe.getFeeInfo());
ps.setString(24, recipe.getOrderType()); ps.setString(24, recipe.getOrderType());
ps.setString(25, recipe.getPayMchCode());
ps.setString(26, recipe.getPayOpenId());
}
/**
* 处方支付数据预存(集合)
*
* @param recipeList 处方集
* @return 是否存储成功
*/
public int insertBatch(List<Recipe> recipeList) {
String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, feeId, feeInfo, orderType, payMchCode, payOpenId) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?)";
if (recipeList.size() == 1) {
return DataBase.insert(sql, ps -> {
setRxInsertPs(ps, recipeList.get(0));
});
}
return DataBase.insertBatch(sql, ps -> {
for (Recipe recipe : recipeList) {
setRxInsertPs(ps, recipe);
ps.addBatch(); ps.addBatch();
} }
}); });
} }
public boolean insert(Recipe recipe) {
return insertBatch(Collections.singletonList(recipe)) > 0;
}
/** /**
* 查询同一次支付的所有处方信息多处方一次支付多张发票 * 查询同一次支付的所有处方信息多处方一次支付多张发票

@ -104,7 +104,7 @@ public class RegisterDao {
List<Dept> resultList = DataBase.select(sql, Dept.class, ps -> { List<Dept> resultList = DataBase.select(sql, Dept.class, ps -> {
ps.setString(1, deptCode); ps.setString(1, deptCode);
}); });
return resultList.size() > 0 ? resultList.get(0) : null; return resultList.isEmpty() ? null : resultList.get(0);
} }
/** /**
@ -167,7 +167,7 @@ public class RegisterDao {
ps.setString(3, deptCode); ps.setString(3, deptCode);
}); });
if (regs.size() > 0) { if (!regs.isEmpty()) {
return true; return true;
} }
@ -291,8 +291,8 @@ public class RegisterDao {
if (reg.getPayMoney() == null) { if (reg.getPayMoney() == null) {
reg.setPayMoney(reg.getTotalFee()); reg.setPayMoney(reg.getTotalFee());
} }
String sql = "insert into register(updateTime, hisStatus, payStatus, openid, patientId, idCardNo, outTradeNo, bankTransNo, tradeNo, regFee, clinicFee, totalFee, payMoney, address, deptCode, deptName, doctCode, doctName, payDeviceId, clinicCode, regType, regDate, regCode, tid, tName, begTime, endTime, treatNum, queueNum, sourceId, tel, payWay, authCode, invoiceTransNo, hisTransNo, operateUser, HospitalArea, subDeptCode)" String sql = "insert into register(updateTime, hisStatus, payStatus, openid, patientId, idCardNo, outTradeNo, bankTransNo, tradeNo, regFee, clinicFee, totalFee, payMoney, address, deptCode, deptName, doctCode, doctName, payDeviceId, clinicCode, regType, regDate, regCode, tid, tName, begTime, endTime, treatNum, queueNum, sourceId, tel, payWay, authCode, invoiceTransNo, hisTransNo, operateUser, HospitalArea, subDeptCode, payMchCode, payOpenId)"
+ " values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?)"; + " values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?)";
return DataBase.insert(sql, ps -> { return DataBase.insert(sql, ps -> {
ps.setInt(1, reg.getHisStatus()); ps.setInt(1, reg.getHisStatus());
ps.setInt(2, reg.getPayStatus()); ps.setInt(2, reg.getPayStatus());
@ -338,6 +338,8 @@ public class RegisterDao {
ps.setString(35, reg.getOperateUser()); ps.setString(35, reg.getOperateUser());
ps.setString(36, reg.getHospitalArea()); ps.setString(36, reg.getHospitalArea());
ps.setString(37, reg.getSubDeptCode()); ps.setString(37, reg.getSubDeptCode());
ps.setString(38, reg.getPayMchCode());
ps.setString(39, reg.getPayOpenId());
}) > 0; }) > 0;
} }
@ -349,8 +351,8 @@ public class RegisterDao {
* @return 是否成功 * @return 是否成功
*/ */
public boolean insertMedical(Register reg) { public boolean insertMedical(Register reg) {
String sql = "insert into register(updateTime, hisStatus, payStatus, openid, patientId, idCardNo, outTradeNo, bankTransNo, tradeNo, regFee, clinicFee, totalFee, payMoney, address, deptCode, deptName, doctCode, doctName, payDeviceId, clinicCode, regType, regDate, regCode, tid, tName, begTime, endTime, treatNum, queueNum, sourceId, tel, payWay, authCode, invoiceTransNo, hisTransNo, operateUser, HospitalArea, subDeptCode, AcctFee, HifpFee, ChrgBchno, MdTrtId, MdUserId, PayOrdId)" String sql = "insert into register(updateTime, hisStatus, payStatus, openid, patientId, idCardNo, outTradeNo, bankTransNo, tradeNo, regFee, clinicFee, totalFee, payMoney, address, deptCode, deptName, doctCode, doctName, payDeviceId, clinicCode, regType, regDate, regCode, tid, tName, begTime, endTime, treatNum, queueNum, sourceId, tel, payWay, authCode, invoiceTransNo, hisTransNo, operateUser, HospitalArea, subDeptCode, AcctFee, HifpFee, ChrgBchno, MdTrtId, MdUserId, PayOrdId, payMchCode, payOpenId)"
+ " values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?)"; + " values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
return DataBase.insert(sql, ps -> { return DataBase.insert(sql, ps -> {
ps.setInt(1, reg.getHisStatus()); ps.setInt(1, reg.getHisStatus());
ps.setInt(2, reg.getPayStatus()); ps.setInt(2, reg.getPayStatus());
@ -403,6 +405,8 @@ public class RegisterDao {
ps.setString(41, reg.getMdTrtId()); ps.setString(41, reg.getMdTrtId());
ps.setString(42, reg.getMdUserId()); ps.setString(42, reg.getMdUserId());
ps.setString(43, reg.getPayOrdId()); ps.setString(43, reg.getPayOrdId());
ps.setString(44, reg.getPayMchCode());
ps.setString(45, reg.getPayOpenId());
}) > 0; }) > 0;
} }

@ -13,6 +13,7 @@ import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper; import com.ynxbd.common.helper.his.HisHelper;
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.AesWxHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
@ -64,7 +65,7 @@ public class HisRegisterDao {
Doctor doctorItem; Doctor doctorItem;
JSONObject node; JSONObject node;
Register regItem; Register regItem;
BigDecimal regFee, clinicFee; BigDecimal regFee, clinicFee, payMoney;
for (int i = 0; i < jsonArray.size(); i++) { for (int i = 0; i < jsonArray.size(); i++) {
node = jsonArray.getJSONObject(i); node = jsonArray.getJSONObject(i);
doctorItem = new Doctor(); doctorItem = new Doctor();
@ -100,7 +101,11 @@ public class HisRegisterDao {
} }
regItem.setRegFee(regFee); regItem.setRegFee(regFee);
regItem.setClinicFee(clinicFee); regItem.setClinicFee(clinicFee);
regItem.setPayMoney(regFee.add(clinicFee)); // 金额
payMoney = regFee.add(clinicFee);
regItem.setTotalFee(payMoney);
regItem.setPayMoney(payMoney);
regItem.setEnPayMoney(AesWxHelper.encode(payMoney));
doctorItem.setRegister(regItem); doctorItem.setRegister(regItem);
doctorList.add(doctorItem); doctorList.add(doctorItem);
@ -153,7 +158,7 @@ public class HisRegisterDao {
Doctor doctorItem; Doctor doctorItem;
JSONObject node; JSONObject node;
Register regItem; Register regItem;
BigDecimal regFee, clinicFee; BigDecimal regFee, clinicFee, payMoney;
String today = DateHelper.getCurDate(); String today = DateHelper.getCurDate();
for (int i = 0; i < jsonArray.size(); i++) { for (int i = 0; i < jsonArray.size(); i++) {
node = jsonArray.getJSONObject(i); node = jsonArray.getJSONObject(i);
@ -188,7 +193,11 @@ public class HisRegisterDao {
} }
regItem.setRegFee(regFee); regItem.setRegFee(regFee);
regItem.setClinicFee(clinicFee); regItem.setClinicFee(clinicFee);
regItem.setPayMoney(regFee.add(clinicFee)); // 金额
payMoney = regFee.add(clinicFee);
regItem.setTotalFee(payMoney);
regItem.setPayMoney(payMoney);
regItem.setEnPayMoney(AesWxHelper.encode(payMoney));
doctorItem.setRegister(regItem); doctorItem.setRegister(regItem);
doctorList.add(doctorItem); doctorList.add(doctorItem);
@ -933,6 +942,10 @@ public class HisRegisterDao {
sourceItem.setAddress(sourceNode.getString("ClinicAddress")); sourceItem.setAddress(sourceNode.getString("ClinicAddress"));
sourceItem.setAllowReg(sourceNode.getInteger("AllowOnline")); sourceItem.setAllowReg(sourceNode.getInteger("AllowOnline"));
sourceItem.setIsUsed(sourceNode.getInteger("IsUsed")); sourceItem.setIsUsed(sourceNode.getInteger("IsUsed"));
sourceItem.setTotalFee(regMoney);
sourceItem.setPayMoney(regMoney);
sourceItem.setEnPayMoney(AesWxHelper.encode(regMoney));
dataList.add(sourceItem); dataList.add(sourceItem);
} }
} }
@ -1108,7 +1121,9 @@ public class HisRegisterDao {
params.put("BegDate", begDate); params.put("BegDate", begDate);
params.put("EndDate", endDate); params.put("EndDate", endDate);
}); });
if (jsonResult.success()) { if (!jsonResult.success()) {
return new ArrayList<>();
}
List<RegSign> regSignList = new ArrayList<>(); List<RegSign> regSignList = new ArrayList<>();
JSONArray jsonArray = jsonResult.getJsonArray("Items", "Item"); JSONArray jsonArray = jsonResult.getJsonArray("Items", "Item");
@ -1133,8 +1148,6 @@ public class HisRegisterDao {
} }
return regSignList; return regSignList;
} }
return null;
}
/** /**

@ -14,7 +14,7 @@ public class CodeHelper {
* *
* @param prefix 编码前缀 * @param prefix 编码前缀
*/ */
public static List<Order> getOutTradeNo(String prefix, String middle, List<Long> ids) { public static List<Order> createTradeNo(String prefix, String middle, List<Long> ids) {
if (prefix == null) { if (prefix == null) {
prefix = get28UUID(); prefix = get28UUID();
} }
@ -36,23 +36,24 @@ public class CodeHelper {
return tradeList; return tradeList;
} }
/** // /**
* 获取不重复的编码 // * 获取不重复的编码
* // *
* @param merchantEnum 支付类型 // * @param merchantEnum 支付类型
*/ // */
public static String getOutTradeNo(MerchantEnum merchantEnum) { // public static String createTradeNo(MerchantEnum merchantEnum) {
String prefix; // String prefix;
if (merchantEnum == null) { // if (merchantEnum == null) {
merchantEnum = MerchantEnum.WX; // merchantEnum = MerchantEnum.WX;
} // }
prefix = merchantEnum.CODE; // prefix = merchantEnum.CODE;
if (prefix.length() > 4) { // if (prefix.length() > 4) {
prefix = prefix.substring(0, 4); // prefix = prefix.substring(0, 4);
} // }
prefix = prefix.toUpperCase(); // prefix = prefix.toUpperCase();
return prefix + get28UUID(); // return prefix + get28UUID();
} // }
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(UUID.randomUUID()); System.out.println(UUID.randomUUID());

@ -98,7 +98,7 @@ public class HisHelper {
if (pEnum == null) { if (pEnum == null) {
return null; return null;
} }
return CodeHelper.getOutTradeNo(prefix, pEnum.ORDER_CODE.toUpperCase(), ids); return CodeHelper.createTradeNo(prefix, pEnum.ORDER_CODE.toUpperCase(), ids);
} }
/** /**

@ -24,7 +24,7 @@ import java.util.List;
public class CasebookService { public class CasebookService {
// 下单 // 下单
public Result placeOrder(MerchantEnum merchantEnum, String ip, String openId, String patientId, String patientName, String treatNum, BigDecimal totalFee, String applyId, Integer getWay, String useToNo, String useToName, String address, String phone) throws ServiceException { public Result placeOrder(MerchantEnum merchantEnum, String ip, String payOpenId, String openId, String patientId, String patientName, String treatNum, BigDecimal totalFee, String applyId, Integer getWay, String useToNo, String useToName, String address, String phone) throws ServiceException {
if (openId == null || patientId == null || patientName == null || treatNum == null || totalFee == null || applyId == null || getWay == null || useToName == null) { if (openId == null || patientId == null || patientName == null || treatNum == null || totalFee == null || applyId == null || getWay == null || useToName == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
@ -34,7 +34,7 @@ public class CasebookService {
} }
PayCasebook order = selectOrderByApplyId(applyId, treatNum); PayCasebook order = selectOrderByApplyId(applyId, treatNum);
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
if (order == null) { if (order == null) {
PayCasebook addInfo = new PayCasebook(); PayCasebook addInfo = new PayCasebook();
addInfo.setTreatNum(treatNum); addInfo.setTreatNum(treatNum);
@ -73,7 +73,7 @@ public class CasebookService {
} }
String body = "病历复印 住院号:" + treatNum; String body = "病历复印 住院号:" + treatNum;
JSONObject respJson = PayService.createOrder(merchantEnum, openId, patientId, totalFee.toString(), outTradeNo, PQREnum.CASEBOOK.CODE, ip, body); JSONObject respJson = PayService.createOrder(merchantEnum, payOpenId, openId, patientId, totalFee.toString(), outTradeNo, PQREnum.CASEBOOK.CODE, ip, body);
if (respJson == null) { if (respJson == null) {
return Result.error(ResultEnum.PAY_ERROR); // 支付异常 return Result.error(ResultEnum.PAY_ERROR); // 支付异常
} }

@ -112,7 +112,7 @@ public class InHospService {
throw new ServiceException("条码为空"); throw new ServiceException("条码为空");
} }
MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByAuthCode(authCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByAuthCode(authCode);
if (merchantEnum == null) { if (merchantEnum == null) {
log.info("[HIS住院退费]失败,支付方式异常 authCode={}", authCode); log.info("[HIS住院退费]失败,支付方式异常 authCode={}", authCode);
throw new ServiceException(ResultEnum.PAY_TYPE_ERROR); throw new ServiceException(ResultEnum.PAY_TYPE_ERROR);

@ -10,7 +10,6 @@ import com.ynxbd.common.bean.pay.*;
import com.ynxbd.common.dao.RecipeDao; import com.ynxbd.common.dao.RecipeDao;
import com.ynxbd.common.dao.RegisterDao; import com.ynxbd.common.dao.RegisterDao;
import com.ynxbd.common.dao.his.HisMedDao; import com.ynxbd.common.dao.his.HisMedDao;
import com.ynxbd.common.helper.common.CodeHelper;
import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
@ -185,14 +184,17 @@ public class MedicalService {
} }
// 创建医保订单 // 创建医保订单
private MedCreateOrder 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, private MedCreateOrder createMIOrder(MerchantEnum merchantEnum, OrderMIEnum orderMIEnum, boolean hasDBOrder, String orderTitle, String payOpenId, String msgOpenId, String outTradeNo, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String chrgBchno,
BigDecimal totalFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType, BigDecimal totalFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType,
String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) throws ServiceException { String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) throws ServiceException {
MedCreateOrder medCreateOrder = new MedCreateOrder(); MedCreateOrder medCreateOrder = new MedCreateOrder();
if (ObjectUtils.isEmpty(payOpenId)) {
payOpenId = msgOpenId;
}
if (MerchantEnum.WX_MEDICAL.equals(merchantEnum)) { if (MerchantEnum.WX_MEDICAL.equals(merchantEnum)) {
Map<String, Object> map = WxMedHelper.createOrder(orderMIEnum, Map<String, Object> map = WxMedHelper.createOrder(orderMIEnum,
openid, payOpenId,
outTradeNo, outTradeNo,
chrgBchno, chrgBchno,
cardNo, cardNo,
@ -221,7 +223,7 @@ public class MedicalService {
Order order = hasDBOrder ? AliMedHelper.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 = AliMedHelper.createOrder(orderMIEnum, Map<String, Object> map = AliMedHelper.createOrder(orderMIEnum,
openid, msgOpenId,
outTradeNo, outTradeNo,
chrgBchno, chrgBchno,
payOrdId, payOrdId,
@ -248,7 +250,7 @@ public class MedicalService {
/** /**
* [医保]处方下单 * [医保]处方下单
*/ */
public Result createRxOrder(String payCode, String openid, String patientId, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId, BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType, public Result createRxOrder(String payCode, String payOpenId, String openid, String patientId, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId, BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType,
String recipeJson, String treatNum, String payWay, String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) { String recipeJson, String treatNum, String payWay, String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) {
Result result = PayService.isPaymentPermittedByTime(); Result result = PayService.isPaymentPermittedByTime();
if (result != null) { if (result != null) {
@ -262,7 +264,7 @@ public class MedicalService {
// 0:公众号内支付,1:扫码支付 // 0:公众号内支付,1:扫码支付
payWay = payWay == null ? "0" : payWay; payWay = payWay == null ? "0" : payWay;
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
Recipe rxInfo = new RecipeService().recipeJsonToInfo(treatNum, recipeJson); Recipe rxInfo = new RecipeService().recipeJsonToInfo(treatNum, recipeJson);
log.info("[医保][处方]JSON解析 RxInfo={}", rxInfo); log.info("[医保][处方]JSON解析 RxInfo={}", rxInfo);
if (rxInfo == null) { if (rxInfo == null) {
@ -276,7 +278,7 @@ public class MedicalService {
try { try {
boolean hasDBOrder = false; boolean hasDBOrder = false;
RecipeDao recipeDao = new RecipeDao(); RecipeDao recipeDao = new RecipeDao();
if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付取消支付可重新支付 if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付取消支付可重新支付
Order findOrder = recipeDao.selectMIOrderByPayOrdId(payOrdId); Order findOrder = recipeDao.selectMIOrderByPayOrdId(payOrdId);
if (findOrder != null) { if (findOrder != null) {
if (findOrder.hasPayStatusPaid()) { if (findOrder.hasPayStatusPaid()) {
@ -290,7 +292,7 @@ public class MedicalService {
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); 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; String orderTitle = "门诊号:" + treatNum;
MedCreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.DIAG_PAY, hasDBOrder, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno, MedCreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.DIAG_PAY, hasDBOrder, orderTitle, payOpenId, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno,
totalFee, insuranceFee, cashFee, notifyType, totalFee, insuranceFee, cashFee, notifyType,
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId); familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
@ -325,6 +327,8 @@ public class MedicalService {
addRecipe.setBankTransNo(bankTransNo); addRecipe.setBankTransNo(bankTransNo);
addRecipe.setPayStatus(-1); addRecipe.setPayStatus(-1);
addRecipe.setHisStatus(-1); addRecipe.setHisStatus(-1);
addRecipe.setPayMchCode(merchantEnum.CODE);
addRecipe.setPayOpenId(payOpenId);
Map<String, Object> map = miOrder.getMap(); Map<String, Object> map = miOrder.getMap();
if (miOrder.hasCreateMerOrder()) { // 订单已发起支付 if (miOrder.hasCreateMerOrder()) { // 订单已发起支付
@ -352,7 +356,7 @@ public class MedicalService {
/** /**
* [医保]挂号下单 * [医保]挂号下单
*/ */
public Result createRegOrder(String payCode, String openid, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId, BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType, Register reg, public Result createRegOrder(String payCode, String payOpenId, String openid, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId, BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType, Register reg,
String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) { String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) {
Result result = PayService.isPaymentPermittedByTime(); Result result = PayService.isPaymentPermittedByTime();
if (result != null) { if (result != null) {
@ -364,7 +368,7 @@ public class MedicalService {
return Result.error(ResultEnum.PAY_TYPE_ERROR); return Result.error(ResultEnum.PAY_TYPE_ERROR);
} }
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
try { try {
boolean hasDBOrder = false; boolean hasDBOrder = false;
RegisterDao regDao = new RegisterDao(); RegisterDao regDao = new RegisterDao();
@ -384,7 +388,7 @@ public class MedicalService {
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); 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 = "挂号"; String orderTitle = "挂号";
MedCreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.REG_PAY, hasDBOrder, orderTitle, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno, MedCreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.REG_PAY, hasDBOrder, orderTitle, payOpenId, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno,
totalFee, insuranceFee, cashFee, notifyType, totalFee, insuranceFee, cashFee, notifyType,
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId); familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
@ -407,6 +411,8 @@ public class MedicalService {
reg.setHisStatus(-1); reg.setHisStatus(-1);
reg.setBankTransNo(bankTransNo); reg.setBankTransNo(bankTransNo);
reg.setPayWay(merchantEnum.PAY_WAY_IN); reg.setPayWay(merchantEnum.PAY_WAY_IN);
reg.setPayMchCode(merchantEnum.CODE);
reg.setPayOpenId(payOpenId);
Map<String, Object> map = miOrder.getMap(); Map<String, Object> map = miOrder.getMap();
if (miOrder.hasCreateMerOrder()) { // 订单已发起支付 if (miOrder.hasCreateMerOrder()) { // 订单已发起支付

@ -256,12 +256,12 @@ public class PayService {
* @param refundMoney 退费金额 * @param refundMoney 退费金额
* @param totalFee 微信 退费总金额 * @param totalFee 微信 退费总金额
* @param refundDesc 微信 退费描述 * @param refundDesc 微信 退费描述
* @param openid 微信 推送者openid * @param msgOpenId 微信 推送者openid
* @param patientId 微信 推送者患者id * @param patientId 微信 推送者患者id
* @param pushInfo 微信 推送内容为空不推送 * @param pushInfo 微信 推送内容为空不推送
* @return 退费信息 * @return 退费信息
*/ */
public static Order refund(MerchantEnum merchantEnum, String outTradeNo, String outRefundNo, BigDecimal refundMoney, BigDecimal totalFee, String refundDesc, Date tradeDate, String openid, String patientId, String pushInfo) { public static Order refund(MerchantEnum merchantEnum, String outTradeNo, String outRefundNo, BigDecimal refundMoney, BigDecimal totalFee, String refundDesc, Date tradeDate, String msgOpenId, String patientId, String pushInfo) {
Order order = new Order(); Order order = new Order();
if (merchantEnum == null || StringUtils.isEmpty(outTradeNo) || refundMoney == null) { if (merchantEnum == null || StringUtils.isEmpty(outTradeNo) || refundMoney == null) {
return order; return order;
@ -269,7 +269,7 @@ public class PayService {
switch (merchantEnum) { switch (merchantEnum) {
case WX: case WX:
order = WxPayHelper.refund(outTradeNo, outRefundNo, refundMoney, totalFee, refundDesc); order = WxPayHelper.refund(merchantEnum, outTradeNo, outRefundNo, refundMoney, totalFee, refundDesc);
break; break;
case ALI: case ALI:
@ -532,16 +532,19 @@ public class PayService {
/** /**
* 唤起支付-创建订单 * 唤起支付-创建订单
*/ */
public static JSONObject createOrder(MerchantEnum merchantEnum, String openid, String patientId, String totalFee, String outTradeNo, String notifyType, String ip, String title) { public static JSONObject createOrder(MerchantEnum merchantEnum, String payOpenId, String msgOpenId, String patientId, String totalFee, String outTradeNo, String notifyType, String ip, String title) {
if (merchantEnum == null || ObjectUtils.isEmpty(notifyType)) { if (merchantEnum == null || ObjectUtils.isEmpty(notifyType)) {
return null; return null;
} }
if (ObjectUtils.isEmpty(payOpenId)) {
payOpenId = msgOpenId;
}
if (MerchantEnum.WX.equals(merchantEnum)) { // 微信下单 if (MerchantEnum.WX.equals(merchantEnum)) { // 微信下单
return WxPayHelper.createOrder(merchantEnum, title, totalFee, outTradeNo, notifyType, ip, openid, patientId); return WxPayHelper.createOrder(merchantEnum, title, totalFee, outTradeNo, notifyType, ip, payOpenId, msgOpenId);
} else if (MerchantEnum.ALI.equals(merchantEnum)) { // 支付宝下单 } else if (MerchantEnum.ALI.equals(merchantEnum)) { // 支付宝下单
return AliHelper.createOrder(merchantEnum, title, outTradeNo, totalFee, notifyType, openid); return AliHelper.createOrder(merchantEnum, title, outTradeNo, totalFee, notifyType, payOpenId);
} else if (MerchantEnum.BCM.equals(merchantEnum)) { } else if (MerchantEnum.BCM.equals(merchantEnum)) {
return BCMHelper.createOrder(merchantEnum, title, outTradeNo, totalFee, notifyType); return BCMHelper.createOrder(merchantEnum, title, outTradeNo, totalFee, notifyType);

@ -90,7 +90,7 @@ public class RecipeService {
* @param treatNum 门诊号 * @param treatNum 门诊号
* @return 是否完成操作 * @return 是否完成操作
*/ */
public Result recipeHand(MerchantEnum merchantEnum, String openid, String patientId, String treatNum, String totalFee, String recipeJson, String payWay, Integer awaitSecond, boolean isHttps) { public Result recipeHand(MerchantEnum merchantEnum, String payOpenId, String openid, String patientId, String treatNum, String totalFee, String recipeJson, String payWay, Integer awaitSecond, boolean isHttps) {
Result result = PayService.isPaymentPermittedByTime(); Result result = PayService.isPaymentPermittedByTime();
if (result != null) { if (result != null) {
return result; return result;
@ -120,9 +120,9 @@ public class RecipeService {
// 金额为0的处方不进行回调通知 // 金额为0的处方不进行回调通知
if ("0".equals(totalFee)) { if ("0".equals(totalFee)) {
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
// 订单信息预存 // 订单信息预存
if (!recipeService.isSaveRecipeInfo(recipeJson, payWay, openid, patientId, treatNum, outTradeNo, totalFee)) { if (!recipeService.saveRecipeInfo(merchantEnum, payOpenId, openid, recipeJson, payWay, patientId, treatNum, outTradeNo, totalFee)) {
log.info("{} [处方支付]预存支付信息失败 patientId={}", merchantEnum.NAME, patientId); log.info("{} [处方支付]预存支付信息失败 patientId={}", merchantEnum.NAME, patientId);
return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST); return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST);
} }
@ -219,8 +219,8 @@ public class RecipeService {
* @param outTradeNo 订单号 * @param outTradeNo 订单号
* @return 是否完成操作 * @return 是否完成操作
*/ */
public boolean isSaveRecipeInfo(String recipeJson, String payWay, String openid, String patientId, String treatNum, String outTradeNo, String totalFee) { public boolean saveRecipeInfo(MerchantEnum merchantEnum, String payOpenId, String openid, String recipeJson, String payWay, String patientId, String treatNum, String outTradeNo, String totalFee) {
log.info("[处方支付]预存信息 patientId={}, treatNum={}, recipeJson={}", patientId, treatNum, recipeJson); log.info("{}[处方支付]预存信息 patientId={}, treatNum={}, recipeJson={}", merchantEnum.NAME, patientId, treatNum, recipeJson);
List<Recipe> recipeList = JsonHelper.parseArray(recipeJson, Recipe.class); List<Recipe> recipeList = JsonHelper.parseArray(recipeJson, Recipe.class);
if (recipeList == null || recipeList.isEmpty()) { if (recipeList == null || recipeList.isEmpty()) {
log.info("[处方支付]勾选处方数量为0 或 数据转换失败"); log.info("[处方支付]勾选处方数量为0 或 数据转换失败");
@ -235,7 +235,9 @@ public class RecipeService {
if (ObjectUtils.isEmpty(recipe.getRecipeId()) || ObjectUtils.isEmpty(recipe.getRecipeFee())) { if (ObjectUtils.isEmpty(recipe.getRecipeId()) || ObjectUtils.isEmpty(recipe.getRecipeFee())) {
return false; return false;
} }
recipe.setPayMchCode(merchantEnum.CODE);
recipe.setOpenid(openid); recipe.setOpenid(openid);
recipe.setPayOpenId(payOpenId);
recipe.setPatientId(patientId); recipe.setPatientId(patientId);
recipe.setTreatNum(treatNum); recipe.setTreatNum(treatNum);
recipe.setOutTradeNo(outTradeNo); recipe.setOutTradeNo(outTradeNo);
@ -251,14 +253,7 @@ public class RecipeService {
} }
} }
boolean isResult; boolean isResult = recipeDao.insertBatch(recipeList) == recipeList.size();
if (recipeList.size() == 1) {
// 单个处方
isResult = recipeDao.insert(recipeList.get(0));
} else {
// 多个处方
isResult = recipeDao.insertBatch(recipeList) == recipeList.size();
}
log.info("[处方]信息预存{}, patientId={}, treatNum={}", (isResult ? "成功" : "失败"), patientId, treatNum); log.info("[处方]信息预存{}, patientId={}, treatNum={}", (isResult ? "成功" : "失败"), patientId, treatNum);
return isResult; return isResult;
} }
@ -303,7 +298,7 @@ public class RecipeService {
} }
// 订单金额验证 // 订单金额验证
BigDecimal rxTotalFee = new BigDecimal(0); BigDecimal rxTotalFee = BigDecimal.ZERO;
for (Recipe recipe : recipeList) { for (Recipe recipe : recipeList) {
rxTotalFee = rxTotalFee.add(recipe.getPayMoney()); rxTotalFee = rxTotalFee.add(recipe.getPayMoney());
} }
@ -368,7 +363,7 @@ public class RecipeService {
refundDesc = "缴费失败 处方号:" + failedRecipeId + "\n原因:[" + errorCode + "]" + errorMsg; refundDesc = "缴费失败 处方号:" + failedRecipeId + "\n原因:[" + errorCode + "]" + errorMsg;
try { try {
// 自动退费 // 自动退费
recipeAutoRefund(merchantEnum, openid, patientId, outTradeNo, failed.getTradeNo(), failedRecipeId, failed.getPayMoney(), new BigDecimal(totalFee), failed.getUpdateTime(), errorCode, errorMsg, refundDesc); rxAutoRefund(merchantEnum, openid, patientId, outTradeNo, failed.getTradeNo(), failedRecipeId, failed.getPayMoney(), new BigDecimal(totalFee), failed.getUpdateTime(), errorCode, errorMsg, refundDesc);
} catch (Exception e) { } catch (Exception e) {
ErrorHelper.println(e); ErrorHelper.println(e);
} }
@ -508,7 +503,7 @@ public class RecipeService {
* @param refundDesc 退费说明 * @param refundDesc 退费说明
* @return 是否成功 * @return 是否成功
*/ */
public boolean recipeAutoRefund(MerchantEnum merchantEnum, String openid, String patientId, String outTradeNo, String tradeNo, String recipeId, BigDecimal recipeFee, BigDecimal totalFee, Date tradeDate, String respCode, String respMessage, String refundDesc) { public boolean rxAutoRefund(MerchantEnum merchantEnum, String openid, String patientId, String outTradeNo, String tradeNo, String recipeId, BigDecimal recipeFee, BigDecimal totalFee, Date tradeDate, String respCode, String respMessage, String refundDesc) {
if (recipeFee == null || totalFee == null || ObjectUtils.isEmpty(outTradeNo) || ObjectUtils.isEmpty(recipeId) || ObjectUtils.isEmpty(tradeNo)) { if (recipeFee == null || totalFee == null || ObjectUtils.isEmpty(outTradeNo) || ObjectUtils.isEmpty(recipeId) || ObjectUtils.isEmpty(tradeNo)) {
log.info("[处方自动退款]参数缺失:outTradeNo={}, recipeId={}, tradeNo={}, fee={}, payMoney={}", outTradeNo, recipeId, tradeNo, recipeFee, totalFee); log.info("[处方自动退款]参数缺失:outTradeNo={}, recipeId={}, tradeNo={}, fee={}, payMoney={}", outTradeNo, recipeId, tradeNo, recipeFee, totalFee);
return false; return false;
@ -596,7 +591,7 @@ public class RecipeService {
throw new ServiceException("条码为空"); throw new ServiceException("条码为空");
} }
MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByAuthCode(authCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByAuthCode(authCode);
if (merchantEnum == null) { if (merchantEnum == null) {
log.info("[HIS处方退费]失败,支付方式异常 authCode={}", authCode); log.info("[HIS处方退费]失败,支付方式异常 authCode={}", authCode);
throw new ServiceException(ResultEnum.PAY_TYPE_ERROR); throw new ServiceException(ResultEnum.PAY_TYPE_ERROR);

@ -22,6 +22,7 @@ import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException; import com.ynxbd.common.result.ServiceException;
import com.ynxbd.wx.config.MessagePushConfig; import com.ynxbd.wx.config.MessagePushConfig;
import com.ynxbd.wx.utils.DateGenerate; import com.ynxbd.wx.utils.DateGenerate;
import com.ynxbd.wx.wxfactory.AesWxHelper;
import com.ynxbd.wx.wxfactory.WxMedHelper; import com.ynxbd.wx.wxfactory.WxMedHelper;
import com.ynxbd.wx.wxfactory.WxPayHelper; import com.ynxbd.wx.wxfactory.WxPayHelper;
import com.ynxbd.wx.wxfactory.medical.models.WxMedOrder; import com.ynxbd.wx.wxfactory.medical.models.WxMedOrder;
@ -69,7 +70,7 @@ public class RegService {
* @param reg 挂号信息 * @param reg 挂号信息
* @return 是否成功 * @return 是否成功
*/ */
public boolean updateRegPrepay(Register reg) { public boolean saveRegPrepay(Register reg) {
if (reg == null) { if (reg == null) {
log.info("reg is null"); log.info("reg is null");
return false; return false;
@ -400,7 +401,7 @@ public class RegService {
return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo); return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo);
} }
log.info("{}[挂号][取消预约]开始退款outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney); log.info("{}[挂号][取消预约]开始退款... outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney);
String pushInfo = "取消预约 科室:" + reg.getDeptName(); String pushInfo = "取消预约 科室:" + reg.getDeptName();
@ -438,7 +439,6 @@ public class RegService {
return Result.error(ResultEnum.REG_NOT_FIND); return Result.error(ResultEnum.REG_NOT_FIND);
} }
String tradeNo = reg.getTradeNo(); String tradeNo = reg.getTradeNo();
String outTradeNo = reg.getOutTradeNo(); String outTradeNo = reg.getOutTradeNo();
MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo); MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo);
@ -467,7 +467,7 @@ public class RegService {
new MiddleOfficeService().reg_JH0105(reg.getTreatNum()); new MiddleOfficeService().reg_JH0105(reg.getTreatNum());
log.info("{}[今日挂号][取消预约]开始退款outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney); log.info("{}[今日挂号][取消预约]开始退款... outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney);
String pushInfo = "取消预约 科室:" + reg.getDeptName(); String pushInfo = "取消预约 科室:" + reg.getDeptName();
@ -516,7 +516,7 @@ public class RegService {
throw new ServiceException("条码为空"); throw new ServiceException("条码为空");
} }
MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByAuthCode(authCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByAuthCode(authCode);
if (merchantEnum == null) { if (merchantEnum == null) {
log.info("[HIS挂号退费] 支付方式异常 authCode={}", authCode); log.info("[HIS挂号退费] 支付方式异常 authCode={}", authCode);
throw new ServiceException(ResultEnum.PAY_TYPE_ERROR); throw new ServiceException(ResultEnum.PAY_TYPE_ERROR);
@ -656,7 +656,7 @@ public class RegService {
String refundResult; String refundResult;
if (totalFee.compareTo(BigDecimal.ZERO) != 0) { // 金为0 if (totalFee.compareTo(BigDecimal.ZERO) != 0) { // 金为0
log.info("[挂号][退款]开始申请 outTradeNo={}, pushInfo={}", outTradeNo, pushInfo); log.info("{}[挂号][退款]开始申请 outTradeNo={}, pushInfo={}", merchantEnum.NAME, outTradeNo, pushInfo);
Order orderRefund = PayService.refund(merchantEnum, outTradeNo, tradeNo, totalFee, totalFee, pushInfo, tradeDate, openid, null, pushInfo); Order orderRefund = PayService.refund(merchantEnum, outTradeNo, tradeNo, totalFee, totalFee, pushInfo, tradeDate, openid, null, pushInfo);
if (!orderRefund.isSuccess()) { if (!orderRefund.isSuccess()) {
log.info("{} [挂号][退费错误] outTradeNo={}, tradeNo={}, totalFee={}", merchantEnum.NAME, outTradeNo, tradeNo, totalFee); log.info("{} [挂号][退费错误] outTradeNo={}, tradeNo={}, totalFee={}", merchantEnum.NAME, outTradeNo, tradeNo, totalFee);
@ -680,19 +680,19 @@ public class RegService {
* 挂号下单 * 挂号下单
*/ */
public Result createRegOrder(String payCode, String ip, Boolean isOccupySource, Boolean isZeroPay, Register reg, boolean isHttps) { public Result createRegOrder(String payCode, String ip, Boolean isOccupySource, Boolean isZeroPay, Register reg, boolean isHttps) {
Result noPayTime = PayService.isPaymentPermittedByTime();
if (noPayTime != null) {
return noPayTime;
}
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { if (merchantEnum == null) {
return Result.error(ResultEnum.PAY_TYPE_ERROR); // 支付方式异常 return Result.error(ResultEnum.PAY_TYPE_ERROR); // 支付方式异常
} }
Result noPayTime = PayService.isPaymentPermittedByTime();
if (noPayTime != null) {
return noPayTime;
}
String openid = reg.getOpenid(); String openid = reg.getOpenid();
String payOpenId = reg.getPayOpenId();
String patientId = reg.getPatientId(); String patientId = reg.getPatientId();
if (reg.getIsSplitTime()) { // 分时段挂号 if (reg.getIsSplitTime()) { // 分时段挂号
String sourceId = reg.getSourceId(); String sourceId = reg.getSourceId();
// 占用查询开关被开启 // 占用查询开关被开启
@ -704,9 +704,9 @@ public class RegService {
} }
} }
JSONObject mdRespJson = PayService.getMedAuthUrl(merchantEnum, PEnum.REG, isHttps); JSONObject medRespJson = PayService.getMedAuthUrl(merchantEnum, PEnum.REG, isHttps);
if (mdRespJson != null) { if (medRespJson != null) {
return Result.success(mdRespJson); return Result.success(medRespJson);
} }
String deptName = reg.getDeptName(); String deptName = reg.getDeptName();
@ -714,14 +714,15 @@ public class RegService {
BigDecimal totalFee = reg.getPayMoney(); BigDecimal totalFee = reg.getPayMoney();
String body = deptName + " 挂号(" + regDate + ")"; String body = deptName + " 挂号(" + regDate + ")";
String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); String outTradeNo = merchantEnum.createOutTradeNo();
log.info("{} [挂号]生成 outTradeNo={}", merchantEnum.NAME, outTradeNo); log.info("{} [挂号]生成 outTradeNo={}", merchantEnum.NAME, outTradeNo);
reg.setPayDeviceId("mobile"); reg.setPayDeviceId("mobile");
reg.setOutTradeNo(outTradeNo); reg.setOutTradeNo(outTradeNo);
reg.setPayWay(merchantEnum.PAY_WAY_IN); reg.setPayWay(merchantEnum.PAY_WAY_IN);
reg.setPayMchCode(merchantEnum.CODE);
if (!updateRegPrepay(reg)) { if (!saveRegPrepay(reg)) {
log.info("{} [挂号]预存支付信息失败 patientId={}", merchantEnum.NAME, patientId); log.info("{} [挂号]预存支付信息失败 patientId={}", merchantEnum.NAME, patientId);
return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST); return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST);
} }
@ -743,7 +744,7 @@ public class RegService {
} }
} }
JSONObject respJson = PayService.createOrder(merchantEnum, openid, patientId, totalFee.toString(), outTradeNo, PEnum.REG.CODE, ip, body); JSONObject respJson = PayService.createOrder(merchantEnum, payOpenId, openid, patientId, totalFee.toString(), outTradeNo, PEnum.REG.CODE, ip, body);
if (respJson == null) { if (respJson == null) {
return Result.error(ResultEnum.PAY_ERROR); // 支付异常 return Result.error(ResultEnum.PAY_ERROR); // 支付异常
} }

@ -49,10 +49,16 @@ public class WeChatConfig {
// 是否为医共体主服务 // 是否为医共体主服务
public static final boolean IS_GMC_SERVER; public static final boolean IS_GMC_SERVER;
// public static final String GMC_AUTH_APP_ID; // public static final String GMC_AUTH_APP_ID;
// public static final String GMC_AUTH_APP_SECRET; // public static final String GMC_AUTH_APP_SECRET;
public static final String GMC_AUTH_DOMAIN; public static final String GMC_AUTH_DOMAIN;
// 医共体主体公众号的AppId
public static final String GMC_APP_ID; public static final String GMC_APP_ID;
// 医共体主体小程序AppId
public static final String GMC_MINI_APP_ID;
public static final String GMC_MINI_APP_SECRET;
static { static {
ProperHelper config = new ProperHelper().read("wx.properties"); ProperHelper config = new ProperHelper().read("wx.properties");
@ -83,11 +89,13 @@ public class WeChatConfig {
// 医共体 // 医共体
IS_ENABLE_GMC = config.getBoolean("wx.gmc.is_enable", false); IS_ENABLE_GMC = config.getBoolean("wx.gmc.is_enable", false);
// GMC_AUTH_APP_ID = config.getString("wx.gmc.auth_app_id");
// GMC_AUTH_APP_SECRET = config.getString("wx.gmc.auth_app_secret");
GMC_AUTH_DOMAIN = config.getString("wx.gmc.auth_domain"); GMC_AUTH_DOMAIN = config.getString("wx.gmc.auth_domain");
GMC_APP_ID = config.getString("wx.gmc.app_id"); GMC_APP_ID = config.getString("wx.gmc.app_id");
GMC_MINI_APP_ID = config.getString("wx.gmc.mini.app_id");
GMC_MINI_APP_SECRET = config.getString("wx.gmc.mini.app_secret");
IS_GMC_SERVER = DOMAIN != null && DOMAIN.equals(GMC_AUTH_DOMAIN); IS_GMC_SERVER = DOMAIN != null && DOMAIN.equals(GMC_AUTH_DOMAIN);
} }

@ -117,7 +117,7 @@ public class QRPayServlet extends HttpServlet {
return; return;
} }
String outTradeNo = CodeHelper.getOutTradeNo(MerchantEnum.WX); String outTradeNo = MerchantEnum.WX.createOutTradeNo();
String title = ""; String title = "";
if (flag.equals("1")) { if (flag.equals("1")) {
title = ("ID:" + patientId + " 处方单号:" + recipeId); title = ("ID:" + patientId + " 处方单号:" + recipeId);

@ -3,6 +3,8 @@ package com.ynxbd.wx.wxfactory;
import com.ynxbd.common.helper.common.AesHelper; import com.ynxbd.common.helper.common.AesHelper;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal;
/** /**
* 请求参数加密处理 * 请求参数加密处理
*/ */
@ -17,6 +19,13 @@ public class AesWxHelper extends AesHelper {
return encryptHex(data, KEY, IV); return encryptHex(data, KEY, IV);
} }
public static String encode(BigDecimal data) {
if (data == null) {
return null;
}
return encryptHex(data.toString(), KEY, IV);
}
/** /**
* 加密 * 加密
*/ */
@ -36,7 +45,6 @@ public class AesWxHelper extends AesHelper {
} }
public static void main(String[] args) { public static void main(String[] args) {
// System.out.println(decode("E6835E243069406F53EC8464898B37C0")); // System.out.println(decode("E6835E243069406F53EC8464898B37C0"));
} }
} }

@ -1,19 +1,21 @@
package com.ynxbd.wx.wxfactory; package com.ynxbd.wx.wxfactory;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.http.OkHttpHelper; import com.ynxbd.common.helper.http.OkHttpHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
public class WxMiniHelper { public class WxMiniHelper {
public static String auth(String jsCode) { public static JSONObject auth(String miniAppId, String miniAppSecret, String jsCode) {
String respJson = OkHttpHelper.get("https://api.weixin.qq.com/sns/jscode2session", params -> { String respJson = OkHttpHelper.get("https://api.weixin.qq.com/sns/jscode2session", params -> {
params.put("appid", "appid"); params.put("appid", miniAppId);
params.put("secret", "secret"); params.put("secret", miniAppSecret);
params.put("js_code", jsCode); params.put("js_code", jsCode);
params.put("grant_type", "authorization_code"); params.put("grant_type", "authorization_code");
}); });
log.info("respJson:{}", respJson); log.info("[微信-小程序]认证响应: {}", respJson);
return null; return JsonHelper.parseObject(respJson);
} }
} }

@ -144,29 +144,28 @@ public class WxPayHelper {
* @param outTradeNo 订单号 * @param outTradeNo 订单号
* @param notifyType 回调类型 * @param notifyType 回调类型
* @param ip ip地址 * @param ip ip地址
* @param openid openid * @param payOpenId 用于下单的openId
* @param patientId 患者id * @param msgOpenId 用于推送的openId
* @return 成功返回 json, 否则返回null * @return 成功返回 json, 否则返回null
*/ */
public static JSONObject createOrder(MerchantEnum merchantEnum, String title, String totalFee, String outTradeNo, String notifyType, String ip, String openid, String patientId) { public static JSONObject createOrder(MerchantEnum merchantEnum, String title, String totalFee, String outTradeNo, String notifyType, String ip, String payOpenId, String msgOpenId) {
try { try {
if (ObjectUtils.isEmpty(openid) || ObjectUtils.isEmpty(outTradeNo) if (ObjectUtils.isEmpty(payOpenId) || ObjectUtils.isEmpty(outTradeNo)
|| merchantEnum == null || totalFee == null || notifyType == null) { || merchantEnum == null || totalFee == null || notifyType == null) {
log.info("【微信】下单参数缺失"); log.info("【微信】下单参数缺失");
return null; return null;
} }
// 金额转换
String cents; String cents;
try { try {
cents = new BigDecimal(totalFee).movePointRight(2).toString(); // 单位分 cents = new BigDecimal(totalFee).movePointRight(2).toString(); // 金额转换=>单位分
} catch (Exception e) { } catch (Exception e) {
ErrorHelper.println(e); ErrorHelper.println(e);
log.info("【微信】统一下单金额转换异常"); log.info("【微信】统一下单金额转换异常");
return null; return null;
} }
String appId = WeChatConfig.APP_ID; String appId = merchantEnum.APP_ID;
String mchId = WeChatConfig.MCH_ID; String mchId = WeChatConfig.MCH_ID;
String mchKey = WeChatConfig.MCH_KEY; String mchKey = WeChatConfig.MCH_KEY;
String nonce = UUID.randomUUID().toString().replace("-", ""); String nonce = UUID.randomUUID().toString().replace("-", "");
@ -175,7 +174,7 @@ public class WxPayHelper {
unifiedorder.setAppid(appId); unifiedorder.setAppid(appId);
unifiedorder.setMch_id(mchId); unifiedorder.setMch_id(mchId);
unifiedorder.setNonce_str(nonce); unifiedorder.setNonce_str(nonce);
unifiedorder.setOpenid(openid); unifiedorder.setOpenid(payOpenId);
unifiedorder.setOut_trade_no(outTradeNo); unifiedorder.setOut_trade_no(outTradeNo);
unifiedorder.setBody(title); unifiedorder.setBody(title);
@ -208,7 +207,7 @@ public class WxPayHelper {
return JsonHelper.parseObject(json); return JsonHelper.parseObject(json);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("【微信】统一下单异常信息:" + e.getMessage()); log.error("【微信】统一下单异常信息:{}", e.getMessage());
ErrorHelper.println(e); ErrorHelper.println(e);
} }
return null; return null;
@ -225,7 +224,7 @@ public class WxPayHelper {
* @param desc 退款描述 * @param desc 退款描述
* @return 退款信息 * @return 退款信息
*/ */
public static Order refund(String outTradeNo, String outRefundNo, BigDecimal refundMoney, BigDecimal totalFee, String desc) { public static Order refund(MerchantEnum merchantEnum, String outTradeNo, String outRefundNo, BigDecimal refundMoney, BigDecimal totalFee, String desc) {
Order order = new Order(); Order order = new Order();
try { try {
int feeCents; int feeCents;
@ -239,10 +238,14 @@ public class WxPayHelper {
return order; return order;
} }
if (merchantEnum == null) {
merchantEnum = MerchantEnum.WX;
}
log.info("【微信】退款开始 outTradeNo={}, refundMoney={}, totalFee={}", outTradeNo, feeCents, totalFeeCents); log.info("【微信】退款开始 outTradeNo={}, refundMoney={}, totalFee={}", outTradeNo, feeCents, totalFeeCents);
SecapiPayRefund refund = new SecapiPayRefund(); SecapiPayRefund refund = new SecapiPayRefund();
refund.setAppid(WeChatConfig.APP_ID); refund.setAppid(merchantEnum.APP_ID);
refund.setMch_id(WeChatConfig.MCH_ID); refund.setMch_id(WeChatConfig.MCH_ID);
refund.setNonce_str(UUID.randomUUID().toString().replace("-", "")); refund.setNonce_str(UUID.randomUUID().toString().replace("-", ""));
refund.setSign_type("MD5"); refund.setSign_type("MD5");

@ -1 +1 @@
# \u5F00\u542F\u5904\u65B9\u9884\u7ED3\u7B97\uFF08\u7B2C2\u5F00\u5173\uFF09\uFF08\u6CE8\u610F\u8BE5\u914D\u7F6E\u9700\u8054\u7CFBhis\u5F00\u53D1\u8005\u786E\u8BA4\u652F\u6301\u624D\u80FD\u5F00\u542F\uFF0C\u5426\u5219\u5B58\u5728\u98CE\u9669\uFF01\uFF09 his.is_recipe_prepay=false # \u672C\u5730 #his.url=127.0.0.1:8888 # HIS\u662F\u5426\u5F00\u542F\u652F\u4ED8\u5B9D\u5206\u5F00\u5BF9\u8D26 his.is_ali_mer=false # \u662F\u5426\u5F3A\u5236\u6253\u5370webservice\u7684xml\u8FD4\u56DE\u6570\u636E his.is_log_resp=true # \u662F\u5426\u4F20\u9012openid\u7ED9his\u63A8\u9001\u6D88\u606F his.is_push_msg=false #------------------------------------------------------------- # \u6D4B\u8BD5\u73AF\u5883 his.dev_url=127.0.0.1:7777 # \u533B\u4FDD====================== # \u65E7\u914D\u7F6E his.md_url=127.0.0.1:7777 # \u5FAE\u4FE1\u533B\u4FDD his.wx_med_url=10.20.10.7:7885 # \u652F\u4ED8\u5B9D\u533B\u4FDD his.ali_med_url=10.20.10.7:7885 # \u516C\u53F8\u6D4B\u8BD5 his.url=192.168.12.10:8888 # \u77F3\u6797\u6D4B\u8BD5 #his.url=200.200.200.105:8888 # \u6D4B\u8BD5============================================================ # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u7EA2\u6CB3\u5DDE\u533B\u9662 #his.url=10.20.10.6:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # \u5B81\u8497\u5987\u5E7C #his.url=172.19.3.15:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.39:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u7EA2\u6CB3 #his.url=10.20.10.6:8888 # \u7EA2\u6CB3\u533B\u4FDD #his.url=10.20.10.6:8888 #his.url=192.168.12.10:8888 #his.md_url=192.168.1.128:7885 #his.dev_url=10.20.10.6:9988 # \u6C38\u80DC #his.url=200.200.200.20:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u534E\u576A #his.url=192.168.1.115:8888 # \u8499\u81EA\u4E2D\u533B #his.url=192.168.0.228:8888 # \u7389\u9F99 #his.url=192.168.0.17:8888 # \u4E91\u9F99 #his.url=200.200.200.69:8888 # #his.url=172.16.10.15:8888 # \u7984\u529D\u949F\u7231 #his.url=200.200.200.5:8888 # \u8499\u81EA\u5E02\u4EBA\u6C11\u533B\u9662 #his.url=200.200.200.174:8080 # \u5143\u8C0B #his.url=200.200.200.29:8888 # \u5143\u8C0B\u533B\u4FDD #his.dev_url=200.200.200.36:9999 # \u8292\u5E02 #his.url=192.168.100.8:8888 # \u7EA2\u6CB3\u5987\u5E7C\u4FDD\u5065\u9662 #his.url=192.168.1.204:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # #his.url=10.10.11.23:8888 # \u77F3\u6797 #his.url=192.168.10.10:8888 # \u5BCC\u6C11 #his.url=200.200.201.27:8888 # \u897F\u53CC\u7248\u7EB3 #his.url=10.10.11.23:8888 #wx.password=ynxbd@6910 # \u5F00\u542F\u5904\u65B9\u9884\u7ED3\u7B97\uFF08\u7B2C2\u5F00\u5173\uFF09\uFF08\u6CE8\u610F\u8BE5\u914D\u7F6E\u9700\u8054\u7CFBhis\u5F00\u53D1\u8005\u786E\u8BA4\u652F\u6301\u624D\u80FD\u5F00\u542F\uFF0C\u5426\u5219\u5B58\u5728\u98CE\u9669\uFF01\uFF09 his.is_recipe_prepay=false # \u672C\u5730 #his.url=127.0.0.1:8888 # HIS\u662F\u5426\u5F00\u542F\u652F\u4ED8\u5B9D\u5206\u5F00\u5BF9\u8D26 his.is_ali_mer=false # \u662F\u5426\u5F3A\u5236\u6253\u5370webservice\u7684xml\u8FD4\u56DE\u6570\u636E his.is_log_resp=true # \u662F\u5426\u4F20\u9012openid\u7ED9his\u63A8\u9001\u6D88\u606F his.is_push_msg=false #------------------------------- # \u6D4B\u8BD5\u73AF\u5883 his.dev_url=200.200.200.105:8888 # \u533B\u4FDD=========================== # \u65E7\u914D\u7F6E his.md_url=127.0.0.1:7777 # \u5FAE\u4FE1\u533B\u4FDD his.wx_med_url=10.20.10.7:7885 # \u652F\u4ED8\u5B9D\u533B\u4FDD his.ali_med_url=10.20.10.7:7885 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u77F3\u6797\u6D4B\u8BD5 his.url=200.200.200.105:8888 # \u6D4B\u8BD5============================================================ # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u7EA2\u6CB3\u5DDE\u533B\u9662 #his.url=10.20.10.6:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # \u5B81\u8497\u5987\u5E7C #his.url=172.19.3.15:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.39:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u7EA2\u6CB3 #his.url=10.20.10.6:8888 # \u7EA2\u6CB3\u533B\u4FDD #his.url=10.20.10.6:8888 #his.url=192.168.12.10:8888 #his.md_url=192.168.1.128:7885 #his.dev_url=10.20.10.6:9988 # \u6C38\u80DC #his.url=200.200.200.20:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u534E\u576A #his.url=192.168.1.115:8888 # \u8499\u81EA\u4E2D\u533B #his.url=192.168.0.228:8888 # \u7389\u9F99 #his.url=192.168.0.17:8888 # \u4E91\u9F99 #his.url=200.200.200.69:8888 # #his.url=172.16.10.15:8888 # \u7984\u529D\u949F\u7231 #his.url=200.200.200.5:8888 # \u8499\u81EA\u5E02\u4EBA\u6C11\u533B\u9662 #his.url=200.200.200.174:8080 # \u5143\u8C0B #his.url=200.200.200.29:8888 # \u5143\u8C0B\u533B\u4FDD #his.dev_url=200.200.200.36:9999 # \u8292\u5E02 #his.url=192.168.100.8:8888 # \u7EA2\u6CB3\u5987\u5E7C\u4FDD\u5065\u9662 #his.url=192.168.1.204:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # #his.url=10.10.11.23:8888 # \u77F3\u6797 #his.url=192.168.10.10:8888 # \u5BCC\u6C11 #his.url=200.200.201.27:8888 # \u897F\u53CC\u7248\u7EB3 #his.url=10.10.11.23:8888 #wx.password=ynxbd@6910

@ -21,3 +21,6 @@ wx.is_dev=true
wx.gmc.is_enable= wx.gmc.is_enable=
wx.gmc.auth_domain= wx.gmc.auth_domain=
wx.gmc.app_id= wx.gmc.app_id=
# \u5C0F\u7A0B\u5E8F\u4E3B\u4F53AppId
wx.gmc.mini.app_id=
wx.gmc.mini.app_secret=
Loading…
Cancel
Save