결제 연동을 할 때 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 창업닉군
,

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

 

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 창업닉군
,

이 페이지는 express에 대한 설명을 하지 않습니다. 각 REST API에 대한 설명을 표시합니다.

 

[주요 사이트]

페이팔 개발자 사이트 : developer.paypal.com .

 

[공식문서]

연동 페이지 : https://developer.paypal.com/docs/subscriptions/integrate .

 

[참고사이트]

cURL 설명 사이트 : https://www.lesstif.com/pages/viewpage.action?pageId=14745703 .
cURL 을 Nodejs 등으로 변환해 주는 사이트 : https://curl.trillworks.com/#node .

 

 

1. 개요.

. 모든 조작은 Access 토큰을 얻고, 이를 이용해 유저를 확인해, 데이터를 내어 줍니다.

. 실제 판매하는 상품인 Product 를 등록해야 합니다.

. Product를 어떤 식으로 구독할 것인지, 설정하는 Plan을 만들어야 합니다.

. 실제 구독 처리를 하는 Subscript를 만들어야 합니다.

. paypal은 라이브 서버와 센드박스 서버를 운영하고 있는데, 여기서는 실제 구매가 일어나지 않는 sendbox서버에서의 동작만을 테스트 합니다.

. 이 것을 실행하기 위해서는 프로젝트를 생성해, client_id와 이에 대한 secret을 획득해야 합니다.

. 페이팔은 입력값이 하나라도 틀리면, 500 번 오류등을 보낼 뿐 왜, 처리가 되었는지 하나의 값도 반환하지 않습니다. 즉 원인을 반환하지 않으므로, 잘 입력해야 합니다.

 

 

2. 에세스 토큰 얻기.

. access 토큰을 얻기 위한 cURL 예제.

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"

각 옵션 설명.

-H : 헤더.
-d : 포스트 데이터.
-u : 유저 아이디.

유저 아이디에 들어 갈값은 각각 생성한 프로젝트의 client_id와 secret을 넣어 줍니다.

uURL을 한줄로 만든 소스. (시크릿 값을 바꿔 놓아 동작하지 않습니다. 예시일 뿐입니다.)

curl -v https://api.sandbox.paypal.com/v1/oauth2/token -H "Accept: application/json" -H "Accept-Language: en_US" -u "AVPXMdI_2MFO__tJGV71Ve-YCQko8v1iIg4u7XEm24f1N3XAKQBjLzdGrzFEn4-dkpiwzxtdLTCjKKZM:EEv2R_AKdfni2FfPgO2YCt4RhScM7E8tkqbX7PDJB2HaoMno3bK4xvtny3" -d "grant_type=client_credentials"

 

 

3. 상품관련 REST API.

1. 상품 생성하기.

. 상품을 생성하기 위한 cURL 예제.

curl -v -X POST https://api.sandbox.paypal.com/v1/catalogs/products \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token" \
  -H "PayPal-Request-Id: merchant-generated-ID \ // Optional and if passed, helps identify idempotent requests
-d '{
  "name": "Video Streaming Service",
  "description": "Video streaming service",
  "type": "SERVICE",
  "category": "SOFTWARE",
  "image_url": "https://example.com/streaming.jpg",
  "home_url": "https://example.com/home"
}'

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/catalogs/products -H "Content-Type: application/json" -H "Authorization: Bearer A21AAGncecjv_2d8uNxHxtU3LUzi3I7uHUS1Trj7syi9Fzmwx8bkx0KuH1tEFXS7t_nX8AoXtBGxBi5-xwYdUwt63XSYgX9Ew" -d '{  "name": "Video Streaming Service", "description": "Video streaming service", "type": "SERVICE", "category": "SOFTWARE", "image_url": "https://example.com/streaming.jpg", "home_url": "https://example.com/home" }'

.  주의 할점.

결과 코드가 201번이 OK 입니다. 200번 성공으로 검사를 하다가 낭패를 볼 수 있습니다. (저는 한 시간 헤맷음).

 

2. 상품 정보 표시.

cURL에서 products 다음에는 상품의 아이디를 입력해 줍니다.

. 상품 정보를 가지고 오기 위한 cURL 예제.

