티스토리 뷰
네이버 커머스API를 호출 시, 인증 과정을 수행해야 정상적으로 이용이 가능하며
- 전자서명 생성
- 인증토큰 발급 (전자서명 필요)
크게 위의 두 가지 과정을 통해 인증 토큰을 발급받게 된다.
API 요청 시, 인증토큰을 요청 Header에 추가함으로 API를 사용할 수 있다.
1. 전자서명 생성
PHP에서 아래 이슈로 인해서 전자서명 생성 코드를 직접 구현해야 한다.
- password_hash
- 암호 해시를 생성해주는 함수이다. 하지만 PHP 7.0.0부터 salt 옵션이 deprecated 되었으며, 8.0.0부터는 값을 추가하더라도 무시된다. salt를 고정 값(시크릿 값)으로 사용해야 하는 커머스 API는 password_hash 함수를 사용하지 못한다.
- 커머스 API 문서에 PHP 예시가 없다.
- 참고 : https://apicenter.commerce.naver.com/ko/basic/commerce-api > 인증 > 전자서명
네이버 커머스API센터
커머스API를 활용해서 다양한 아이디어로 새로운 기회를 잡아보세요.
apicenter.commerce.naver.com
전자서명 생성 소스코드
/**
* 전자서명 생성
* @param String $clientId 클라이언트 ID
* @param String $clientSecret 클라이언트 시크릿
* @param String $timestamp 밀리초(millisecond) 단위의 Unix 시간
* @return String
*/
public function generateSignature($clientId, $clientSecret, $timestamp)
{
if (strlen($clientSecret) < 22) {
return '';
}
// 밑줄로 연결하여 password 생성
$password = $clientId . "_" . $timestamp;
$clientSecret = str_replace('+', '.', $clientSecret);
// 암호화
$cryptedSignature = crypt($password, $clientSecret);
// base64 인코딩
return base64_encode($cryptedSignature);
}
참고 : https://blog.asamaru.net/2016/02/24/php-password-hash-salt-option-has-been-deprecated/
PHP password_hash() salt option has been deprecated
php에서 비밀번호를 암호화해서 저장하기 위해서 password_hash()를 사용하고 있다. 다른 곳에서도 오래전에는 MD5, SHA1과 같은 hash 함수를 사용하는 경우들도 있었지만 요즘은 대부분 password_hash()을
blog.asamaru.net
2. 인증 토큰 발급
Client ID, timestamp, 그리고 위 과정을 통해 생성한 전자서명을 사용해서 인증 토큰을 발급받는다.
class CommerceApiAuth {
/**
* @var string 커머스API 애플리케이션 ID
*/
private $clientId = '';
/**
* @var string 커머스API 애플리케이션 시크릿
* bcrypt 암호화에서 고정 salt로 사용.
*/
private $clientSecret = '';
/**
* @var string Unix Timestamp 13digit
*/
private $timestamp;
/**
* @var string 전자서명
*/
private $signature;
/**
* @var string
*/
private $urlAccessToken = "https://api.commerce.naver.com/external/v1/oauth2/token";
/**
* Access Token 발급
* @return string
* @throws Exception
*/
public function getAccessToken()
{
try {
$commerceApi = new CommerceApi();
$apiData = array(
'client_id' => $this->clientId,
'timestamp' => $this->timestamp,
'client_secret_sign' => $this->signature,
'grant_type' => 'client_credentials',
'type' => 'SELF'
);
$resultData = $commerceApi->requestCurl("POST", $this->urlAccessToken, $apiData);
if (empty($resultData->access_token)){
throw new Exception("엑세스 토큰이 없습니다.");
}
return $resultData->access_token;
} catch (Exception $e) {
print_r($e->getMessage());
}
}
}
/**
* 커머스API Request Class
*/
class CommerceApi {
/**
* CURL Request
*
* @param string $method HTTP request method
* @param string $url 커머스API 요청 URL
* @param array $data 전송 Data
* @return mixed
*/
public function requestCurl($method, $url, $data = array())
{
$curlHandle = curl_init();
/* CURL option Setting */
if ($method === "GET") {
} elseif ($method === "POST" || $method == "PUT") {
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curlHandle, CURLOPT_URL, $url);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
/* CURL result */
$response = curl_exec($curlHandle);
curl_close($curlHandle);
return json_decode($response);
}
}
3. API 요청 시 인증토큰 추가
API 요청 시, 요청 헤더에 Authorization 속성과 인증토큰을 추가한다.
/* HTTP Header */
$header = array();
array_push($header, "Authorization: Bearer " . $accessToken);
.. 중략 ..
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, $header);
..
'PHP > 네이버 커머스API' 카테고리의 다른 글
[PHP/커머스API] GET 요청 시, Datetime 형식의 값 설정 (0) | 2022.10.24 |
---|