다른 세팅없이.. fcm 보내는 방법입니다..
1. https://console.firebase.google.com/u/0/?hl=ko 이동해서 자신의 앱이 있는곳에서 설정으로 간다.
2.프로젝트 ID값을 저장해 둔다
3.서비스 계정 탭에서 새 비공개키 생성을 눌러서 json 파일로 저장해줍니다.
파일 이름은 fcm_auth.json
4.서버루트로 fcm_auth.json 업로드한다.
5.php코드
<?php
#error_reporting(E_ALL);
#ini_set("display_errors", '1');
class PushAgentV1 {
function base64UrlEncode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function getAccessToken() {
$serviceAccountPath = $_SERVER['DOCUMENT_ROOT']. '/fcm_auth.json'; // 서비스 계정 파일의 경로
$credentials = json_decode(file_get_contents($serviceAccountPath), true);
if (!$credentials) {
error_log("Invalid JSON in service account file.");
return null;
}
$header = $this->base64UrlEncode(json_encode(['alg' => 'RS256', 'typ' => 'JWT']));
$claimSet = $this->base64UrlEncode(json_encode([
'iss' => $credentials['client_email'],
'sub' => $credentials['client_email'],
'iat' => time(),
'exp' => time() + 3600,
]));
$signatureBase = $header . '.' . $claimSet;
// Sign the JWT using the private key
$privateKey = openssl_pkey_get_private($credentials['private_key']);
if (!$privateKey) {
error_log("Invalid private key in service account file.");
return null;
}
$signature = '';
openssl_sign($signatureBase, $signature, $privateKey, 'sha256');
openssl_free_key($privateKey);
$jwt = $signatureBase . '.' . $this->base64UrlEncode($signature);
// Send a request to get an OAuth 2.0 token
$postData = [
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion' => $jwt
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
$response = curl_exec($ch);
if ($response === false) {
$error = curl_error($ch);
error_log("cURL error in getAccessToken: $error");
curl_close($ch);
return null;
}
curl_close($ch);
$responseData = json_decode($response, true);
if (isset($responseData['error'])) {
error_log("API error in getAccessToken: " . json_encode($responseData['error']));
return null;
}
return $responseData['access_token'];
}
public function sendMessageToAndroidV1($device_ids, $mes, $title, $img, $board_idx) {
$auth_key = $this->getAccessToken();
$ch = curl_init();
//header 설정 후 삽입
$headers = array(
'Authorization: Bearer ' . $auth_key,
'Content-Type: application/json'
);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$content= "";
$notification_opt = array (
'title' => $title,
'body' => $mes,
);
//안드로이드 remoteMessage.getNotification().getTitle()
//안드로이드 remoteMessage.getNotification().getBody() 에 받음
//아아폰은 이대로 보내면 동작함...
$data_array = array (
'title' => $title,
'msg' => $mes,
'img' => '',
'board_idx' => '',
);
//안드로이드 remoteMessage.getData().getBody().get("title") 에 받음
//안드로이드 remoteMessage.getData().getBody().get("msg") 에 받음
$android_opt = array (
'notification' => array(
'default_sound' => false,
),
'data' => $data_array,
);
$tokens = $device_ids;
$message = array(
'token' => '',
'notification' => $notification_opt,
'android' => $android_opt,
'data' => $data_array,
);
$last_msg = array (
"message" => $message
);
//여러명에게 보내기 처리
foreach($tokens as $token){
$last_msg['message']['token'] = $token;
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($last_msg));
$result = curl_exec($ch);
}
if($result === FALSE){
printf("cUrl error (#%d): %s<br>\n",
curl_errno($ch),
htmlspecialchars(curl_error($ch)));
}
if($result === FALSE){
$callback= 'fail';
}else{
$callback= 'ok';
}
return $callback;
}
}
?>
5.사용법
$pushAgentV1 = new PushAgentV1();
한명에게 보내기
$push_result = $pushAgentV1->sendMessageToAndroidV1('디바이스토큰', '내용', '제목');
여러명에게 보내기
$strSQL = ' select * ';
$strSQL .= ' from ' . MEMBER_TABLE ;
$strSQL .= ' where 1 = 1';
$sth = $dbh->query($strSQL);
$tmpRST = $sth->fetchAll();
if ( count($tmpRST) ) {
for ($i=0; $i<count($tmpRST); $i++ ) {
$device_ids[] = $tmpRST1[$i]['device_id'];
}
$push_result = $pushAgentV1->sendMessageToAndroidV1($device_ids, $message, $title);
}
'안드로이드' 카테고리의 다른 글
안드로이드 tts 남자목소리 여자목소리 구분 (0) | 2024.07.05 |
---|---|
자바( JAVA) 현재시각이 특정 시각 범위 안에 드는지 체크(영업시간) (1) | 2024.04.12 |
카카오내비 길찾기 자바 (0) | 2024.03.28 |
android 타임아웃 주고 현재위치 찾기 (0) | 2024.02.28 |
android webview popup (0) | 2024.01.30 |