curl -v -X GET https://api.sandbox.paypal.com/v1/catalogs/products/72255d4849af8ed6e0df1173 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X GET https://api.sandbox.paypal.com/v1/catalogs/products/PROD-2UH90666Y0969991W -H "Content-Type: application/json" -H "Authorization: Bearer A21AAFI0ZSRjDDHfhFYGGgcVgkU9BP1aJ242GlqfWIEcf-aWLrddTJbNJF6lSwNpzH4JDzaLEbQ136ah9SHZ0WwsLGlLBAPdQ"

 

 

3. 상품 업데이트.

. 상품 정보를 업데이트 하기 위한 cURL 예제.

curl -v -X PATCH https://api.sandbox.paypal.com/v1/catalogs/products/72255d4849af8ed6e0df1173 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token" \
-d '[
  {
    "op": "replace",
    "path": "/description",
    "value": "Premium video streaming service"
  }
]'

. cURL 소스를 한줄로 만든 문자열.

curl -v -X PATCH https://api.sandbox.paypal.com/v1/catalogs/products/PROD-9US56197H5602373L -H "Content-Type: application/json" -H "Authorization: Bearer A21AAHuy8FMsUdRiNLznO2FWYCrlykkjrcCDkXYyq9Q-YErZBF4Y4UPD37JLL2ZBMwc0DkibctYFxAMIBkh1KQOvhq5Ki52sA" -d '[{"op": "replace","path": "/description","value": "Premium video streaming service no"}]'

주의 할점.

결과 코드가 204번이 OK 입니다. 200번으로 성공 검사를 하다가 낭패를 볼 수 있습니다.

 

 

4. 상품 리스트.

. 상품 리스트를 가지고 오기 위한 cURL 예제.

curl -v -X GET https://api.sandbox.paypal.com/v1/catalogs/products?page_size=2&page=1&total_required=true \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X GET https://api.sandbox.paypal.com/v1/catalogs/products?page_size=2&page=1&total_required=true -H "Content-Type: application/json" -H "Authorization: Bearer A21AAEYDcoQtmrOta05Wj6Au2OmTZz90qqGIvHjUnA-iWAJ0y56XW-7gNgrghvxGcfu1PCqxAwPua6x4ajE47EGuznS0u2JTw"

 

 

4. 플랜 관련 REST API.

1. 플랜 생성.

. 플랜을 생성하기 위한 cURL 예제.

옵션인 플랜 아이디는 따로 주지 않아도 됩니다.

curl -v -k -X POST https://api.sandbox.paypal.com/v1/billing/plans \
  -H "Accept: application/json" \
  -H "Authorization: Bearer Access-Token" \
  -H "PayPal-Request-Id: PLAN-18062019-001" \  // merchant generated ID, optional and needed for idempotent samples
  -H "Prefer: return=representation" \
  -H "Content-Type: application/json" \
  -d '{
      "product_id": "PROD-6XB24663H4094933M",
      "name": "Basic Plan",
      "description": "Basic plan",
      "billing_cycles": [
        {
          "frequency": {
            "interval_unit": "MONTH",
            "interval_count": 1
          },
          "tenure_type": "TRIAL",
          "sequence": 1,
          "total_cycles": 1
        },
        {
          "frequency": {
            "interval_unit": "MONTH",
            "interval_count": 1
          },
          "tenure_type": "REGULAR",
          "sequence": 2,
          "total_cycles": 12,
          "pricing_scheme": {
            "fixed_price": {
              "value": "10",
              "currency_code": "USD"
            }
          }
        }
      ],
      "payment_preferences": {
        "auto_bill_outstanding": true,
        "setup_fee": {
          "value": "10",
          "currency_code": "USD"
        },
        "setup_fee_failure_action": "CONTINUE",
        "payment_failure_threshold": 3
      },
      "taxes": {
        "percentage": "10",
        "inclusive": false
      }
    }'

- 빌링 사이클 : 말 그대도 결제 사이클 입니다. ( 공식페이지 )
   + frequency : 한달에 한번, 혹은 일주일에 한 번, 혹은 1년에 한 번등을 설정하는 값 입니다.
   + tenure_type : TRIAL (테스트), REGULAR (정식), TRIAL은 트라이얼 결제를 통해 무료한달 등을 사용할 수 있게 하기 위함.
   + sequence : 결제 실행 순서 입니다. 위 예제에서는 트라이얼 결제가 먼저 일어 납니다.
   + total_cycles : 결제를 몇번 동안 계속 할 것인가 입니다. 위 예제에서는 1년동안 구독이 됩니다. (최대 99회)
   + pricing_scheme : 1회 결제시 가격 입니다. value 값. currency_code는 ( 코드 표 링크 )를 참조 합니다.

