페이팔은 결제 연동이 매우 간단한 편이라, 따로 소스는 두지 않았고, 주의 사항만 메모를 해 두었습니다.

 

1. 개발 사이트

-> https://developer.paypal.com

페이팔은 테스트를 위한 SANDBOX 서버, 실제 거래를 위한 LIVE 서버를 운영하고 있습니다. SANDBOX 와 LIVE 서버는 같은 앱이라도 각각 다른 클라이언트 ID, 시크릿을 설정해 주어야 합니다.

 

2. 체크 아웃 예제 페이지.

-> https://developer.paypal.com/docs/checkout/integrate/#

클라이언트 아이디만 넣어 주고, 그냥 소스를 붙여 넣기만 해도 잘 동작합니다. 영수증 검증에 사용되는 값은, 결제 후 받는 data의 orderID, 혹은 details의 id 값을 넣으면 됩니다. (둘이 같은 값 입니다.). 이 페이지만 따라 하면 모든 연동이 끝이 납니다.

 

3. 클라이언트 SDK 설정.

클라이언트 SDK 설정에는 클라이언트 아이디만 넣어주면 기본적으로 설저이 끝이 나지만, 추가 옵션으로 통화 등을 설정할 수 있습니다.

 

4. 서버사이드 설정.

-> https://developer.paypal.com/docs/checkout/reference/server-integration/setup-sdk/

서버 사이드 설정의 SDK 설치 방법은 의외로 눈에 잘 띄지 않는데, 이 페이지에 있습니다.

 

5. 서버에서 결제 셋팅.

->  https://developer.paypal.com/docs/checkout/reference/server-integration/set-up-transaction/

서버에서 결제 처리를 할 이유는 잘 없지만, 페이팔에서 가능합니다. 일단 링크를 걸어 둡니다.

 

6. 결제.

-> https://developer.paypal.com/docs/checkout/reference/server-integration/capture-transaction/#on-the-server

capture는 실제 결제 처리를 하는 부분입니다. 만약 클라이언트에서 넘어온, 결제를 이 루틴으로 검증하려고 하면 오류를 만납니다. 결제는 아래 결제 확인 부분에서 처리하면됩니다.

 

7. 결제 확인.

-> https://developer.paypal.com/docs/checkout/reference/server-integration/get-transaction/

클라이언트에서 결제 하면 서버에서 주로 결제를 확인하는데 이 부분에서 하게 됩니다. 많이 쓰게 되니 소스 코드를 봐 두세요. 결제 확인 이후 res.json 등의 헤더 변경을 하는 방법으로 소스를 보내면 오류를 만납니다. res.end 메소드로 응답을 보내 주세요.

 

8. 예제.

-> https://github.com/paypal/Checkout-Nodejs-SDK/

문서에 있는 코드들을 보면, 쉽게 이해가 가지 않습니다. 생략된 것들이 많이서 인데, 일단 예제를 보면 쉽게 이해가 갑니다. 위 문서를 잘 읽어 보셨다면, 보자 마자 이해가 될 정도 입니다.

예제는 아래와 같이 들어 가면됩니다.

1. https://developer.paypal.com/docs/checkout/reference/server-integration/setup-sdk/#http-request-headers 문서로가서 화면 아래로 스크롤을 한뒤, Additional information에서 원하는 것을 선택하면됩니다.

 

9. 마지막으로 클라이언트에서 결제 소스.

제가 구현했던 결제 소스를 남겨 드립니다. 참고하시기 바랍니다.

// npm 모듈들.
const express = require( 'express' );
const paypal = require('@paypal/checkout-server-sdk');







module.exports.init = function(
    _isDebug, _client_id, _secret, _sandbox_client_id, _sandbox_secret
    ){

    //  --- --- --- ---     페이팔 설정 관련 메소드들 입니다.

    // 디버그 인지 여부에 따라 사용할 환경 설정 객체를 반환하는 메소드를 만들어 줍니다.
    let environment = "";

    if( _isDebug == "YES" )
    {

        console.log( "페이팔은 sandbox 모드로 동작합니다." );
        environment = function()
        {
            return new paypal.core.SandboxEnvironment(
                _sandbox_client_id, _sandbox_secret
            );
        }

    }

    else
    {

        console.log( "페이팔은 live 모드로 동작합니다." );
        environment = function()
        {
            return new paypal.core.SandboxEnvironment(
                _client_id, _secret
            );
        }

    }

    // 클라이언트를 설정합니다.
    let client = new paypal.core.PayPalHttpClient( environment() );



    // 영수증 가지고 오는 동작을 하는 메소드 입니다.
    let captureOrder =  async function(orderId) {
        // request = new paypal.orders.OrdersCaptureRequest(orderId);
        request = new paypal.orders.OrdersGetRequest(orderId);

        // request.requestBody({});
        // Call API with your client and get a response for your call
        let response = await client.execute(request);
        // console.log(`Response: ${JSON.stringify(response)}`);
        // If call returns body in response, you can get the deserialized version from the result attribute of the response.
        // console.log(`Capture: ${JSON.stringify(response.result)}`);

        return response;
    }
    
    


    //  --- --- --- ---     메일 라우터 및 전역에서 사용되는 메소드들 입니다.

    let mainRouter = express.Router();




    //  --- --- --- ---     라우터들 입니다.

    // 연결되었는지 확인을 위한 에코 처리를 합니다.
    mainRouter.use( "/echo", function( req, res, next ){

        
        
        // 입력 받은 값을 그대로 반환합니다.
        res.end( req.body.echo );
        return;


    } );


    // 페이팔 영수증 검증.
    mainRouter.use( "/receipt", async function( req, res, next ){


        console.log( req.body );


        // 2a. Get the order ID from the request body
        const orderID = req.body.receipt;
        let capture =  await captureOrder(orderID); 
        

        console.log( capture );


        return res.end("일단 연동 되었음.");


    } )




    //  --- --- --- ---     반환 및 후처리 메소드들 입니다.

    // 결과를 반환합니다.
    return mainRouter;


}
















































// 문서의 끝 입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,