문제 설명
SolapiMessageService::getBalance() 메소드 호출 시 fatal TypeError가 발생합니다.
메소드의 반환 타입이 ?GetBalanceResponse로 선언되어 있지만, 내부적으로 Fetcher::request()가 반환한 stdClass 인스턴스를 GetBalanceResponse 객체로 감싸지 않고 그대로 반환하고 있습니다.
이로 인해 PHP 7.1 이상 환경(반환 타입 선언이 강제되는 환경)에서 getBalance()를 호출하면 항상 fatal error가 발생합니다.
환경 정보
- SDK 버전: 5.1.2 (최신)
- PHP 버전: 8.2.20
- 설치 방식:
composer require solapi/sdk
재현 방법
<?php
require_once 'vendor/autoload.php';
use Nurigo\Solapi\Services\SolapiMessageService;
$service = new SolapiMessageService('YOUR_API_KEY', 'YOUR_API_SECRET');
$balance = $service->getBalance(); // 여기서 TypeError 발생
에러 스택 트레이스
Fatal error: Uncaught TypeError: Nurigo\Solapi\Services\SolapiMessageService::getBalance():
Return value must be of type ?Nurigo\Solapi\Models\Response\GetBalanceResponse,
stdClass returned in /vendor/solapi/sdk/src/Services/SolapiMessageService.php:184
Stack trace:
#0 check.php(96): Nurigo\Solapi\Services\SolapiMessageService->getBalance()
#1 {main}
thrown in /vendor/solapi/sdk/src/Services/SolapiMessageService.php on line 184
원인 분석
src/Services/SolapiMessageService.php 파일의 181~188줄을 보면, getBalance() 메소드가 Fetcher::request()의 원시 반환값을 GetBalanceResponse 객체로 감싸지 않고 그대로 반환하고 있습니다.
public function getBalance(): ?GetBalanceResponse
{
try {
return $this->fetcherInstance->request("GET", "/cash/v1/balance");
} catch (Exception $exception) {
return null;
}
}
비교를 위해 같은 파일 내의 getMessages() 메소드(109~117줄)를 보면, 응답 모델 객체로 정상적으로 감싸서 반환하고 있는 것을 확인할 수 있습니다.
public function getMessages(?GetMessagesRequest $parameter = null): ?GetMessagesResponse
{
try {
$result = $this->fetcherInstance->request("GET", "/messages/v4/list", $parameter);
return new GetMessagesResponse($result); // ← 정상적으로 객체 생성
} catch (Exception $exception) {
return null;
}
}
getMessages()를 비롯한 다른 조회 메소드들(getGroups(), getStatistics() 등)과 일관성 있게 처리하지 못한 것으로 보입니다.
수정 제안
public function getBalance(): ?GetBalanceResponse
{
try {
$result = $this->fetcherInstance->request("GET", "/cash/v1/balance");
if ($result === null) {
return null;
}
$response = new GetBalanceResponse();
$response->balance = $result->balance ?? 0;
$response->point = $result->point ?? 0;
return $response;
} catch (Exception $exception) {
return null;
}
}
만약 GetBalanceResponse 클래스가 다른 Response 모델들처럼 원시 응답을 받는 생성자를 갖는다면, 더 간단하게 다음과 같이 수정할 수도 있습니다.
return new GetBalanceResponse($result);
임시 우회 방법
이 이슈가 수정되기 전까지는 Fetcher를 직접 사용하는 방식으로 우회할 수 있습니다.
use Nurigo\Solapi\Libraries\Fetcher;
use Nurigo\Solapi\Libraries\HttpClient;
$httpClient = new HttpClient(['timeout' => 5.0]);
$fetcher = Fetcher::getInstance($apiKey, $apiSecret, $httpClient);
$result = $fetcher->request("GET", "/cash/v1/balance");
// $result->balance, $result->point 으로 접근
문제 설명
SolapiMessageService::getBalance()메소드 호출 시 fatalTypeError가 발생합니다.메소드의 반환 타입이
?GetBalanceResponse로 선언되어 있지만, 내부적으로Fetcher::request()가 반환한stdClass인스턴스를GetBalanceResponse객체로 감싸지 않고 그대로 반환하고 있습니다.이로 인해 PHP 7.1 이상 환경(반환 타입 선언이 강제되는 환경)에서
getBalance()를 호출하면 항상 fatal error가 발생합니다.환경 정보
composer require solapi/sdk재현 방법
에러 스택 트레이스
원인 분석
src/Services/SolapiMessageService.php파일의 181~188줄을 보면,getBalance()메소드가Fetcher::request()의 원시 반환값을GetBalanceResponse객체로 감싸지 않고 그대로 반환하고 있습니다.비교를 위해 같은 파일 내의
getMessages()메소드(109~117줄)를 보면, 응답 모델 객체로 정상적으로 감싸서 반환하고 있는 것을 확인할 수 있습니다.getMessages()를 비롯한 다른 조회 메소드들(getGroups(),getStatistics()등)과 일관성 있게 처리하지 못한 것으로 보입니다.수정 제안
만약
GetBalanceResponse클래스가 다른 Response 모델들처럼 원시 응답을 받는 생성자를 갖는다면, 더 간단하게 다음과 같이 수정할 수도 있습니다.임시 우회 방법
이 이슈가 수정되기 전까지는
Fetcher를 직접 사용하는 방식으로 우회할 수 있습니다.