payment_preferences : 결제를 위한 설정입니다. (자동 구독을 위한 설정).
   + auto_bill_outstanding :  자동으로 다음 결제를 할 것인지 설정하는 값, 기본 (true)
   + set-fee : 첫 구독 시 결제 비용 입니다. (왜 따로 두었는지는 모르겠습니다.)
   + setup_fee_failure_action : 초기 결제가 실패한 경우, 동작 CANCEL (기본값) 은 결제 실패, CONTINUE는 재시도.
   + payment_failure_threshold : 실패시 재 시도 횟수.
   + taxes : 세금정보, percentage -> 세금비율, inclusive -> 금액에 세금이 들어 가 있는 지 여부 (default:true).

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/plans -H "Content-Type: application/json" -H "Authorization: Bearer A21AAG9M3f0j-aS8q4lgK4BPH-JRP0t-je8jL3e5yI8mybt7rgyBvh6F-6EwHBBgoJF5CQf3LEeC-lrCwJAuvy1O1pcm8A7GQ" -d '{"product_id": "PROD-2UH90666Y0969991W","name": "Video Streaming Service Plan","description": "Video Streaming Service basic plan","status":"ACTIVE","billing_cycles": [{"frequency":{"interval_unit":"MONTH","interval_count": 1},"tenure_type": "TRIAL","sequence":1,"total_cycles": 1,"pricing_scheme": {"fixed_price":{"value":"10","currency_code":"USD"}}},{"frequency":{"interval_unit":"MONTH","interval_count":1},"tenure_type": "REGULAR","sequence": 2,"total_cycles":12,"pricing_scheme":{"fixed_price":{"value": "100","currency_code":"USD"}}}],"payment_preferences": {"auto_bill_outstanding": true,"setup_fee":{"value": "10","currency_code": "USD"},"setup_fee_failure_action":"CONTINUE","payment_failure_threshold": 3},"taxes":{"percentage": "10","inclusive": false}}'

. 주의 할 점.

생성시 201 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

 

 

2. 유효한 플랜 리스트.

. 플랜리스트를 가지고 오기 위한 cURL 예제.

curl -v -X GET https://api.sandbox.paypal.com/v1/billing/plans?page_size=2&page=1&total_required=true \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X GET https://api.sandbox.paypal.com/v1/billing/plans?page_size=2&page=1&total_required=true -H "Content-Type: application/json" -H "Authorization: Bearer A21AAHI_Flrh2uvWHQbILGIksjorab6ePahqPnKrTPNQYsWuS-DL-X5sJoIZe5c4k85vstm3eAdLUcV1BlXHoynwx9HYIt0jg"

 

 

3. 플랜 정보 표시.

. 플랜 정보 표시를 위한 cURL 예제.

curl -v -X GET https://api.sandbox.paypal.com/v1/billing/plans/P-2UF78835G6983425GLSM44MA \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X GET https://api.sandbox.paypal.com/v1/billing/plans/P-6CT89946GV786361JLUVLPRQ -H "Content-Type: application/json" -H "Authorization: Bearer A21AAH5qauXi5CvpnecoUuKXMU9zrnJVzwPuxRO5kykkdqkkUZj_QbyuawB3ADMK_f16D3ExfbaBQfrmg51ZA3NwZzxEioYww"

 

 

4. 플랜 활성화.

. 플랜을 활성화 하기 위한 cURL 예제.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/plans/P-7GL4271244454362WXNWU5NQ/activate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/plans/P-2GL72983FH4989143LUVNSWQ/activate -H "Content-Type: application/json" -H "Authorization: Bearer A21AAG3Er__iBWSK-E8eDuhkpiTzqeuZ9Cf3hkCUFKc4vldCBmVOZ4o4DWvONMjV8eHLTy558lzy_346TzVniHKdbPR1HXr5A"

. 주의 할 점.

생성시 204 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

 

 

5. 비활성화 플랜.

