httpd 코드 수정 202-> 200
This commit is contained in:
@@ -5,6 +5,8 @@ namespace App\Commands;
|
|||||||
use CodeIgniter\CLI\BaseCommand;
|
use CodeIgniter\CLI\BaseCommand;
|
||||||
use CodeIgniter\CLI\CLI;
|
use CodeIgniter\CLI\CLI;
|
||||||
|
|
||||||
|
use App\Models\Entities\NaverWorkerLogModel; // 새로 만든 테이블용 모델
|
||||||
|
|
||||||
// 헬퍼 로드 (app/Helpers/log_helper.php 가 있어야 함 autoload 설정 넣어놓았음)
|
// 헬퍼 로드 (app/Helpers/log_helper.php 가 있어야 함 autoload 설정 넣어놓았음)
|
||||||
|
|
||||||
class NaverWorker extends BaseCommand
|
class NaverWorker extends BaseCommand
|
||||||
@@ -16,6 +18,9 @@ class NaverWorker extends BaseCommand
|
|||||||
public function run(array $params)
|
public function run(array $params)
|
||||||
{
|
{
|
||||||
helper('log'); // 여기서 로드 완료!
|
helper('log'); // 여기서 로드 완료!
|
||||||
|
|
||||||
|
$logModel = model(NaverWorkerLogModel::class);
|
||||||
|
$naverService = new \App\Services\NaverService(); // 서비스 생성
|
||||||
|
|
||||||
$redis = new \Redis();
|
$redis = new \Redis();
|
||||||
try {
|
try {
|
||||||
@@ -27,32 +32,188 @@ class NaverWorker extends BaseCommand
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$naverService = new \App\Services\NaverService(); // 서비스 생성
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
$result = $redis->brPop(['naver:raw_queue'], 30);
|
$result = $redis->brPop(['naver:raw_queue'], 30);
|
||||||
|
|
||||||
if ($result) {
|
|
||||||
try {
|
|
||||||
$responseJson = json_decode($result[1], true);
|
|
||||||
$payload = $responseJson['request_data'] ?? [];
|
|
||||||
|
|
||||||
if (empty($payload)) {
|
if (!$result) {
|
||||||
throw new \Exception("빈 페이로드 데이터");
|
// 데이터가 없어서 타임아웃 난 경우.
|
||||||
}
|
// 굳이 sleep 안 해도 바로 다음 brPop이 다시 30초 대기를 시작함.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// 서비스의 함수 하나로 모든 처리 완료
|
if ($result) {
|
||||||
$insertId = $naverService->processArticle($payload);
|
$rawData = $result[1];
|
||||||
|
// [1] 꺼내자마자 DB에 원문 저장 (2차 임시 저장)
|
||||||
CLI::write("✅ Success! DB ID: $insertId", 'cyan');
|
$logId = $logModel->insert([
|
||||||
|
'raw_payload' => $rawData,
|
||||||
|
'status' => 'INIT'
|
||||||
|
]);
|
||||||
|
|
||||||
} catch (\Exception $e) {
|
try {
|
||||||
CLI::error("❌ Task Failed: " . $e->getMessage());
|
$responseJson = json_decode($result[1], true);
|
||||||
// 실패 로그는 여기서 남김
|
$payload = $responseJson['request_data'] ?? [];
|
||||||
helper('log');
|
|
||||||
write_custom_log("FAILED_DATA | Error: " . $e->getMessage(), 'ERROR', 'failed');
|
if (empty($payload)) {
|
||||||
|
throw new \Exception("빈 페이로드 데이터");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 서비스의 함수 하나로 모든 처리 완료
|
||||||
|
$insertId = $naverService->processArticle($payload);
|
||||||
|
|
||||||
|
// [3] 성공 시 로그 업데이트
|
||||||
|
$logModel->update($logId, [
|
||||||
|
'atcl_no' => $payload['articleNumber'] ?? null,
|
||||||
|
'status' => 'SUCCESS',
|
||||||
|
'target_db_id' => $insertId
|
||||||
|
]);
|
||||||
|
|
||||||
|
CLI::write("✅ Success! DB ID: $insertId", 'cyan');
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
CLI::error("❌ Task Failed: " . $e->getMessage());
|
||||||
|
// 실패 로그는 여기서 남김
|
||||||
|
helper('log');
|
||||||
|
write_custom_log("FAILED_DATA | Error: " . $e->getMessage(), 'ERROR', 'failed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function insertVrfc($payload)
|
||||||
|
{
|
||||||
|
// 1. 필수 데이터 검증
|
||||||
|
if (empty($payload['articleNumber']) || empty($payload['requestType'])) {
|
||||||
|
throw new \Exception("필수 파라미터 누락");
|
||||||
|
}
|
||||||
|
|
||||||
|
$articleNumber = $payload['articleNumber'];
|
||||||
|
$requestType = $payload['requestType'];
|
||||||
|
$requestDatetime = date('Y-m-d H:i:s', strtotime($payload['requestDatetime']));
|
||||||
|
|
||||||
|
$vrfcModel = model(\App\Models\VrfcReqModel::class);
|
||||||
|
// 중복 요청 체크
|
||||||
|
$existing = $vrfcModel->where('atcl_no', $articleNumber)
|
||||||
|
->where('req_type', $requestType)
|
||||||
|
->first();
|
||||||
|
if ($existing) {
|
||||||
|
throw new \Exception("중복 요청: " . $articleNumber . " / " . $requestType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 네이버 API 클라이언트 초기화
|
||||||
|
$naverClient = new \App\Libraries\NaverApiClient();
|
||||||
|
// 매물 정보 조회
|
||||||
|
$articleInfojson = $naverClient->getArticleInfo($articleNumber);
|
||||||
|
// if (!$articleInfojson || !isset($articleInfojson['data']) || empty($articleInfojson['code'] !== 'success')) {
|
||||||
|
// throw new \Exception("매물 정보 조회 실패: $articleNumber ::: message : " . ($articleInfojson['message'] ?? 'No response'));
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (!$articleInfojson || !isset($articleInfojson['data']) || $articleInfojson['code'] !== 'success') {
|
||||||
|
$msg = $articleInfojson['message'] ?? 'No message';
|
||||||
|
throw new \Exception("네이버 API 응답 에러: $articleNumber | 메시지: $msg");
|
||||||
|
}
|
||||||
|
|
||||||
|
$articleInfo = $articleInfojson['data'];
|
||||||
|
|
||||||
|
// 받아온 정보 로그 기록
|
||||||
|
CLI::write("DEBUG: write_custom_log 호출 직전");
|
||||||
|
write_custom_log("ARTICLE_INFO | ArticleNumber: $articleNumber | Info: " . json_encode($articleInfo , JSON_UNESCAPED_UNICODE), 'INFO', 'service');
|
||||||
|
CLI::write("DEBUG: write_custom_log 호출 완료");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* $articleInfo['verificationTypeCode']
|
||||||
|
* S : 현장확인매물
|
||||||
|
* D : 홍보확인서
|
||||||
|
* N : 신홍보확인서
|
||||||
|
* M : 모바일
|
||||||
|
* T : 전화
|
||||||
|
* O : 모바일확인V2
|
||||||
|
*
|
||||||
|
* S - reciept , result 테이블 사용
|
||||||
|
* D,N,M,T,O - v2_vrfc_req , v2_article_info , v2_article_info_etc , v2_article_fail 테이블 사용
|
||||||
|
*/
|
||||||
|
|
||||||
|
// {"code":"success","message":"","data":{"articleNumber":"2500000001","realEstateType":"빌라/연립","realEstateTypeCode":"C02","cpId":"toad","cpArticleNumber":"15882606","tradeType":"전세","tradeTypeCode":"B1","statusTypeCode":"E12","verificationTypeCode":"M","isUnregisteredVerificationRequested":false,"isBuildingRegisterAreaCheckRequested":false,"isAutoVerificationRequested":false,"exposureStartDateTime":"2025-01-02 09:12:02","facilities":{"roomCount":2,"bathroomCount":1},"address":{"legalDivision":{"cityNumber":"1100000000","divisionNumber":"1168000000","sectorNumber":"1168010700","legalDivisionAddress":"서울특별시 강남구 신사동"},"isVirtualAddress":false,"correspondenceFloorCount":2,"longitude":0.0,"latitude":0.0},"space":{"totalSpace":34.5,"groundSpace":34.5,"buildingSpace":34.5,"supplySpace":34.5,"exclusiveSpace":34.5},"price":{"dealAmount":777777777,"warrantyAmount":2999999999,"leaseAmount":7777777},"floor":{"correspondenceFloorCount":2,"totalFloorCount":3,"undergroundFloorCount":null}}}
|
||||||
|
$comp_sq = '2';
|
||||||
|
$rcpt_rating = '3';
|
||||||
|
|
||||||
|
$files = $articleInfo['files'] ?? [];
|
||||||
|
$certRegister = [];
|
||||||
|
$confirm_doc_img_url = [];
|
||||||
|
$referenceFileUrl = [];
|
||||||
|
foreach ($files as $file) {
|
||||||
|
// 파일 처리 로직
|
||||||
|
$fileTypeCode = $file['fileTypeCode'];
|
||||||
|
if ( $fileTypeCode == 'RCDOC' ) {
|
||||||
|
$certRegister[] = $file['fileUrl'];
|
||||||
|
} elseif ( $fileTypeCode == 'ADDOC' ) {
|
||||||
|
$confirm_doc_img_url[] = $file['fileUrl'];
|
||||||
|
} elseif ( $fileTypeCode == 'REFER') {
|
||||||
|
$referenceFileUrl[] = $file['fileUrl'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$vrfc_params = [
|
||||||
|
'reqSeq' => '',
|
||||||
|
'atcl_no' => $articleInfo['articleNumber'],
|
||||||
|
'step' => '',
|
||||||
|
'cpid' => $articleInfo['cpId'],
|
||||||
|
'cp_atcl_id' => $articleInfo['cpArticleNumber'],
|
||||||
|
'trade_type' => $articleInfo['tradeTypeCode'],
|
||||||
|
'realtor_nm' => $articleInfo['realtor']['realtorName'],
|
||||||
|
'realtor_tel_no' => $articleInfo['realtor']['representativeCellphoneNumber'],
|
||||||
|
'seller_tel_no' => $articleInfo['seller']['sellerTelephoneNumber'],
|
||||||
|
'vrfc_type' => $articleInfo['verificationTypeCode'],
|
||||||
|
'rgbk_confirm' => $articleInfo['isUnregisteredVerificationRequested'] ? 'Y' : 'N',
|
||||||
|
'req_type' => '',
|
||||||
|
'rdate' => $requestDatetime ?? db_now('Y-m-d H:i:s'),
|
||||||
|
'cpTelNo' => $articleInfo['seller']['sellerTelephoneNumber'],
|
||||||
|
'stat_cd' => '10',
|
||||||
|
'try_cnt' => '0',
|
||||||
|
'insert_user' => 'admin',
|
||||||
|
'insert_tm' => db_now(),
|
||||||
|
'memo' => '',
|
||||||
|
'contact_fail_cnt' => '0',
|
||||||
|
'sync_yn' => 'N',
|
||||||
|
'reg_try_cnt' => '0',
|
||||||
|
'tel_fail_cause' => null,
|
||||||
|
'rgbk_confirm_owner_nm' => $articleInfo['seller']['ownerName'] ?? null,
|
||||||
|
'direct_trad_yn' => $articleInfo['seller']['isDirectTrade'] === true ? 'Y' : 'N',
|
||||||
|
'confirm_doc_img_url' => json_encode($confirm_doc_img_url, JSON_UNESCAPED_UNICODE),
|
||||||
|
'confirm_doc_owner_check_yn' => '',
|
||||||
|
'owner_verifiable' => null,
|
||||||
|
'vrfc_cmpl_type' => null,
|
||||||
|
'rgbk_doc_img_url' => null,
|
||||||
|
'certRegister' => json_encode($certRegister, JSON_UNESCAPED_UNICODE),
|
||||||
|
'referenceFileUrl' => json_encode($referenceFileUrl, JSON_UNESCAPED_UNICODE),
|
||||||
|
];
|
||||||
|
|
||||||
|
write_custom_log("VRFC_PARAMS | " . json_encode($vrfc_params , JSON_UNESCAPED_UNICODE), 'INFO', 'service');
|
||||||
|
|
||||||
|
|
||||||
|
// if ($articleInfo['verificationTypeCode'] == 'S') { // 현장확인매물
|
||||||
|
// // 현장확인매물 처리 로직
|
||||||
|
|
||||||
|
// } else { // 그외 일반매물
|
||||||
|
// // V2 매물 처리 로직
|
||||||
|
// $v2ArticleModel = model(\App\Models\V2ArticleModel::class);
|
||||||
|
// // 매물 번호로 중복 체크
|
||||||
|
// $existingV2 = $v2ArticleModel->where('atcl_no', $articleInfo['articleNumber'])->first();
|
||||||
|
// if ($existingV2) {
|
||||||
|
// throw new \Exception("중복 매물 번호: " . $articleInfo['articleNumber']);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// $v2ArticleModel->insert($vrfc_params);
|
||||||
|
// $vr_sq = $v2ArticleModel->getInsertID(); // 방금 삽입한 vr_sq 값 가져오기
|
||||||
|
// CLI::write("Inserted V2 Article with vr_sq: " . $vr_sq);
|
||||||
|
// // 오류 처리
|
||||||
|
// if ($v2ArticleModel->errors()) {
|
||||||
|
// $errorMessages = implode(', ', $v2ArticleModel->errors());
|
||||||
|
// throw new \Exception("V2 매물 삽입 오류: " . $errorMessages);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
26
app/Models/Entities/NaverWorkerLogModel.php
Normal file
26
app/Models/Entities/NaverWorkerLogModel.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use CodeIgniter\Model;
|
||||||
|
|
||||||
|
class NaverWorkerLogModel extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'naver_worker_logs';
|
||||||
|
protected $primaryKey = 'seq'; // 'id'가 아니므로 명시 필요
|
||||||
|
|
||||||
|
protected $useAutoIncrement = true;
|
||||||
|
|
||||||
|
protected $returnType = 'array'; // 또는 'object'
|
||||||
|
protected $useSoftDeletes = false;
|
||||||
|
|
||||||
|
// 대량 입력을 허용할 필드들
|
||||||
|
protected $allowedFields = [
|
||||||
|
'atcl_no', 'raw_payload', 'status',
|
||||||
|
'retry_cnt', 'error_msg', 'target_db_id'
|
||||||
|
];
|
||||||
|
|
||||||
|
// 날짜 자동 업데이트 설정
|
||||||
|
protected $useTimestamps = true;
|
||||||
|
protected $createdField = 'created_at';
|
||||||
|
protected $updatedField = 'updated_at';
|
||||||
|
}
|
||||||
@@ -3,8 +3,9 @@
|
|||||||
namespace App\Services;
|
namespace App\Services;
|
||||||
|
|
||||||
use App\Libraries\NaverApiClient;
|
use App\Libraries\NaverApiClient;
|
||||||
use App\Models\V2ArticleModel;
|
use App\Models\Entities\V2ArticleModel;
|
||||||
use App\Models\VrfcReqModel;
|
use App\Models\Entities\VrfcReqModel;
|
||||||
|
use App\Models\Entities\NaverWorkerLogModel; // 새로 만든 테이블용 모델
|
||||||
|
|
||||||
class NaverService
|
class NaverService
|
||||||
{
|
{
|
||||||
@@ -20,11 +21,19 @@ class NaverService
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 매물 정보를 처리하고 DB에 저장하는 메인 함수
|
* 매물 정보를 처리하고 DB에 저장하는 메인 함수
|
||||||
|
* @param array $payload 큐에서 꺼낸 원본 데이터
|
||||||
|
* requestType
|
||||||
|
* REG:수동검증요청
|
||||||
|
* MOD:매물정보수정-매물제공업체의 매물정보수정으로 재검증요청1차실패 후재검증요청
|
||||||
|
* CNC:사용자취소
|
||||||
|
* FIN 서비스-서비스 노출/대기검수완료상태,필요한상태인지확인필요
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public function processArticle(array $payload)
|
public function processArticle(array $payload)
|
||||||
{
|
{
|
||||||
$articleNumber = $payload['articleNumber'];
|
$articleNumber = $payload['articleNumber'];
|
||||||
$requestDatetime = date('Y-m-d H:i:s', strtotime($payload['requestDatetime'] ?? 'now'));
|
$requestDatetime = date('Y-m-d H:i:s', strtotime($payload['requestDatetime'] ?? 'now'));
|
||||||
|
$requestType = $payload['requestType'] ?? ''; // REG:등록 ,
|
||||||
|
|
||||||
// 1. 네이버 API 호출
|
// 1. 네이버 API 호출
|
||||||
$response = $this->naverClient->getArticleInfo($articleNumber);
|
$response = $this->naverClient->getArticleInfo($articleNumber);
|
||||||
@@ -35,16 +44,41 @@ class NaverService
|
|||||||
}
|
}
|
||||||
|
|
||||||
$articleInfo = $response['data'];
|
$articleInfo = $response['data'];
|
||||||
|
|
||||||
// 로그 기록
|
// 로그 기록
|
||||||
write_custom_log("ARTICLE_INFO | ArticleNumber: $articleNumber", 'INFO', 'service');
|
write_custom_log("ARTICLE_INFO | ArticleNumber: $articleNumber", 'INFO', 'service');
|
||||||
|
|
||||||
// 2. 가공 로직 (insertVrfc에 있던 긴 배열 생성 로직)
|
// 2. 가공 로직 (insertVrfc에 있던 긴 배열 생성 로직)
|
||||||
$vrfcParams = $this->mapToDatabaseParams($articleInfo, $payload);
|
$vrfcParams = $this->mapToDatabaseParams($articleInfo, $payload);
|
||||||
|
|
||||||
//
|
|
||||||
write_custom_log("VRFC_PARAMS | " . json_encode($vrfcParams, JSON_UNESCAPED_UNICODE), 'INFO', 'service');
|
write_custom_log("VRFC_PARAMS | " . json_encode($vrfcParams, JSON_UNESCAPED_UNICODE), 'INFO', 'service');
|
||||||
|
|
||||||
|
switch ($requestType) {
|
||||||
|
case 'REG':
|
||||||
|
$vrfcParams['req_type'] = '10';
|
||||||
|
return $this->handleRegistration($articleNumber, $vrfcParams);
|
||||||
|
break;
|
||||||
|
case 'MOD':
|
||||||
|
$vrfcParams['req_type'] = '20';
|
||||||
|
return $this->handleModification($articleNumber, $vrfcParams);
|
||||||
|
break;
|
||||||
|
case 'CNC':
|
||||||
|
$vrfcParams['req_type'] = '30';
|
||||||
|
return $this->handleStatusChange($articleNumber, $vrfcParams);
|
||||||
|
break;
|
||||||
|
case 'FIN':
|
||||||
|
$vrfcParams['req_type'] = '40';
|
||||||
|
return $this->handleStatusChange($articleNumber, $vrfcParams);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new \Exception("알 수 없는 requestType: " . $requestType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 중복 체크
|
||||||
|
$existing = $this->VrfcReqModel->where('atcl_no', $articleNumber)
|
||||||
|
|
||||||
|
->first();
|
||||||
|
if ($existing) {
|
||||||
|
throw new \Exception("중복 요청: " . $articleNumber . " / " . $vrfcParams['req_type']);
|
||||||
|
}
|
||||||
|
|
||||||
// 3. DB 저장
|
// 3. DB 저장
|
||||||
if (!$this->VrfcReqModel->insert($vrfcParams)) {
|
if (!$this->VrfcReqModel->insert($vrfcParams)) {
|
||||||
$errorMessages = implode(', ', $this->VrfcReqModel->errors());
|
$errorMessages = implode(', ', $this->VrfcReqModel->errors());
|
||||||
@@ -113,4 +147,62 @@ class NaverService
|
|||||||
|
|
||||||
return $vrfc_params;
|
return $vrfc_params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [REG] 신규 등록 처리
|
||||||
|
*/
|
||||||
|
private function handleRegistration($articleNumber, $params)
|
||||||
|
{
|
||||||
|
$existing = $this->VrfcReqModel->where('atcl_no', $articleNumber)->first();
|
||||||
|
if ($existing) {
|
||||||
|
// 이미 존재한다면 업데이트로 돌리거나 예외 처리
|
||||||
|
return $this->handleModification($articleNumber, $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->VrfcReqModel->insert($params)) {
|
||||||
|
throw new \Exception("등록 실패: " . implode(', ', $this->VrfcReqModel->errors()));
|
||||||
|
}
|
||||||
|
return $this->VrfcReqModel->getInsertID();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [MOD] 수정 처리
|
||||||
|
*/
|
||||||
|
private function handleModification($articleNumber, $params)
|
||||||
|
{
|
||||||
|
// 기존 기록이 있는지 확인
|
||||||
|
$existing = $this->VrfcReqModel->where('atcl_no', $articleNumber)->first();
|
||||||
|
|
||||||
|
if (!$existing) {
|
||||||
|
// 수정 요청인데 데이터가 없으면 새로 등록
|
||||||
|
return $this->handleRegistration($articleNumber, $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 기존 데이터 업데이트 (PK인 reqSeq 기준으로 업데이트)
|
||||||
|
if (!$this->VrfcReqModel->update($existing['reqSeq'], $params)) {
|
||||||
|
throw new \Exception("수정 실패: " . implode(', ', $this->VrfcReqModel->errors()));
|
||||||
|
}
|
||||||
|
return $existing['reqSeq'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [CNC / FIN] 상태값 변경 처리
|
||||||
|
*/
|
||||||
|
private function handleStatusChange($articleNumber, $statusCode, $memo)
|
||||||
|
{
|
||||||
|
$existing = $this->VrfcReqModel->where('atcl_no', $articleNumber)->first();
|
||||||
|
if (!$existing) {
|
||||||
|
throw new \Exception("상태 변경 실패: 해당 매물 없음 ($articleNumber)");
|
||||||
|
}
|
||||||
|
|
||||||
|
$updateData = [
|
||||||
|
'stat_cd' => $statusCode,
|
||||||
|
'memo' => $existing['memo'] . " | " . $memo . "(" . date('Y-m-d H:i:s') . ")"
|
||||||
|
];
|
||||||
|
|
||||||
|
if (!$this->VrfcReqModel->update($existing['reqSeq'], $updateData)) {
|
||||||
|
throw new \Exception("상태 업데이트 실패: " . $articleNumber);
|
||||||
|
}
|
||||||
|
return $existing['reqSeq'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,7 @@ try {
|
|||||||
// --------------------------------------
|
// --------------------------------------
|
||||||
// 6. 네이버측에 성공 응답 (202 Accepted)
|
// 6. 네이버측에 성공 응답 (202 Accepted)
|
||||||
// 처리가 완료된 것은 아니지만, 접수는 완료되었음을 의미
|
// 처리가 완료된 것은 아니지만, 접수는 완료되었음을 의미
|
||||||
http_response_code(202);
|
http_response_code(200);
|
||||||
echo apiResponse([
|
echo apiResponse([
|
||||||
'code' => 'success',
|
'code' => 'success',
|
||||||
'message' => ''
|
'message' => ''
|
||||||
|
|||||||
Reference in New Issue
Block a user