본문 바로가기

안드로이드

php7.0 fcm http v1

 

 

다른 세팅없이..  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_URL, 'https://oauth2.googleapis.com/token');
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);

}