diff --git a/austin-common/src/main/java/com/java3y/austin/common/constant/SendAccountConstant.java b/austin-common/src/main/java/com/java3y/austin/common/constant/SendAccountConstant.java index f5aa376..76c8bcc 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/constant/SendAccountConstant.java +++ b/austin-common/src/main/java/com/java3y/austin/common/constant/SendAccountConstant.java @@ -39,6 +39,11 @@ public class SendAccountConstant { public static final String ENTERPRISE_WECHAT_ACCOUNT_KEY = "enterpriseWechatAccount"; public static final String ENTERPRISE_WECHAT_PREFIX = "enterprise_wechat_"; + /** + * 微信服务号 应用消息 账号 + */ + public static final String WECHAT_OFFICIAL_ACCOUNT_KEY = "officialAccount"; + public static final String WECHAT_OFFICIAL__PREFIX = "official_"; /** * 短信 账号 diff --git a/austin-common/src/main/java/com/java3y/austin/common/dto/account/WechatOfficialAccount.java b/austin-common/src/main/java/com/java3y/austin/common/dto/account/WeChatOfficialAccount.java similarity index 74% rename from austin-common/src/main/java/com/java3y/austin/common/dto/account/WechatOfficialAccount.java rename to austin-common/src/main/java/com/java3y/austin/common/dto/account/WeChatOfficialAccount.java index 1dfecc0..3f1a1c6 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/dto/account/WechatOfficialAccount.java +++ b/austin-common/src/main/java/com/java3y/austin/common/dto/account/WeChatOfficialAccount.java @@ -19,17 +19,7 @@ import java.util.Map; @Builder @AllArgsConstructor @NoArgsConstructor -public class WechatOfficialAccount { - - /** - * 服务号关注者的openId - */ - private String openId; - - /** - * 需要使用的模板信息Id - */ - private String templateId; +public class WeChatOfficialAccount { /** * 模板消息跳转的url @@ -47,7 +37,9 @@ public class WechatOfficialAccount { private String path; /** - * 模板消息的信息载体 + * 账号相关 */ - private Map map; + private String appId; + private String secret; + private String templateId; } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/domain/wechat/WeChatOfficialParam.java b/austin-handler/src/main/java/com/java3y/austin/handler/domain/wechat/WeChatOfficialParam.java new file mode 100644 index 0000000..ecd134c --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/domain/wechat/WeChatOfficialParam.java @@ -0,0 +1,37 @@ +package com.java3y.austin.handler.domain.wechat; + +import lombok.Builder; +import lombok.Data; + +import java.util.Map; +import java.util.Set; + +/** + * @author sunql + * @date 2022年05月06日 9:56 + * + * 服务号参数 + */ +@Data +@Builder +public class WeChatOfficialParam { + /** + * 业务Id + */ + private Long messageTemplateId; + + /** + * 关注服务号得用户 + */ + private Set openIds; + + /** + * 模板消息的信息载体 + */ + private Map data; + + /** + * 发送账号 + */ + private Integer sendAccount; +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/OfficialAccountHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/OfficialAccountHandler.java index a1f274b..7e6707b 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/OfficialAccountHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/OfficialAccountHandler.java @@ -5,19 +5,15 @@ import com.google.common.base.Throwables; import com.java3y.austin.common.domain.TaskInfo; import com.java3y.austin.common.dto.model.OfficialAccountsContentModel; import com.java3y.austin.common.enums.ChannelType; +import com.java3y.austin.handler.domain.wechat.WeChatOfficialParam; import com.java3y.austin.handler.handler.BaseHandler; import com.java3y.austin.handler.handler.Handler; import com.java3y.austin.handler.script.OfficialAccountService; import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; -import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Set; /** * @author zyg @@ -30,18 +26,24 @@ public class OfficialAccountHandler extends BaseHandler implements Handler { @Autowired private OfficialAccountService officialAccountService; - public OfficialAccountHandler() { channelCode = ChannelType.OFFICIAL_ACCOUNT.getCode(); } @Override public boolean handler(TaskInfo taskInfo) { + // 构建微信模板消息 + OfficialAccountsContentModel contentModel = (OfficialAccountsContentModel) taskInfo.getContentModel(); + WeChatOfficialParam officialParam = WeChatOfficialParam.builder() + .openIds(taskInfo.getReceiver()) + .messageTemplateId(taskInfo.getMessageTemplateId()) + .sendAccount(taskInfo.getSendAccount()) + .data(contentModel.getMap()) + .build(); - List mpTemplateMessages = buildTemplateMsg(taskInfo); // 微信模板消息需要记录响应结果 try { - List messageIds = officialAccountService.send(mpTemplateMessages); + List messageIds = officialAccountService.send(officialParam); log.info("OfficialAccountHandler#handler successfully messageIds:{}", messageIds); return true; } catch (Exception e) { @@ -51,45 +53,5 @@ public class OfficialAccountHandler extends BaseHandler implements Handler { return false; } - /** - * 通过taskInfo构建微信模板消息 - * - * @param taskInfo - * @return - */ - private List buildTemplateMsg(TaskInfo taskInfo) { - // 需是关注公众号的用户的OpenId - Set receiver = taskInfo.getReceiver(); - Long messageTemplateId = taskInfo.getMessageTemplateId(); - // 微信模板消息可以关联到系统业务,通过接口查询。 - String templateId = getRealWxMpTemplateId(messageTemplateId); - List wxMpTemplateMessages = new ArrayList<>(receiver.size()); - OfficialAccountsContentModel contentModel = (OfficialAccountsContentModel) taskInfo.getContentModel(); - String url = contentModel.getUrl(); - Map param = contentModel.getMap(); - - // 构建微信模板消息 - for (String openId : receiver) { - WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() - .toUser(openId) - .templateId(templateId) - .url(url) - .build(); - // WxMpTemplateData 对应模板消息 键 -- 值 -- color - param.forEach((k, v) -> templateMessage.addData(new WxMpTemplateData(k, v))); - wxMpTemplateMessages.add(templateMessage); - } - return wxMpTemplateMessages; - } - - /** - * 根据模板id获取真实的模板id - * - * @param messageTemplateId 系统业务模板id - * @return - */ - private String getRealWxMpTemplateId(Long messageTemplateId) { - return String.valueOf(messageTemplateId); - } } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/script/OfficialAccountService.java b/austin-handler/src/main/java/com/java3y/austin/handler/script/OfficialAccountService.java index 868e76f..8451869 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/script/OfficialAccountService.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/script/OfficialAccountService.java @@ -1,5 +1,6 @@ package com.java3y.austin.handler.script; +import com.java3y.austin.handler.domain.wechat.WeChatOfficialParam; import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; import java.util.List; @@ -12,10 +13,10 @@ public interface OfficialAccountService { /** * 发送模板消息 * - * @param wxMpTemplateMessages 模板消息列表 + * @param weChatOfficialParam 模板消息参数 * @return * @throws Exception */ - List send(List wxMpTemplateMessages) throws Exception; + List send(WeChatOfficialParam weChatOfficialParam) throws Exception; } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/OfficialAccountServiceImpl.java b/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/OfficialAccountServiceImpl.java index fe69c4b..6615be6 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/OfficialAccountServiceImpl.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/OfficialAccountServiceImpl.java @@ -1,16 +1,23 @@ package com.java3y.austin.handler.script.impl; +import com.java3y.austin.common.constant.SendAccountConstant; +import com.java3y.austin.common.dto.account.WeChatOfficialAccount; +import com.java3y.austin.handler.domain.wechat.WeChatOfficialParam; import com.java3y.austin.handler.script.OfficialAccountService; +import com.java3y.austin.support.utils.AccountUtils; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Set; /** * @author zyg @@ -19,19 +26,14 @@ import java.util.List; @Slf4j public class OfficialAccountServiceImpl implements OfficialAccountService { - @Value("${wx.mp.account.appid}") - private String appId; - @Value("${wx.mp.account.secret}") - private String secret; - @Value("${wx.mp.account.token}") - private String token; - @Value("${wx.mp.account.aesKey}") - private String aesKey; - + @Autowired + private AccountUtils accountUtils; @Override - public List send(List messages) throws Exception { - WxMpService wxMpService = initService(); + public List send(WeChatOfficialParam officialParam) throws Exception { + WeChatOfficialAccount officialAccount = accountUtils.getAccount(officialParam.getSendAccount(), SendAccountConstant.WECHAT_OFFICIAL_ACCOUNT_KEY, SendAccountConstant.WECHAT_OFFICIAL__PREFIX, WeChatOfficialAccount.builder().build()); + WxMpService wxMpService = initService(officialAccount); + List messages = assembleReq(officialParam, officialAccount); List messageIds = new ArrayList<>(messages.size()); for (WxMpTemplateMessage wxMpTemplateMessage : messages) { String msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage); @@ -40,18 +42,48 @@ public class OfficialAccountServiceImpl implements OfficialAccountService { return messageIds; } + /** + * 组装发送模板信息参数 + */ + private List assembleReq(WeChatOfficialParam officialParam, WeChatOfficialAccount officialAccount) { + Set receiver = officialParam.getOpenIds(); + List wxMpTemplateMessages = new ArrayList<>(receiver.size()); + + // 构建微信模板消息 + for (String openId : receiver) { + WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() + .toUser(openId) + .templateId(officialAccount.getTemplateId()) + .url(officialAccount.getUrl()) + .data(getWxMpTemplateData(officialParam.getData())) + .miniProgram(new WxMpTemplateMessage.MiniProgram(officialAccount.getMiniProgramId(), officialAccount.getPath(), false)) + .build(); + wxMpTemplateMessages.add(templateMessage); + } + return wxMpTemplateMessages; + } + + /** + * 构建模板消息参数 + * + * @return + */ + private List getWxMpTemplateData(Map data) { + List templateDataList = new ArrayList<>(data.size()); + data.forEach((k, v) -> templateDataList.add(new WxMpTemplateData(k, v))); + return templateDataList; + } + /** * 初始化微信服务号 * * @return */ - public WxMpService initService() { + public WxMpService initService(WeChatOfficialAccount officialAccount) { WxMpService wxMpService = new WxMpServiceImpl(); WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl(); - config.setAppId(appId); - config.setSecret(secret); - config.setToken(token); - config.setAesKey(aesKey); + config.setAppId(officialAccount.getAppId()); + config.setSecret(officialAccount.getSecret()); wxMpService.setWxMpConfigStorage(config); return wxMpService; } diff --git a/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java b/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java index 66afb12..77a4fc8 100644 --- a/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java +++ b/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java @@ -26,6 +26,7 @@ public class AccountUtils { * (key:enterpriseWechatAccount)企业微信参数示例:[{"enterprise_wechat_10":{"corpId":"wwf87603333e00069c","corpSecret":"-IFWxS2222QxzPIorNVUQn144444D915DM","agentId":10044442,"token":"rXROB3333Kf6i","aesKey":"MKZtoFxHIM44444M7ieag3r9ZPUsl"}}] * (key:dingDingRobotAccount) 钉钉自定义机器人参数示例:[{"ding_ding_robot_10":{"secret":"SEC996d8d9d4768aded74114faae924f229229de444475a1c295d64fedf","webhook":"https://oapi.dingtalk.com/robot/send?access_token=8d03b644ffb6534b203d87333367328b0c3003d164715d2c6c6e56"}}] * (key:dingDingWorkNoticeAccount) 钉钉工作消息参数示例:[{"ding_ding_work_notice_10":{"appKey":"dingh6yyyyyyycrlbx","appSecret":"tQpvmkR863333yyyyyHP3QHyyyymy9Ao1yoL1oQX5Nlx_fYLLLlpPJWHvWKbTu","agentId":"152333383622"}}] + * (key:officialAccount) 微信服务号模板消息参数示例:[{"official_10":{"appId":"wxecb4693d2eef1ea7","secret":"6240870f4d91701640d769ba20120821","templateId":"JHUk6eE9T5Ts7a5JO3ZQqkBBrZBGn5C9iIiKNDQsk-Q","url":"http://weixin.qq.com/download","miniProgramId":"xiaochengxuappid12345","path":"index?foo=bar"}}] */ public T getAccount(Integer sendAccount, String apolloKey, String prefix, T t) { String accountValues = config.getProperty(apolloKey, AustinConstant.APOLLO_DEFAULT_VALUE_JSON_ARRAY);