. 플랜을 비활성화 하기 위한 cURL 예제.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/plans/P-7GL4271244454362WXNWU5NQ/deactivate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/plans/P-2GL72983FH4989143LUVNSWQ/deactivate -H "Content-Type: application/json" -H "Authorization: Bearer A21AAH5qauXi5CvpnecoUuKXMU9zrnJVzwPuxRO5kykkdqkkUZj_QbyuawB3ADMK_f16D3ExfbaBQfrmg51ZA3NwZzxEioYww"

. 주의 할 점.

생성시 204 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

 

 

6 플랜 업데이트.

* 플랜중 가격을 제외한 부분을 변경할 수 있으므며 아래와 같습니다.
   -  description, auto_bill_outstanding, texes.percentage, payment_preferences.payment_failure_threshold

. 플랜을 업데이트 하기 위한 cURL 예제.

curl -v -X PATCH https://api.sandbox.paypal.com/v1/billing/plans/P-7GL4271244454362WXNWU5NQ \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token" \
  -d '[
    {
      "op": "replace",
      "path": "/payment_preferences/payment_failure_threshold",
      "value": 7
    }
  ]'

. cURL 소스를 한줄로 만든 문자열.

curl -v -X PATCH https://api.sandbox.paypal.com/v1/billing/plans/P-6CT89946GV786361JLUVLPRQ -H "Content-Type: application/json" -H "Authorization: Bearer A21AAG0nNx3tfO_Lm4f3gQh6-hkfUYFLJgkMDJGAG3azztvPQFmkITxtdMiWuS8wypPf4Dclvv78Qpji9CqOrxHWjlapaGBkQ" -d '[{"op": "replace","path": "/payment_preferences/payment_failure_threshold","value": 7}]'

. 주의 할 점.

생성시 204 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

세금도 변경하실 분이 계실것 같은데, 기존에 10.0등 소수점 자리가 있으면, "" 로 묶어야 합니다. 아니면 오류 납니다.

 

 

7. 플랜 프라이싱.

* 플랜 중 빌링 사이클 (주로 가격 및 지불 방법)을 변경할 때 사용합니다.

. 플랜의 가격및 일정등을 조절 하기 위한 cURL 예제.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/plans/P-2UF78835G6983425GLSM44MA/update-pricing-schemes \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token" \
-d '{
  "pricing_schemes": [{
    "billing_cycle_sequence": 2,
    "pricing_scheme": {
      "fixed_price": {
        "value": "50",
        "currency_code": "USD"
        }
      }
    }
  ]
}'

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/plans/P-6CT89946GV786361JLUVLPRQ/update-pricing-schemes -H "Content-Type: application/json" -H "Authorization: Bearer A21AAHPEgYcmHBslHbSE8_8h93mFN892b8VdAmUN1QTkXSOZZKcTBTdJnNJDYBd5uR8OVB4EeNkO8kVtH4ETqF38R1LGE3GXA" -d '{"pricing_schemes": [{"billing_cycle_sequence": 2,"pricing_scheme": {"fixed_price": {"value": "50","currency_code": "USD"}}}]}'

. 주의 할 점.

생성시 204 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

원래가격의 20% 이상 변경한다면, 오류가 납니다.

가격 변경은 단 한 번만 할 수 있습니다.

 

 

 

5. 구독을 위한 REST API.

구독은 실제 사용자의 결제로 부터 시작되며, 이 것을 검증하고 활성화, 결제 내역 확인등의 작업을 처리하게 됩니다.

 

1. 구독 생성.

. 사용자 구독 신청을 하기 위한 웹페이지 소스

<body>
  <script
       src="https://www.paypal.com/sdk/js?client-id=SB_CLIENT_ID&vault=true">
  </script>

  <div id="paypal-button-container"></div>

  <script>
  
    paypal.Buttons({

      createSubscription: function(data, actions) {

        return actions.subscription.create({

          'plan_id': 'P-2UF78835G6983425GLSM44MA'

        });

      },


      onApprove: function(data, actions) {

        alert('You have successfully created subscription ' + data.subscriptionID);

      }


    }).render('#paypal-button-container');
    
  </script>
</body>

. 구독을 생성하기 위한 cURL 예제.

