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 发送,直接走这里。
*
* 扩展参数:
*
* - {@code appId} / {@code appSecret}:公众号凭据(必填);
* - {@code templateData}:模板数据 {@code Map}(模板消息用)。
*
*/
@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);
}
}