결제 연동을 할 때 SDK로 하면 편하지만, 가끔 사용하는 모듈들과 충돌을 일으킬 때까 있습니다. 이럴 때를 대비한 REST API로 구현하는 것을 눈여겨 봐두면 좋을 것 같습니다.

저는 서버에서 결제 검증만 할 것 이므로, 토큰을 얻는 것과 클라이언트에서 결제 이후 넘어온 주문 번호를 확인해 결제 정보를 읽어오는 것만 할 것 입니다.

 

1. 결제 연동을 하는 공식 문서.

-> https://developer.paypal.com/docs/api/orders/v2/

이 페이지 하나에 모든 설명이 다들어 있으며,  cURL을 이용해 사용할 수 있도록 되어 있습니다. 맥 같은 경우 cURL이 설치되어 있으므로, 쉽게 사용하며, 윈도우에서는 직접 설치해야할 지도 모르겠습니다.

 

2. nodejs 리퀘스트 설치.

-> npm i request

node js가 설치되어 있다면 위 명령으로 리퀘스트가 설치 됩니다.

 

3. cURL 명령을 request로 바꿔주는 페이지.

-> https://curl.trillworks.com/#node

curl 명령을 node js에서 request로 바꿔 주려면 조금 귀찮은 면이 있는데 이 사이트를 이용하면, 쉽게 변경할 수 있습니다.

 

4. AccessToken 얻기

-> https://developer.paypal.com/docs/api/get-an-access-token-curl/

위 페이지에 cURL 명령에서 client_id와 시크릿을 바꿔 넣으면 access 토큰을 얻을 수 있습니다. 명령은 아래와 같습니다. \는 그냥 한줄로 계속 써야한다는 의미 입니다.

curl -v https://api.sandbox.paypal.com/v1/oauth2/token \
   -H "Accept: application/json" \
   -H "Accept-Language: en_US" \
   -u "client_id:secret" \
   -d "grant_type=client_credentials"

 

5. 결제 정보 얻기

-> https://developer.paypal.com/docs/api/orders/v2/

위 페이지에서 show order details 항목을 참고 하면 구매했던 상품의 정보를 확인할 수 있습니다. cURL 명령은 아래와 같습니다.

curl -v -X GET https://api.sandbox.paypal.com/v2/checkout/orders/5O190127TN364715T \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token"

 

6. 예제 소스.

아래 소스를 그대로 가져가셔서 약간 수정해 페이팔 검증으로 사용하셔도 됩니다. 그래도 cURL로 잘되는 지 먼저 확인하시는 편이 좋습니다. (c_Util은 제가 응답을 json으로 보내기 위해, 만든 클래스 입니다.)

// 기본 모듈들 입니다.

// npm 으로 다운로드 받은 파일 입니다.
const request = require('request');

// ags에서 설정한 파일들 입니다.
const c_Util = require( './c_Util' );



//  --- --- --- ---     전역에 공개되는 값들 입니다.

// 전역 변수를 설정합니다.
let clientID = "";
let secret = "";



// 클래스를 초기화 하는 메소드 입니다.
module.exports.init = function(
    _isSandbox, _sandbox_client_id, _sandbox_secret, _live_client_id, _live_secret
){



    // 샌드 박스인 경우, 클라이언트와 시크릿을 설정합니다.
    if( _isSandbox )
    {

        console.log( "페이팔은 샌드박스로 동작합니다." );
        clientID = _sandbox_client_id;
        secret = _sandbox_secret;

    }

    // 라이브 인경우, 클라이언트와 시크릿을 설정합니다.
    else
    {

        console.log( "페이팔은 라이브로 동작합니다." );
        clientID = _live_client_id;
        secret = _live_secret;

    }


    console.log( "페이팔 클라이언트키:시크릿" + clientID + ":"+ secret );



}



// 클래스를 생성하는 메소드 입니다.
module.exports.create = function()
{



    //  --- --- --- ---     초기화 및 반환객체를 만들어 줍니다.
    let rINSTANCE = {};



    //  --- --- --- ---     에세스 토큰 획득 관련 메소드들 입니다.

    // 에세스 토큰을 가지고오는 메소드 입니다.
    rINSTANCE.getAccessToken = function()
    {

        return new Promise(function( resolve, reject ){

            let headers = {
                'Accept': 'application/json',
                'Accept-Language': 'en_US'
            };
            
            let dataString = 'grant_type=client_credentials';
            
            let options = {
                url: 'https://api.sandbox.paypal.com/v1/oauth2/token',
                method: 'POST',
                headers: headers,
                body: dataString,
                auth: {
                    'user': clientID,
                    'pass': secret
                }
            };

            
            function callback(error, response, body) {


                // 에러가 있다면 오류를 반환하고 종료합니다.
                if( error )
                {

                    let unknownError = c_Util.res_Message( {}, "에세스 토큰을 가지고 오던 중 알 수 없는 오류를 만났습니다.", 5 );
                    unknownError.detailError = error;
                    resolve( unknownError );

                }


                // 에러가 없다면 정상적인 결과를 반환합니다.
                else
                {

                    //  받은 값은 문자열 이므로, 객체로 바꿔 줍니다.
                    let resObj = JSON.parse( body );
                    resolve( resObj.access_token );
                    
                }


            }
            
            request(options, callback);
            

        });

    }



    //  --- --- --- ---      체크 아웃 관련 메소드들 입니다.

    // 상품 결제 정보가 유효한지 확인하는 메소드 입니다.
    rINSTANCE.getProduct = function( _accessToken, _orderId )
    {

        return new Promise( function( resolve, reject ){


            let headers = {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer ' + _accessToken
            };

            let options = {
                url: 'https://api.sandbox.paypal.com/v2/checkout/orders/' + _orderId,
                headers: headers
            };

            function callback(error, response, body) {

                // 오류가 난 경우 오류를 처리하도록 합니다.
                if( error )
                {

                    let unknownError = c_Util.res_Message( {}, "결제 정보를 확인하던 중 오류를 만났습니다.", 5 );
                    unknownError.detailError = error;
                    resolve( unknownError );
                    return;
                    
                }

                else
                {

                    let successResult = JSON.parse( body );
                    resolve( successResult );
                    return;

                }

            }

            request(options, callback);

        } );

    }







    //  --- --- --- ---     마무리 및 인스턴스 객체를 반환합니다.

    return rINSTANCE;




}




















































// 문서의 끝 입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,