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} 通道)。
|
* <p>
|
* 对接特征:直接使用微信官方 SDK({@code weixin-java-mp}),支持文本客服消息与模板消息,
|
* 需要 <b>openid</b>(而不是手机号),因此入参走 {@link WechatSendRequest#getOpenid()}。
|
* <p>
|
* 现状:该能力原先只有 {@code WxMpUtils} 一个工具类,<b>没有任何业务调用点</b>。
|
* 收口后由工厂统一调度,后续若要给「微信小程序/公众号」类任务用官方 SDK 发送,直接走这里。
|
* <p>
|
* 扩展参数:
|
* <ul>
|
* <li>{@code appId} / {@code appSecret}:公众号凭据(必填);</li>
|
* <li>{@code templateData}:模板数据 {@code Map<String,String>}(模板消息用)。</li>
|
* </ul>
|
*/
|
@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<String, String> dataMap = data instanceof Map ? (Map<String, String>) 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);
|
}
|
}
|