package com.qianwen.core.notify.provider.sms.aliyun; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.util.List; import java.util.Map; import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.qianwen.core.log.exception.BizServiceException; import com.qianwen.core.notify.DefaultNotifyType; import com.qianwen.core.notify.NotifyType; import com.qianwen.core.notify.Provider; import com.qianwen.core.notify.notifier.AbstractNotifier; import com.qianwen.core.notify.notifier.NotifierProperties; import com.qianwen.core.notify.provider.sms.SmsProvider; import com.qianwen.core.notify.template.Template; import com.qianwen.core.notify.template.TemplateManager; import com.qianwen.core.tool.api.BizMessage; import com.qianwen.core.tool.metadata.Values; import com.qianwen.core.tool.utils.StringUtil; public class AliyunSmsNotifier extends AbstractNotifier { private static final Logger log = LoggerFactory.getLogger(AliyunSmsNotifier.class); private final IAcsClient client; private final int connectTimeout = 1000; private final int readTimeout = 5000; private String domain; private String regionId; private NotifierProperties notifierProperties; private String notifierId; @Override // com.qianwen.core.notify.notifier.Notifier public NotifierProperties getNotifierProperties() { return this.notifierProperties; } @Override // com.qianwen.core.notify.notifier.Notifier public String getNotifierId() { return this.notifierId; } public AliyunSmsNotifier(NotifierProperties profile, TemplateManager templateManager) { super(templateManager); this.domain = "dysmsapi.aliyuncs.com"; this.regionId = "cn-hangzhou"; Map config = profile.getConfiguration(); String str = (String) Objects.requireNonNull(config.get("regionId"), "regionId不能为空"); this.regionId = str; DefaultProfile defaultProfile = DefaultProfile.getProfile(str, (String) Objects.requireNonNull(config.get("accessKeyId"), "accessKeyId不能为空"), (String) Objects.requireNonNull(config.get("secret"), "secret不能为空")); this.client = new DefaultAcsClient(defaultProfile); this.domain = (String) config.getOrDefault("domain", this.domain); this.notifierId = profile.getId(); this.notifierProperties = profile; } public AliyunSmsNotifier(IClientProfile profile, TemplateManager templateManager) { this((IAcsClient) new DefaultAcsClient(profile), templateManager); } public AliyunSmsNotifier(IAcsClient client, TemplateManager templateManager) { super(templateManager); this.client = client; } @Override // com.qianwen.core.notify.notifier.Notifier public NotifyType getType() { return DefaultNotifyType.sms; } @Override // com.qianwen.core.notify.notifier.Notifier public Provider getProvider() { return SmsProvider.aliyunSms; } public void send(AliyunSmsTemplate template, String traceId, Values context, List notifiedParty) { try { CommonRequest request = new CommonRequest(); request.setSysMethod(MethodType.POST); request.setSysDomain(this.domain); request.setSysVersion("2021-04-22"); request.setSysAction("SendSms"); request.setSysConnectTimeout(1000); request.setSysReadTimeout(5000); request.putQueryParameter("RegionId", this.regionId); request.putQueryParameter("PhoneNumbers", StringUtil.join(notifiedParty)); request.putQueryParameter("SignName", template.getSignName()); request.putQueryParameter("TemplateCode", template.getCode()); request.putQueryParameter("TemplateParam", template.createTtsParam(context.getAllValues())); CommonResponse response = this.client.getCommonResponse(request); log.info("发送短信通知完成 {}:{}", Integer.valueOf(response.getHttpResponse().getStatus()), response.getData()); JSONObject json = JSON.parseObject(response.getData()); if (!"ok".equalsIgnoreCase(json.getString("Code"))) { BizMessage bizMessage = new BizMessage(); bizMessage.setMessage(json.getString("Code")); bizMessage.setDetail(json.getString("Message")); throw new BizServiceException(bizMessage); } }catch(Exception ex) { throw new RuntimeException(ex); } } @Override // com.qianwen.core.notify.notifier.Notifier public void close() { this.client.shutdown(); } }