diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/CallClient.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/CallClient.java index e7f86805adad925a774c655f56f128d73a250778..a1268038e2d08f6bf3a482f2c500333d389023a7 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/CallClient.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/CallClient.java @@ -1,5 +1,10 @@ package com.oszero.deliver.server.client.call; +import com.oszero.deliver.server.model.app.call.CallApp; +import com.oszero.deliver.server.model.dto.common.SendTaskDto; + +import java.util.concurrent.ExecutionException; + /** * 电话客户端接口 * @@ -8,4 +13,6 @@ package com.oszero.deliver.server.client.call; */ public interface CallClient { + void sendCall(CallApp callApp, SendTaskDto sendTaskDto) throws ExecutionException, InterruptedException; + } diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/impl/AliYunCallClient.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/impl/AliYunCallClient.java index 6793f2d5f14d7d7fd6ab111384931ffc8706e15c..70021b52beeb044e7ab6b96e98f8ce6617c7a7cc 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/impl/AliYunCallClient.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/impl/AliYunCallClient.java @@ -1,7 +1,23 @@ package com.oszero.deliver.server.client.call.impl; +import com.aliyun.auth.credentials.Credential; +import com.aliyun.auth.credentials.provider.StaticCredentialProvider; +import com.aliyun.sdk.service.dyvmsapi20170525.AsyncClient; +import com.aliyun.sdk.service.dyvmsapi20170525.models.SingleCallByTtsRequest; +import com.aliyun.sdk.service.dyvmsapi20170525.models.SingleCallByTtsResponse; +import com.oszero.deliver.server.client.call.CallClient; +import com.oszero.deliver.server.exception.MessageException; +import com.oszero.deliver.server.model.app.call.AliYunCallApp; +import com.oszero.deliver.server.model.app.call.CallApp; +import com.oszero.deliver.server.model.dto.common.SendTaskDto; +import darabonba.core.client.ClientOverrideConfiguration; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + /** * 电话客户端阿里云实现 * @@ -9,5 +25,61 @@ import org.springframework.stereotype.Service; * @version 1.0.0 */ @Service -public class AliYunCallClient { +public class AliYunCallClient implements CallClient { + + private static final String ENDPOINT_OVERRIDE = "dyvmsapi.aliyuncs.com"; + private static final String OUT_ID = "outId"; + private static final String REGION = "region"; + private static final String CALLED_SHOW_NUMBER = "calledShowNumber"; + private static final String CALLED_NUMBER = "calledNumber"; + private static final String TTS_CODE = "ttsCode"; + private static final String TTS_PARAM = "ttsParam"; + private static final String PLAY_TIMES = "playTimes"; + private static final String VOLUME = "volume"; + private static final String SPEED = "speed"; + + + @Override + public void sendCall(CallApp callApp, SendTaskDto sendTaskDto) { + + List users = sendTaskDto.getUsers(); + String phoneNumbers = String.join(",", users); + Map map = sendTaskDto.getParamMap(); + AliYunCallApp aliYunCallApp = (AliYunCallApp) callApp ; + + StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() + .accessKeyId(aliYunCallApp.getAccessKeyId()) + .accessKeySecret(aliYunCallApp.getAccessKeySecret()) + .build()); + + try (AsyncClient client = AsyncClient.builder() + .region((String) map.get(REGION)) + .credentialsProvider(provider) + .overrideConfiguration( + ClientOverrideConfiguration.create() + .setEndpointOverride(ENDPOINT_OVERRIDE) + ) + .build()) { + + SingleCallByTtsRequest singleCallByTtsRequest = SingleCallByTtsRequest.builder() + .calledNumber((String) map.get(CALLED_NUMBER)) + .calledShowNumber((String) map.get(CALLED_SHOW_NUMBER)) + .ttsCode((String) map.get(TTS_CODE)) + .ttsParam((String) map.get(TTS_PARAM)) + .playTimes((Integer) map.get(PLAY_TIMES)) + .volume((Integer) map.get(VOLUME)) + .speed((Integer) map.get(SPEED)) + .outId((String) map.get(OUT_ID)) + .build(); + CompletableFuture response = client.singleCallByTts(singleCallByTtsRequest); + SingleCallByTtsResponse resp = response.get(); + } catch (InterruptedException | ExecutionException e) { + throw new MessageException("语音电话失败," + e.getMessage()); + } + + + } + + } + diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/sms/impl/AliYunSmsClient.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/sms/impl/AliYunSmsClient.java index d53e1961bcf8fe63f5526ccd0530379cde274781..9eb35698057385e86bb21cc05accc30a90da86a5 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/sms/impl/AliYunSmsClient.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/sms/impl/AliYunSmsClient.java @@ -7,13 +7,14 @@ import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest; import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse; import com.oszero.deliver.server.client.sms.SmsClient; import com.oszero.deliver.server.exception.MessageException; -import com.oszero.deliver.server.model.app.sms.SmsApp; import com.oszero.deliver.server.model.app.sms.AliYunSmsApp; +import com.oszero.deliver.server.model.app.sms.SmsApp; import com.oszero.deliver.server.model.dto.common.SendTaskDto; import darabonba.core.client.ClientOverrideConfiguration; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -28,21 +29,26 @@ public class AliYunSmsClient implements SmsClient { private static final String TEMPLATE_PARAM = "templateParam"; private static final String ENDPOINT_OVERRIDE = "dysmsapi.aliyuncs.com"; + private static final String SMS_UP_EXTEND_CODE = "smsUpExtendCode"; + private static final String OUT_ID = "outId"; + private static final String SIG_NAME = "signName"; + private static final String TEMPLATE_CODE = "templateCode"; + private static final String REGION = "region"; @Override public void sendSms(SmsApp smsApp, SendTaskDto sendTaskDto) { List users = sendTaskDto.getUsers(); String phoneNumbers = String.join(",", users); + Map map = sendTaskDto.getParamMap(); AliYunSmsApp aliYunSmsApp = (AliYunSmsApp) smsApp; StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() - // 此处以把AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里 - // 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险 - .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) - .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")) + .accessKeyId(aliYunSmsApp.getAccessKeyId()) + .accessKeySecret(aliYunSmsApp.getAccessKeySecret()) .build()); try (AsyncClient client = AsyncClient.builder() + .region((String) map.get(REGION)) .credentialsProvider(provider) .overrideConfiguration( ClientOverrideConfiguration @@ -53,9 +59,11 @@ public class AliYunSmsClient implements SmsClient { SendSmsRequest sendSmsRequest = SendSmsRequest.builder() .phoneNumbers(phoneNumbers) - .signName(aliYunSmsApp.getSignName()) - .templateCode(aliYunSmsApp.getTemplateCode()) - .templateParam((String) sendTaskDto.getParamMap().get(TEMPLATE_PARAM)) + .signName((String) map.get(SIG_NAME)) + .templateCode((String) map.get(TEMPLATE_CODE)) + .templateParam((String)map.get(TEMPLATE_PARAM)) + .smsUpExtendCode((String) map.get(SMS_UP_EXTEND_CODE)) + .outId((String) map.get(OUT_ID)) .build(); CompletableFuture response = client.sendSms(sendSmsRequest); diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/handler/impl/SmsHandler.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/handler/impl/SmsHandler.java index 817a6299e1df1f505bf69737f8ecdf6c8389f8ae..bf3c71babf77dffef8b612f9d79ef14c6f88a64a 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/handler/impl/SmsHandler.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/handler/impl/SmsHandler.java @@ -54,6 +54,6 @@ public class SmsHandler extends BaseHandler { } else if (SmsProviderTypeEnum.TENCENT.getName().equals(smsProvider)) { return JSONUtil.toBean(appConfig, TencentSmsApp.class); } - throw new MessageException("没有指定的短信服务 App:" + smsProvider); + throw new MessageException("没有指定的短信服务 App:" + smsProvider); } } diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/AliYunCallApp.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/AliYunCallApp.java new file mode 100644 index 0000000000000000000000000000000000000000..e38523adaf0c33ef857d0d75dbd1657a9979ca44 --- /dev/null +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/AliYunCallApp.java @@ -0,0 +1,20 @@ +package com.oszero.deliver.server.model.app.call; + +import lombok.*; + +/** + * 阿里云电话 APP 配置 + * + * @author oszero + * @version 1.0.0 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class AliYunCallApp extends CallApp { + private String accessKeyId; + private String accessKeySecret; + +} diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/CallApp.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/CallApp.java similarity index 68% rename from deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/CallApp.java rename to deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/CallApp.java index bdb5872df812794c497289048384fa6655d424c8..cda779d5583a7f8e3ab74d20c39cd45dce01f020 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/CallApp.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/CallApp.java @@ -1,5 +1,6 @@ -package com.oszero.deliver.server.model.app; +package com.oszero.deliver.server.model.app.call; +import com.oszero.deliver.server.model.app.AppConfig; import lombok.*; /** diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/sms/AliYunSmsApp.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/sms/AliYunSmsApp.java index a843416e9964b367ef2a027abf896c44212729ce..8bf1c320b756828f27844a069d863dafa2d0957a 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/sms/AliYunSmsApp.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/sms/AliYunSmsApp.java @@ -15,7 +15,7 @@ import lombok.*; @EqualsAndHashCode(callSuper = true) public class AliYunSmsApp extends SmsApp { - private String signName; - private String templateCode; + private String accessKeyId; + private String accessKeySecret; } diff --git a/deliver-backend/pom.xml b/deliver-backend/pom.xml index 7cb6e0861a26701221ae66d03aad89e58ae75ca6..89071570d738f64c5c314859e81e846aae777968 100644 --- a/deliver-backend/pom.xml +++ b/deliver-backend/pom.xml @@ -40,6 +40,7 @@ 2.2.3 2.0.24 + 1.0.0 3.1.915 @@ -50,6 +51,11 @@ alibabacloud-dysmsapi20170525 ${aliyun-sms-sdk-version} + + com.aliyun + alibabacloud-dyvmsapi20170525 + ${aliyun-call-sdk-version} + com.tencentcloudapi tencentcloud-sdk-java diff --git a/deliver-front/vue/components.d.ts b/deliver-front/vue/components.d.ts index 3c605da25d7a7d95b5046356e76e133b5abfdce1..06d4b469503022701b456c53bf665e0156bbfbb0 100644 --- a/deliver-front/vue/components.d.ts +++ b/deliver-front/vue/components.d.ts @@ -13,34 +13,24 @@ declare module 'vue' { ACard: typeof import('ant-design-vue/es')['Card'] ACardMeta: typeof import('ant-design-vue/es')['CardMeta'] ACol: typeof import('ant-design-vue/es')['Col'] - ADescriptions: typeof import('ant-design-vue/es')['Descriptions'] - ADescriptionsItem: typeof import('ant-design-vue/es')['DescriptionsItem'] ADivider: typeof import('ant-design-vue/es')['Divider'] - ADrawer: typeof import('ant-design-vue/es')['Drawer'] AForm: typeof import('ant-design-vue/es')['Form'] AFormItem: typeof import('ant-design-vue/es')['FormItem'] AInput: typeof import('ant-design-vue/es')['Input'] - AInputGroup: typeof import('ant-design-vue/es')['InputGroup'] - AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] ALayout: typeof import('ant-design-vue/es')['Layout'] ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent'] ALayoutFooter: typeof import('ant-design-vue/es')['LayoutFooter'] ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader'] ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider'] - AList: typeof import('ant-design-vue/es')['List'] - AListItem: typeof import('ant-design-vue/es')['ListItem'] AMenu: typeof import('ant-design-vue/es')['Menu'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] AModal: typeof import('ant-design-vue/es')['Modal'] APagination: typeof import('ant-design-vue/es')['Pagination'] APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] - ARadioButton: typeof import('ant-design-vue/es')['RadioButton'] - ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] ARangePicker: typeof import('ant-design-vue/es')['RangePicker'] ARow: typeof import('ant-design-vue/es')['Row'] ASelect: typeof import('ant-design-vue/es')['Select'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] - AStatistic: typeof import('ant-design-vue/es')['Statistic'] ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] ASwitch: typeof import('ant-design-vue/es')['Switch'] ATable: typeof import('ant-design-vue/es')['Table']