package com.ruoyi.message.wechat.provider.xh; import com.alibaba.fastjson.JSONObject; import com.ruoyi.message.MessageChannel; import com.ruoyi.message.SendResult; import com.ruoyi.message.wechat.WechatMpConfig; import com.ruoyi.message.wechat.WechatMpConfigProvider; import com.ruoyi.message.wechat.WechatSendRequest; import com.ruoyi.message.wechat.WechatSender; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Component; import java.util.Map; /** * 新华医院微信公众号发送方({@code xh} 通道)。 *

* 对接特征:POST JSON + {@code sign=MD5(appSecret+body)},成功判定为返回 JSON 的 {@code succ == true}。 *

* 站点差异(调用方需保留): *

* 代码来源:{@code RyTask 公众号分支} + {@code RedisMqReceiver 公众号分支} + * {@code ServiceSubtaskServiceImpl.wechatSubTask}(行为保持不变)。 */ @Slf4j @Component public class XinHuaMpSender implements WechatSender { /** * 渠道 key,与 {@code spring.profiles.active=xh} 对应 */ public static final String KEY = "xh"; private final ObjectProvider configProvider; private final XinHuaMpApi xinHuaMpApi; public XinHuaMpSender(ObjectProvider configProvider, XinHuaMpApi xinHuaMpApi) { this.configProvider = configProvider; this.xinHuaMpApi = xinHuaMpApi; } @Override public String key() { return KEY; } @Override public String description() { return "新华医院微信公众号(sign 签名,succ 判定)"; } @Override public SendResult send(WechatSendRequest request) { if (request == null) { return SendResult.fail(KEY, MessageChannel.WECHAT, "【公众号】请求参数为空", null); } WechatMpConfig config = resolveConfig(request.getOrgid()); if (config == null || !config.isComplete()) { return SendResult.fail(KEY, MessageChannel.WECHAT, "【公众号】该机构的公众号配置信息不全,无法通过公众号发送", null); } if (StringUtils.isEmpty(request.getPatidHis())) { return SendResult.fail(KEY, MessageChannel.WECHAT, "【公众号】公众号发送失败,his系统的患者id为空", null); } try { String raw = xinHuaMpApi.sendMessage( request.getIdCard(), request.getUrl(), request.getTitle(), request.getContent(), request.getPhone(), request.getPatientName(), request.getPatidHis(), config, request.isDisableHtmlEscaping()); Map map = JSONObject.parseObject(raw, Map.class); boolean success = map != null && !map.isEmpty() && map.get("succ") != null && Boolean.parseBoolean(map.get("succ").toString()); if (success) { return SendResult.success(KEY, MessageChannel.WECHAT, raw); } Object msg = map == null ? null : map.get("msg"); String message = msg == null ? "【公众号】公众号发送失败" : msg.toString(); log.error("【{}】公众号发送失败,错误信息:{}", KEY, message); return SendResult.fail(KEY, MessageChannel.WECHAT, message, raw); } catch (Exception e) { log.error("【{}】公众号发送异常:{}", KEY, e.getMessage(), e); return SendResult.fail(KEY, MessageChannel.WECHAT, "【公众号】公众号发送失败,原因:" + e.getMessage(), null); } } private WechatMpConfig resolveConfig(String orgid) { WechatMpConfigProvider provider = configProvider.getIfAvailable(); if (provider == null) { log.warn("【{}】未找到 WechatMpConfigProvider 实现,无法获取机构公众号配置", KEY); return null; } return provider.getConfig(orgid); } }