curl -v -k -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions \
   -H "Accept: application/json" \
   -H "Authorization: Bearer Access-Token" \
   -H "PayPal-Request-Id: SUBSCRIPTION-21092019-001" \
   -H "Prefer: return=representation" \
   -H "Content-Type: application/json" \
   -d '{
      "plan_id": "P-2UF78835G6983425GLSM44MA",
      "start_time": "2019-03-27T06:00:00Z",
      "subscriber": {
        "name": {
          "given_name": "John",
          "surname": "Doe"
        },
        "email_address": "customer@example.com"
      },
      "auto_renewal": true,
      "application_context": {
        "brand_name": "example",
        "locale": "en-US",
        "shipping_preference": "SET_PROVIDED_ADDRESS",
        "user_action": "SUBSCRIBE_NOW",
        "payment_method": {
          "payer_selected": "PAYPAL",
          "payee_preferred": "IMMEDIATE_PAYMENT_REQUIRED"
        },
        "return_url": "https://example.com/returnUrl",
        "cancel_url": "https://example.com/cancelUrl"
      }
    }'

plan_id : 구독 대상이되는 플랜의 아이디 입니다. (이 것만 입력하면됩니다.)
- start_time : 이 구독이 시작되는 시간. (입력하지않으면 현재시간; 페이팔 서버와 시차등을 계산해야 하므로, 입력하지 않을 것을 권장)
quantity : 구독을 몇개 했는지 여부 입니다. (대체로 1을 놓으면 된다라고 생각합니다.
shipping_amount : 배송비 입니다.
subscriber : 구독자의 정보 입니다.
auto_renewal : 자동으로 구매 처리를 할 것인가 여부.
application_context : 마켓 이라면, 어떤 마켓을 통해 구매 했는지 등을 남기면됩니다. (웹을 통한 경우, 웹이라 입력하면됨.).

. cURL 소스를 한줄로 만든 문자열.

curl -v -k -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions -H "Accept: application/json" -H "Authorization: Bearer A21AAF2sr1xlf9jswwJRqle3ncuX8GaEEPqcxtfW-a-HlkXCDt8ZTYlDrMvRlU0KbhFqFkjS8g5DdTAXa2lqZ-Gp3BvBqVlpA" -H "PayPal-Request-Id: I-5KL7FJ0N1RKW" -H "Prefer: return=representation" -H "Content-Type: application/json" -d '{"plan_id": "P-6CT89946GV786361JLUVLPRQ","start_time": "2019-03-27T06:00:00Z","subscriber": {"name": {"given_name": "John","surname": "Doe"},"email_address": "customer@example.com"},"auto_renewal": true,"application_context": {"brand_name": "example","locale": "en-US","shipping_preference": "SET_PROVIDED_ADDRESS","user_action":"SUBSCRIBE_NOW","payment_method": {"payer_selected": "PAYPAL","payee_preferred": "IMMEDIATE_PAYMENT_REQUIRED"},"return_url": "https://example.com/returnUrl","cancel_url": "https://example.com/cancelUrl"}}'

. 주의 할 점.

시간을 입력할 때는 javascript의 Date객체로 시간을 생성한뒤 toISOString()  라는 멤버 메소드를 이용해 값을 출력하면됩니다.

생성시 201 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

웹으로 구독을 신청하면, 구독이 이미 생성된 것 입니다. REST API로 하는 것은 소매점 오프라인을 위한 것으로 보입니다. 일단 저는 이부분만은 REST API로 해 보지 않았습니다. 웹에서 하면 이미 끝이니까요

 

2. 구독 자세히 보기.

. 구독의 상세 정보 확인을 위한 cURL 예제.

curl -v -X GET https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X GET https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BY6XKDWF90W7 -H "Content-Type: application/json" -H "Authorization: Bearer A21AAFnNqv1rB6Zj0u6ayyNQtqqb3ZgkJBoIqng_cdUym_4uHHXyou9v9H7_JlhcnuzPDG03zzzs6n6c8r6w1ETBf1lKRr9AQ"

 

3. 구독 정보 업데이트.

. 구독 정보 업데이트를 위한 cURL 예제.

curl -v -X PATCH https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token" \
-d '[
  {
    "op": "replace",
    "path": "/billing_info/outstanding_balance",
    "value": {
      "currency_code": "USD",
      "value": "50.00"
    }
  }
]'

- 업데이트 하기 위해 할 수 있는 것은 아래 3가지 입니다.
   + subscripber.shipping_address : 배송 주소.
   + shipping_amount : 배송비
   + billing_info.outstanding_balance : 미 결제 잔액.

