티스토리 뷰

네이버 커머스API를 호출 시, 인증 과정을 수행해야 정상적으로 이용이 가능하며

 

  • 전자서명 생성
  • 인증토큰 발급 (전자서명 필요)

크게 위의 두 가지 과정을 통해 인증 토큰을 발급받게 된다.

API 요청 시, 인증토큰을 요청 Header에 추가함으로 API를 사용할 수 있다.


1. 전자서명 생성

PHP에서 아래 이슈로 인해서 전자서명 생성 코드를 직접 구현해야 한다.

  1. password_hash
    • 암호 해시를 생성해주는 함수이다. 하지만 PHP 7.0.0부터 salt 옵션이 deprecated 되었으며, 8.0.0부터는 값을 추가하더라도 무시된다. salt를 고정 값(시크릿 값)으로 사용해야 하는 커머스 API는 password_hash 함수를 사용하지 못한다.
  2. 커머스 API 문서에 PHP 예시가 없다.
 

네이버 커머스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);

..

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함