public class Push {
private final String PROJECT_ID = "...";
private final String FCM_URL = "https://fcm.googleapis.com/v1/projects/" + PROJECT_ID + "/messages:send";
private final String[] SCOPES = {"https://www.googleapis.com/auth/firebase.messaging"};
private static final ObjectMapper objectMapper = new ObjectMapper();
// 발송
public void send(String token, String title, String message) {
try {
HttpsURLConnection conn = getHttpsConnection(FCM_URL);
conn.setConnectTimeout(60*1000);
conn.setReadTimeout(60*1000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
// 헤더
conn.setRequestProperty("Authorization", "Bearer " + getAccessToken());
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
// 푸시데이터
PushData pushData = new PushData(token, title, message);
// 푸시데이터 객체 -> JSON
String jsonData = objectMapper.writeValueAsString(pushData);
System.out.println("DATA : " + jsonData);
conn.connect();
// 데이터전송
OutputStream os = conn.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
bw.write(jsonData);
bw.flush();
// 응답
int statusCode = conn.getResponseCode();
try ( InputStream is = (statusCode == HttpURLConnection.HTTP_OK ? conn.getInputStream() : conn.getErrorStream());
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")) ) {
StringBuilder sb = new StringBuilder();
String line;
while((line = br.readLine()) != null) {
sb.append(line);
}
System.out.println(sb.toString());
}
conn.disconnect();
}
catch (Exception e) {
e.printStackTrace();
}
}
private HttpsURLConnection getHttpsConnection(String strUrl) throws IOException, NoSuchAlgorithmException, KeyManagementException {
URL url = new URL(strUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setHostnameVerifier(hostnameVerifier);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManager, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
return conn;
}
// 사용자 인증 정보를 사용하여 액세스 토큰 발급
private String getAccessToken() throws IOException {
InputStream is = getClass().getClassLoader().getResourceAsStream("service-account.json");
GoogleCredentials googleCredentials = GoogleCredentials.fromStream(is)
.createScoped(Arrays.asList(SCOPES));
googleCredentials.refresh();
return googleCredentials.getAccessToken().getTokenValue();
}
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
// 항상허용
return true;
}
};
TrustManager[] trustManager = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}
};
}