package com.xiaopeng.pushMessage.utils; import com.alibaba.fastjson2.JSONObject; import com.aliyun.auth.credentials.Credential; import com.aliyun.auth.credentials.provider.StaticCredentialProvider; import com.aliyun.sdk.service.push20160801.models.*; import com.aliyun.sdk.service.push20160801.*; import com.google.gson.Gson; import darabonba.core.client.ClientOverrideConfiguration; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; //import javax.net.ssl.KeyManager; //import javax.net.ssl.X509TrustManager; import java.util.concurrent.CompletableFuture; @Slf4j @Component public class AliPushUtil { @Value("${ali.push.accessKeyId}") private String accessKeyId; @Value("${ali.push.accessKeySecret}") private String accessKeySecret; @Value("${ali.push.regionId}") private String regionId; @Value("${ali.push.appKey}") private Long appKey; @Value("${ali.push.iosAppKey}") private Long iosAppKey; @Value("${ali.push.channelId}") private String channelId; @Value("${ali.push.iosChannelId}") private String iosChannelId; /** * 设备类型 ALL 全部 HARMONY 鸿蒙 IOS ios设备 ANDROID 安卓设备 */ private final String DEVICE_TYPE_ALL = "ALL"; private final String DEVICE_TYPE_HARMONY = "HARMONY"; private final String DEVICE_TYPE_IOS = "IOS"; private final String DEVICE_TYPE_ANDROID = "ANDROID"; /** * 推送目标 * DEVICE:根据设备推送。 * ACCOUNT:根据账号推送。 * ALIAS:根据别名推送。 * TAG:根据标签推送。 * ALL:推送给全部设备(同一种 DeviceType 的两次全推的间隔至少为 1 秒)。 */ private final String TARGET = "ACCOUNT"; /** * 消息推送方法 * @param account 运维手机号 * @param title 标题 * @param body 消息内容 * @param pushType NOTICE:表示通知。 MESSAGE:表示消息。 * @throws Exception */ public String pushMessage(Integer deviceType,String account, String title, String body,String pushType){ try { StaticCredentialProvider credentialProvider = StaticCredentialProvider.create( Credential.builder() .accessKeyId(accessKeyId) .accessKeySecret(accessKeySecret) .build() ); // Configure the Client try (AsyncClient client = AsyncClient.builder() .region(regionId) // Region ID .credentialsProvider(credentialProvider) .overrideConfiguration( ClientOverrideConfiguration.create() .setEndpointOverride("cloudpush.aliyuncs.com") ) .build()) { // 判断账号类型 Long appKeys = appKey; if(deviceType == 2){ appKeys = iosAppKey; } String channelIds = channelId; if(deviceType == 2){ channelIds = iosChannelId; } PushRequest pushRequest = PushRequest.builder() .appKey(appKeys) .pushType(pushType) .deviceType(DEVICE_TYPE_ALL) .target(TARGET) .targetValue(account) .title(title) .body(body) .androidExtParameters(body) .androidNotificationChannel(channelIds) .build(); if(deviceType == 2){ pushRequest = PushRequest.builder() .appKey(appKeys) .pushType(pushType) .deviceType(DEVICE_TYPE_ALL) .target(TARGET) .targetValue(account) .title(title) .body(body) .iOSExtParameters(body) .androidNotificationChannel(channelIds) .build(); } CompletableFuture response = client.push(pushRequest); PushResponse resp = response.get(); String json = new Gson().toJson(resp); log.info("运维APP-消息推送:{}",json); JSONObject jsonObject = JSONObject.parseObject(json); Integer statusCode = jsonObject.getInteger("statusCode"); if(statusCode == 200){ log.info("运维APP-消息推送成功"); JSONObject resultBody = jsonObject.getJSONObject("body"); return resultBody.getString("messageId"); }else{ log.info("运维APP-消息推送失败"); return null; } } } catch (Exception e) { log.info("运维APP-消息推送失败-异常"); e.printStackTrace(); return null; } } public static void main(String[] args) throws Exception { // HttpClient Configuration /*HttpClient httpClient = new ApacheAsyncHttpClientBuilder() .connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds .responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds .maxConnections(128) // Set the connection pool size .maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds // Configure the proxy .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("", 9001)) .setCredentials("", "")) // If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true)) .x509TrustManagers(new X509TrustManager[]{}) .keyManagers(new KeyManager[]{}) .ignoreSSL(false) .build();*/ // Configure Credentials authentication information StaticCredentialProvider credentialProvider = StaticCredentialProvider.create( Credential.builder() .accessKeyId("LTAI5tRNNQCCPn6Hc42RJYLj") .accessKeySecret("5b9sMu7b5Ab87e3Oa1qujQsBXwvjFx") .build() ); // Configure the Client try (AsyncClient client = AsyncClient.builder() .region("cn-hangzhou") // Region ID //.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient) .credentialsProvider(credentialProvider) //.serviceConfiguration(Configuration.create()) // Service-level configuration // Client-level configuration rewrite, can set Endpoint, Http request parameters, etc. .overrideConfiguration( ClientOverrideConfiguration.create() // Endpoint 请参考 https://api.aliyun.com/product/Push .setEndpointOverride("cloudpush.aliyuncs.com") //.setConnectTimeout(Duration.ofSeconds(30)) ) .build()) { // Parameter settings for API request PushRequest pushRequest = PushRequest.builder() .appKey(335666344L) .pushType("MESSAGE") .deviceType("ALL") .target("ACCOUNT") .targetValue("account1") .title("消息通知") .body("测试") // Request-level configuration rewrite, can set Http request parameters, etc. // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders())) .build(); // Asynchronously get the return value of the API request CompletableFuture response = client.push(pushRequest); // Synchronously get the return value of the API request PushResponse resp = response.get(); System.out.println(new Gson().toJson(resp)); // Asynchronous processing of return values /*response.thenAccept(resp -> { System.out.println(new Gson().toJson(resp)); }).exceptionally(throwable -> { // Handling exceptions System.out.println(throwable.getMessage()); return null; });*/ } } }