package com.ruoyi.message.wechat.provider.sdk; import com.ruoyi.message.MessageChannel; import com.ruoyi.message.SendResult; import com.ruoyi.message.wechat.WechatSendRequest; import com.ruoyi.message.wechat.WechatSender; import com.ruoyi.message.wechat.support.WxMpUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import java.util.Map; /** * 微信公众号 SDK 发送方({@code wxmp-sdk} 通道)。 *

* 对接特征:直接使用微信官方 SDK({@code weixin-java-mp}),支持文本客服消息与模板消息, * 需要 openid(而不是手机号),因此入参走 {@link WechatSendRequest#getOpenid()}。 *

* 现状:该能力原先只有 {@code WxMpUtils} 一个工具类,没有任何业务调用点。 * 收口后由工厂统一调度,后续若要给「微信小程序/公众号」类任务用官方 SDK 发送,直接走这里。 *

* 扩展参数: *

*/ @Slf4j @Component public class WxMpSdkSender implements WechatSender { /** * 渠道 key */ public static final String KEY = "wxmp-sdk"; @Override public String key() { return KEY; } @Override public String description() { return "微信公众号官方 SDK(客服文本消息 / 模板消息,按 openid 发送)"; } @Override public SendResult send(WechatSendRequest request) { if (request == null || StringUtils.isEmpty(request.getOpenid())) { return SendResult.fail(KEY, MessageChannel.WECHAT, "openid 为空", null); } Object appId = request.getExtra("appId"); Object appSecret = request.getExtra("appSecret"); if (appId == null || appSecret == null) { return SendResult.fail(KEY, MessageChannel.WECHAT, "公众号 appId/appSecret 未配置", null); } try { WxMpUtils wxMpUtils = WxMpUtils.of(String.valueOf(appId), String.valueOf(appSecret)); if (StringUtils.isNotEmpty(request.getTemplateId())) { return sendTemplate(wxMpUtils, request); } boolean ok = wxMpUtils.sendTextMessage(request.getOpenid(), request.getContent()); if (ok) { return SendResult.success(KEY, MessageChannel.WECHAT, null); } return SendResult.fail(KEY, MessageChannel.WECHAT, "公众号消息发送失败", null); } catch (Exception e) { log.error("【{}】公众号消息发送异常:{}", KEY, e.getMessage(), e); return SendResult.fail(KEY, MessageChannel.WECHAT, "公众号消息发送异常:" + e.getMessage(), null); } } @SuppressWarnings("unchecked") private SendResult sendTemplate(WxMpUtils wxMpUtils, WechatSendRequest request) { Object data = request.getExtra("templateData"); Map dataMap = data instanceof Map ? (Map) data : null; String msgId = wxMpUtils.sendTemplateMessage(request.getOpenid(), request.getTemplateId(), request.getUrl(), dataMap, null); if (StringUtils.isNotEmpty(msgId)) { return SendResult.success(KEY, MessageChannel.WECHAT, msgId).withCode(msgId); } return SendResult.fail(KEY, MessageChannel.WECHAT, "公众号模板消息发送失败", null); } }