. cURL 소스를 한줄로 만든 문자열.

curl -v -X PATCH https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G -H "Content-Type: application/json" -H "Authorization: Bearer A21AAG1TgiPs8x7--4lmuFT-gnoUkhvnJs-yMRE3_4eeBY2L0IzI8X12V2cMHL9okRMThBt3p5Gd_9e37pFfMw4B1Wn8cYIcg" -d '[{"op": "replace","path": "/billing_info/outstanding_balance","value": {"currency_code": "USD","value": "50.00"}}]'

. 주의 할 점.

생성시 204 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

 

4. 구독 정지.

. 구독을 정지하기 위한 cURL 예제.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/suspend \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions/I-LC86V1F6JKFW/suspend -H "Content-Type: application/json" -H "Authorization: Bearer A21AAH3b4Hfn5gOd3SKJK7aUpOWAy2hB_gPEhuq_SeURA4aqopM1m1NwV3-ECZwRLVmdT3ZrME2Qq6sicsO-Dfl3dGHrmGPhg"

. 주의 할 점.

생성시 204 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

 

5. 구독 취소.

. 구독 취소를 위한 위한 cURL 예제.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/cancel \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/cancel -H "Content-Type: application/json" -H "Authorization: Bearer Access-Token"

. 주의 할 점.

생성시 204 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

 

6. 구독 활성화

. 구독을 활성화 하기 위한 cURL 예제.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/activate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/activate -H "Content-Type: application/json" -H "Authorization: Bearer Access-Token"

 

7. 미 결제 약정 잔액에 대한 지불.

* 이 것은 잔액이 없거나 하는 등의 이유로 지불해야 할 돈을 지불하지 않은 경우, 지불을 시도하는 옵션으로 보입니다.

. 미 결제 약정 잔액을 위한 cURL 예제.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/capture \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"
 -d '{
   "note": "Charging as the balance reached the limit",
   "capture_type": "OUTSTANDING_BALANCE",
   "amount": {
     "value": "100",
     "currency_code": "USD"
   }
 }'

. cURL 소스를 한줄로 만든 문자열.

curl -v -X POST https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/capture -H "Content-Type: application/json" -H "Authorization: Bearer Access-Token" -d '{"note": "Charging as the balance reached the limit","capture_type": "OUTSTANDING_BALANCE","amount": {"value": "100","currency_code": "USD"}}'

 

. 주의 할 점.

생성시 204 status 코드를 반환합니다. 200번으로 검사하시면 안됩니다.

 

8. 구독 결제 나열.

. 구독 결제 나열을하기 위한 cURL 예제.

curl -v -X GET https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/transactions?start_time=2018-01-21T07:50:20.940Z&end_time=2018-08-21T07:50:20.940Z \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer Access-Token"

- 시간을 입력할 때는 javascript의 Date객체로 시간을 생성한뒤 toISOString()  라는 멤버 메소드를 이용해 값을 출력하면됩니다.

. cURL 소스를 한줄로 만든 문자열.

curl -v -X GET https://api.sandbox.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G/transactions?start_time=2018-01-21T07:50:20.940Z&end_time=2018-08-21T07:50:20.940Z -H "Content-Type: application/json" -H "Authorization: Bearer Access-Token"

 

9. 구독 업그레이드 / 다운 그레이드.

. 구독 업그레이드 / 다운 그레이드는 시간 관계상 하지 않았습니다. 저도 사용하지 않기도 해서요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

우분투에서 뭔가를 설치한다는 것은 매우 쉬운 일입니다. 너무 간단하기도 하고, 잘 설명된 사이트가 있으므로, 링크만 걸어 둡니다.

 

[ 참고 문서 ]

우분투 몽고DB 서버 설치 : https://zetawiki.com/wiki/우분투_몽고DB_서버_설치 .

 

 

 

 

 

 

 

 

 

'Ubuntu > Ubuntu 옛글' 카테고리의 다른 글

스팸메일로 처리 되지 않게 하기  (0) 2019.06.17
ubuntu sendmail 설치  (0) 2019.06.17
Postfix 설치 (ubuntu, SquirrelMail, apache, php)  (0) 2019.06.10
우분투 18.04 vsftp 설치  (0) 2019.06.04
Posted by 창업닉군
,