결제 연동을 할 때 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;
}
// 문서의 끝 입니다.
'Node.js' 카테고리의 다른 글
node.js 이미지 모듈 소개 (0) | 2019.10.25 |
---|---|
node.js 오류 해결법들 간단히. (0) | 2019.10.09 |
NodeJS 페이팔 결제 연동 (Checkout, SDK) (0) | 2019.07.29 |
nodejs를 이용한 paypal 결제 연동하기 (구독) (1) | 2019.07.14 |
node.js socket.io 를 이용한 소켓 구현 (0) | 2019.06.03 |