diff --git a/src/main/java/com/ynxbd/common/action/base/BaseAction.java b/src/main/java/com/ynxbd/common/action/base/BaseAction.java index cafb921..47dbf86 100644 --- a/src/main/java/com/ynxbd/common/action/base/BaseAction.java +++ b/src/main/java/com/ynxbd/common/action/base/BaseAction.java @@ -189,4 +189,15 @@ public class BaseAction implements Serializable, ServletRequestAware { } return null; } + + // 是否为https请求 + protected boolean isHttpsWithProxy() { + // 优先检查代理头(适用于反向代理场景) + String forwardedProto = request.getHeader("X-Forwarded-Proto"); + if (forwardedProto != null) { + return "https".equalsIgnoreCase(forwardedProto); + } + // 未经过代理,直接检查原生请求 + return request.isSecure(); + } } diff --git a/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java b/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java index 3fc1aa7..678d8b9 100644 --- a/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java @@ -97,7 +97,7 @@ public class MedicalAction extends BaseAction { */ @Action("getRefundAuthUrl") public Result getRefundAuthUrl() { - JSONObject respJson = WxMedHelper.getMdAuthUrl("wx-medical-refund.html", null); + JSONObject respJson = WxMedHelper.getMdAuthUrl("wx-medical-refund.html", null, isHttpsWithProxy()); return Result.success(respJson); } @@ -124,7 +124,7 @@ public class MedicalAction extends BaseAction { @Action("getMedicalAuthUrl") public Result getMedicalAuthUrl(String url) { - JSONObject respJson = WxMedHelper.getMdAuthUrl(url, null); + JSONObject respJson = WxMedHelper.getMdAuthUrl(url, null, isHttpsWithProxy()); return Result.success(respJson); } diff --git a/src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java b/src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java index b5065b2..5b55165 100644 --- a/src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java @@ -25,6 +25,7 @@ import com.ynxbd.wx.wxfactory.WxMedHelper; import com.ynxbd.wx.wxfactory.bean.WxMedOrder; import com.ynxbd.wx.wxfactory.medical.WxMedConfig; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; @@ -145,6 +146,9 @@ public class MedicalTestAction extends BaseAction { @Action("his_med_refund") public Result his_med_refund(String payAuthNo, String tradeNo) { log.info("[医保]HIS退费 payAuthNo={}, tradeNo={}", payAuthNo, tradeNo); + if (ObjectUtils.isEmpty(payAuthNo) || ObjectUtils.isEmpty(tradeNo)) { + return Result.error(ResultEnum.PARAM_IS_INVALID); + } Recipe recipe = new RecipeDao().selectByTradeNo(tradeNo); if (recipe == null) { return Result.error(ResultEnum.DATA_NOT_FOUND); @@ -171,7 +175,7 @@ public class MedicalTestAction extends BaseAction { @Action("ali_med_refund_test") public Result ali_med_refund_test() throws Exception { - AliMedHelper.refundTrade("ALI_bb3c58c912384d6dc15affefad73", "ORD530100202509251522130008038", null, new BigDecimal("3.95"), "医保退费"); + AliMedHelper.refundTrade("", "", null, new BigDecimal(""), "医保退费"); return Result.success(); } diff --git a/src/main/java/com/ynxbd/common/action/pay/PayAction.java b/src/main/java/com/ynxbd/common/action/pay/PayAction.java index 2ab3121..75bd4b1 100644 --- a/src/main/java/com/ynxbd/common/action/pay/PayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/PayAction.java @@ -57,7 +57,7 @@ public class PayAction extends BaseAction { String ip = HttpHelper.getIpAddress(request); - return new RegService().regPlaceOrder(payCode, ip, isOccupySource, isZeroPay, reg); + return new RegService().regPlaceOrder(payCode, ip, isOccupySource, isZeroPay, reg, isHttpsWithProxy()); } catch (ServiceException e) { return Result.error(e); } @@ -94,7 +94,7 @@ public class PayAction extends BaseAction { } } - Result result = recipeService.recipeHand(merchantEnum, openid, patientId, treatNum, totalFee, recipeJson, payWay, awaitSecond); + Result result = recipeService.recipeHand(merchantEnum, openid, patientId, treatNum, totalFee, recipeJson, payWay, awaitSecond, isHttpsWithProxy()); if (!result.isOK() || result.getData() != null) { // 业务错误 || 存在返回数据-需提前返回 return result; } diff --git a/src/main/java/com/ynxbd/common/service/PayService.java b/src/main/java/com/ynxbd/common/service/PayService.java index ba089b6..1855f19 100644 --- a/src/main/java/com/ynxbd/common/service/PayService.java +++ b/src/main/java/com/ynxbd/common/service/PayService.java @@ -549,9 +549,9 @@ public class PayService { /** * 医保跳转 */ - public static JSONObject goMedical(MerchantEnum merchantEnum, PEnum pEnum) { + public static JSONObject getMedAuthUrl(MerchantEnum merchantEnum, PEnum pEnum, boolean isHttps) { if (MerchantEnum.WX_MEDICAL.equals(merchantEnum)) { // 微信医保(获取授权链接) - return WxMedHelper.getMdAuthUrl("wx-medical.html", pEnum.CODE); + return WxMedHelper.getMdAuthUrl("wx-medical.html", pEnum.CODE, isHttps); } return null; } diff --git a/src/main/java/com/ynxbd/common/service/RecipeService.java b/src/main/java/com/ynxbd/common/service/RecipeService.java index 82ad35e..2b6e9bc 100644 --- a/src/main/java/com/ynxbd/common/service/RecipeService.java +++ b/src/main/java/com/ynxbd/common/service/RecipeService.java @@ -90,7 +90,7 @@ public class RecipeService { * @param treatNum 门诊号 * @return 是否完成操作 */ - public Result recipeHand(MerchantEnum merchantEnum, String openid, String patientId, String treatNum, String totalFee, String recipeJson, String payWay, Integer awaitSecond) { + public Result recipeHand(MerchantEnum merchantEnum, String openid, String patientId, String treatNum, String totalFee, String recipeJson, String payWay, Integer awaitSecond, boolean isHttps) { Result result = PayService.isPaymentPermittedByTime(); if (result != null) { return result; @@ -99,7 +99,7 @@ public class RecipeService { return Result.error(ResultEnum.PAY_TYPE_ERROR); } - log.info("{}[处方预支付]参数 openid={}, patientId={}, treatNum={}, totalFee={}, awaitSecond={}, payWay={}", merchantEnum.NAME, openid, patientId, treatNum, totalFee, awaitSecond, payWay); + log.info("{}[处方预支付]参数 isHttps={}, openid={}, patientId={}, treatNum={}, totalFee={}, awaitSecond={}, payWay={}", merchantEnum.NAME, isHttps, openid, patientId, treatNum, totalFee, awaitSecond, payWay); if (openid == null || patientId == null || treatNum == null || totalFee == null || recipeJson == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } @@ -138,7 +138,7 @@ public class RecipeService { } // 医保支付 - JSONObject respMedJson = PayService.goMedical(merchantEnum, PEnum.RECIPE); + JSONObject respMedJson = PayService.getMedAuthUrl(merchantEnum, PEnum.RECIPE, isHttps); if (respMedJson != null) { return Result.success(respMedJson); } diff --git a/src/main/java/com/ynxbd/common/service/RegService.java b/src/main/java/com/ynxbd/common/service/RegService.java index d6d2b8b..2ba77bd 100644 --- a/src/main/java/com/ynxbd/common/service/RegService.java +++ b/src/main/java/com/ynxbd/common/service/RegService.java @@ -680,7 +680,7 @@ public class RegService { /** * 挂号下单 */ - public Result regPlaceOrder(String payCode, String ip, Boolean isOccupySource, Boolean isZeroPay, Register reg) { + public Result regPlaceOrder(String payCode, String ip, Boolean isOccupySource, Boolean isZeroPay, Register reg, boolean isHttps) { Result noPayTime = PayService.isPaymentPermittedByTime(); if (noPayTime != null) { return noPayTime; @@ -705,7 +705,7 @@ public class RegService { } } - JSONObject mdRespJson = PayService.goMedical(merchantEnum, PEnum.REG); + JSONObject mdRespJson = PayService.getMedAuthUrl(merchantEnum, PEnum.REG, isHttps); if (mdRespJson != null) { return Result.success(mdRespJson); } diff --git a/src/main/java/com/ynxbd/wx/config/WeChatConfig.java b/src/main/java/com/ynxbd/wx/config/WeChatConfig.java index 5bd8a67..c500750 100644 --- a/src/main/java/com/ynxbd/wx/config/WeChatConfig.java +++ b/src/main/java/com/ynxbd/wx/config/WeChatConfig.java @@ -154,6 +154,14 @@ public class WeChatConfig { return CACHE_WEB_URL; } + public static String getWebUrl(boolean isHttps) { + String webUrl = getWebUrl(); + if (isHttps && !HAS_HTTPS_BY_BASE_URL) { + webUrl = webUrl.replace("http://", "https://"); + } + return webUrl; + } + /** * 判断是否为开发用户 */ diff --git a/src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java index 0154293..9e2e296 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/WxMedHelper.java @@ -229,12 +229,13 @@ public class WxMedHelper { /** * [医保]获取授权链接 */ - public static JSONObject getMdAuthUrl(String callbackUrl, String callNo) { + public static JSONObject getMdAuthUrl(String callbackUrl, String callNo, boolean isHttps) { callNo = ObjectUtils.isEmpty(callNo) ? "" : ("?callNo=" + callNo); callbackUrl = ObjectUtils.isEmpty(callbackUrl) ? "" : callbackUrl; JSONObject jsonObj = new JSONObject(); - String authUrl = WxFactory.Medical.Common().getAuthUrl(WeChatConfig.getWebUrl() + callbackUrl); + + String authUrl = WxFactory.Medical.Common().getAuthUrl(WeChatConfig.getWebUrl(isHttps) + callbackUrl); log.info("[医保] authUrl={}", authUrl); if (ObjectUtils.isEmpty(authUrl)) { jsonObj.put("url", "config_error"); @@ -242,6 +243,7 @@ public class WxMedHelper { jsonObj.put("url", authUrl + callNo); } jsonObj.put("type", MerchantEnum.WX_MEDICAL.CODE); + jsonObj.put("isProtocol", true); // 使用发起请求的页面的协议 return jsonObj; }