๋ถํธํ์ด ๊ณต์ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค (์๋ฒ์ฌ์ด๋ ์ฉ)
nodeํ๊ฒฝ์์ ์์ฑ๋ ์ดํ๋ฆฌ์ผ์ด์ , ํ๋ ์์ํฌ ๋ฑ์์ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
- PG ๊ฒฐ์ ์ฐฝ ์ฐ๋์ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํ๋ฉ๋๋ค. (Javascript, Android, iOS, React Native, Flutter ๋ฑ)
- ๊ฒฐ์ ๊ฒ์ฆ ๋ฐ ์ทจ์, ๋น๋งํค ๋ฐ๊ธ, ๋ณธ์ธ์ธ์ฆ ๋ฑ์ ์ํ์ ์๋ฒ์ฌ์ด๋์์ ์งํ๋ฉ๋๋ค. (Java, PHP, Python, Ruby, Node.js, Go, ASP.NET ๋ฑ)
-
(๋ถํธํ์ด ํต์ ์ ์ํ) ํ ํฐ ๋ฐ๊ธ ์์ฒญ
-
๊ฒฐ์ ๊ฒ์ฆ
-
๊ฒฐ์ ์ทจ์ (์ ์ก ์ทจ์ / ๋ถ๋ถ ์ทจ์)
-
๋น๋งํค ๋ฐ๊ธ
4-1. ๋ฐ๊ธ๋ ๋น๋งํค๋ก ๊ฒฐ์ ์น์ธ ์์ฒญ
4-2. ๋ฐ๊ธ๋ ๋น๋งํค๋ก ๊ฒฐ์ ์น์ธ ์์ฝ ์์ฒญ
4-2-1. ๋ฐ๊ธ๋ ๋น๋งํค๋ก ๊ฒฐ์ ์น์ธ ์์ฝ - ์ทจ์ ์์ฒญ
4-3. ๋น๋งํค ์ญ์
-
(๋ถํธํ์ด ๋จ๋ ) ์ฌ์ฉ์ ํ ํฐ ๋ฐ๊ธ
-
(๋ถํธํ์ด ๋จ๋ ) ๊ฒฐ์ ๋งํฌ ์์ฑ
-
์๋ฒ ์น์ธ ์์ฒญ
-
๋ณธ์ธ ์ธ์ฆ ๊ฒฐ๊ณผ ์กฐํ
npm install --save bootpay-backend-nodejs
async function getAccessToken() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
try {
let response = await Bootpay.getAccessToken()
console.log(response)
} catch(e) {
console.log(e)
}
};
ํจ์ ๋จ์์ ์ํ ์ฝ๋๋ ์ด๊ณณ์ ์ฐธ์กฐํ์ธ์.
๋ถํธํ์ด์ ์๋ฒ๊ฐ ํต์ ์ ํ๊ธฐ ์ํด์๋ ๋ถํธํ์ด ์๋ฒ๋ก๋ถํฐ ํ ํฐ์ ๋ฐ๊ธ๋ฐ์์ผ ํฉ๋๋ค.
๋ฐ๊ธ๋ ํ ํฐ์ 30๋ถ๊ฐ ์ ํจํ๋ฉฐ, ์ต์ด ๋ฐ๊ธ์ผ๋ก๋ถํฐ 30๋ถ์ด ์ง๋ ๊ฒฝ์ฐ ํ ํฐ ๋ฐ๊ธ ํจ์๋ฅผ ์ฌํธ์ถ ํด์ฃผ์
์ผ ํฉ๋๋ค.
async function getAccessToken() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
try {
let response = await Bootpay.getAccessToken()
console.log(response)
} catch(e) {
console.log(e)
}
}
๊ฒฐ์ ์ฐฝ ๋ฐ ์ ๊ธฐ๊ฒฐ์ ์์ ์น์ธ/์ทจ์๋ ๊ฒฐ์ ๊ฑด์ ๋ํ์ฌ ์ฌ๋ฐ๋ฅธ ๊ฒฐ์ ๊ฑด์ธ์ง ์๋ฒ๊ฐ ํต์ ์ผ๋ก ๊ฒฐ์ ๊ฒ์ฆ์ ํฉ๋๋ค.
async function verify() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
const token = await Bootpay.getAccessToken()
if (token.status === 200) {
let result
try {
result = await Bootpay.verify('612df0250d681b001de61de6')
} catch (e) {
return console.log(e)
}
console.log(result)
}
}
price๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์ ์ก์ทจ์ ๋ฉ๋๋ค.
- ํด๋ํฐ ๊ฒฐ์ ์ ๊ฒฝ์ฐ ์ด์๋ ๊ฒฝ์ฐ ์ดํต์ฌ ์ ์ฑ ์ ์ทจ์๋์ง ์์ต๋๋ค
- ์ ์ฐ๋ฐ์ผ์ค ๊ธ์ก๋ณด๋ค ์ทจ์๊ธ์ก์ด ํด ๊ฒฝ์ฐ PG์ฌ ์ ์ฑ ์ ์ทจ์๋์ง ์์ ์ ์์ต๋๋ค. ์ด๋ PG์ฌ์ ๋ฌธ์ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
- ๊ฐ์๊ณ์ข์ ๊ฒฝ์ฐ CMS ํน์ฝ์ด ๋์ด์์ง ์์ผ๋ฉด ์ทจ์๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฒฐ์ ํ ์คํธ์์๋ ๊ฐ์๊ณ์ข๋ก ํ ์คํธ ํ์ง ์๊ธธ ์ถ์ฒํฉ๋๋ค.
๋ถ๋ถ์ทจ๋ ์นด๋๋ก ๊ฒฐ์ ๋ ๊ฑด๋ง ๊ฐ๋ฅํ๋ฉฐ, ์ผ๋ถ PG์ฌ๋ง ์ง์ํฉ๋๋ค. ์์ฒญ์ price์ ๊ธ์ก์ ์ง์ ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
- (์ง์๊ฐ๋ฅ PG์ฌ: ์ด๋์์ค, kcp, ๋ค๋ , ํ์ด๋ ํฐ, ๋์ด์คํ์ด, ์นด์นด์คํ์ด, ํ์ด์ฝ)
๊ฐํน ๊ฐ๋ฐ์ฌ์์ ์ค์๋ก ์ฌ๋ฌ๋ฒ ๋ถ๋ถ์ทจ์๋ฅผ ๋ณด๋ด์ ์ฌ๋ฌ๋ฒ ์ทจ์๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฌธ์, ๋ถํธํ์ด์์๋ ๋ถ๋ถ์ทจ์ ์ค๋ณต ์์ฒญ์ ๋ง๊ธฐ ์ํด cancel_id ๋ผ๋ ํ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค. cancel_id๋ฅผ ์ง์ ํ์๋ฉด, ํด๋น ๊ฑด์ ๋ํด ์ค๋ณต ์์ฒญ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
async function cancel() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.cancel({
receiptId: '612df0250d681b001de61de6',
price: 1000,
name: '์ทจ์์๋ช
',
reason: '์ทจ์ํฉ๋๋ค'
})
} catch (e) {
console.log(e)
return
}
console.log(response)
}
}
REST API ๋ฐฉ์์ผ๋ก ๊ณ ๊ฐ์ผ๋ก๋ถํฐ ์นด๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ์ฌ, PG์ฌ์๊ฒ ๋น๋งํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์์ต๋๋ค. ๋ฐ๊ธ๋ฐ์ ๋น๋งํค๋ฅผ ์ ์ฅํ๊ณ ์๋ค๊ฐ, ์ํ๋ ์์ , ์ํ๋ ๊ธ์ก์ ๊ฒฐ์ ์น์ธ ์์ฒญํ์ฌ ์ข ๋ ์์ ๋ก์ด ๊ฒฐ์ ์๋๋ฆฌ์ค์ ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋น์ธ์ฆ ์ ๊ธฐ๊ฒฐ์ (REST API) ๋ฐฉ์์ ์ง์ํ๋ PG์ฌ๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
async function getBillingKey() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.requestSubscribeBillingKey({
orderId: (new Date()).getTime(),
pg: 'nicepay',
itemName: '์ ๊ธฐ๊ฒฐ์ 30์ผ๊ถ',
cardNo: '[ ์นด๋ ๋ฒํธ ]',
cardPw: '[ ์นด๋ ๋น๋ฐ๋ฒํธ ์ 2์๋ฆฌ ]',
expireYear: '[ ์นด๋ ๋ง๋ฃ ์ฐ๋ ]',
expireMonth: '[ ์นด๋ ๋ง๋ฃ ์ ]',
identifyNumber: '[ ์นด๋ ์์ ์ฃผ ์๋
์์ผ ํน์ ๋ฒ์ธ ๋ฒํธ ]',
extra: {
subscribeTestPayment: 1 // 100์ ๊ฒฐ์ ํ ๊ฒฐ์ ๊ฐ ๋๋ฉด billing key๋ฅผ ๋ฐํ, ๊ฒฐ์ ๊ฐ ์คํจํ๋ฉด ์๋ฌ
}
})
} catch (e) {
console.log(e)
return
}
console.log(response)
}
}
๋ฐ๊ธ๋ ๋น๋งํค๋ก ์ํ๋ ์์ ์ ์ํ๋ ๊ธ์ก์ผ๋ก ๊ฒฐ์ ์น์ธ ์์ฒญ์ ํ ์ ์์ต๋๋ค. ์์ก์ด ๋ถ์กฑํ๊ฑฐ๋ ๋๋ ์นด๋ ๋ฑ์ ํน๋ณํ ๊ฑด์ด ์๋๋ฉด PG์ฌ์์ ๊ฒฐ์ ๋ฅผ ๋ฐ๋ก ์น์ธํฉ๋๋ค.
async function subscribeBilling() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.requestSubscribeBillingPayment({
billingKey: '612deb53019943001fb52312',
itemName: 'ํ
์คํธ',
price: 1000,
orderId: (new Date()).getTime(),
feedbackUrl: 'https://dev-api.bootpay.co.kr/callback',
feedbackContentType: 'json'
})
} catch (e) {
return console.log(e)
}
console.log(response)
}
}
์ํ๋ ์์ ์ 4-1๋ก ๊ฒฐ์ ์น์ธ ์์ฒญ์ ๋ณด๋ด๋ ๋์ง๋ง, ๋น๋งํค ๋ฐ๊ธ ์ดํ์ ๋ฐ๋ก ๊ฒฐ์ ์์ฝ ํ ์ ์์ต๋๋ค. (๋น๋งํค๋น ์ต๋ 5๊ฑด)
async function subscribeBillingReserve() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.reserveSubscribeBilling({
billingKey: '612deb53019943001fb52312',
itemName: 'ํ
์คํธ',
price: 1000,
orderId: (new Date()).getTime(),
userInfo: {
username: 'ํ
์คํธ',
phone: '01000000000'
},
feedbackUrl: 'https://dev-api.bootpay.co.kr/callback',
feedbackContentType: 'json',
schedulerType: 'oneshot',
executeAt: ((new Date()).getTime() / 1000) + 5
})
} catch (e) {
return console.log(e)
}
console.log(response)
}
}
๋น๋งํค๋ก ์์ฝ๋ ๊ฒฐ์ ๊ฑด์ ์ทจ์ํฉ๋๋ค.
async function subscribeBillingReserveCancel() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.destroyReserveSubscribeBilling('612debc70d681b0039e6133d')
console.log(response)
} catch (e) {
return console.log(e)
}
console.log(response)
}
}
๋ฐ๊ธ๋ ๋น๋งํค๋ก ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋๋ก, ์ญ์ ์์ฒญํฉ๋๋ค.
async function deleteBillingKey() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.destroySubscribeBillingKey('612debc70d681b0039e6133d')
console.log(response)
} catch (e) {
return console.log(e)
}
console.log(response)
}
}
5. (๋ถํธํ์ด ๋จ๋ - ๊ฐํธ๊ฒฐ์ ์ฐฝ, ์์ฒด์ธ์ฆ ๊ธฐ๋ฐ์ ์ฌ์ฉ์๋ฅผ ์ํ) ์ฌ์ฉ์ ํ ํฐ ๋ฐ๊ธ
(๋ถํธํ์ด ๋จ๋ ) ๋ถํธํ์ด์์ ์ ๊ณตํ๋ ๊ฐํธ๊ฒฐ์ ์ฐฝ, ์์ฒด์ธ์ฆ ๊ธฐ๋ฐ์ ๊ฒฐ์ ์ฌ์ฉ์ ์ํด์๋ ๊ฐ๋ฐ์ฌ์์ ํ์ ๊ณ ์ ๋ฒํธ๋ฅผ ๊ด๋ฆฌํด์ผํ๋ฉฐ, ํด๋น ํ์์ ๋ํ ์ฌ์ฉ์ ํ ํฐ์ ๋ฐ๊ธํฉ๋๋ค. ์ด ํ ํฐ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์์ ๊ฒฐ์ ์์ฒญ ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
async function getUserToken() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.requestUserToken({
userId: '1234',
email: '[email protected]',
name: 'ํ๊ธธ๋'
})
console.log(response)
} catch (e) {
return console.log(e)
}
console.log(response)
}
}
(๋ถํธํ์ด ๋จ๋ ) ์์ฒญ ํ์๋ฉด ๊ฒฐ์ ๋งํฌ๊ฐ ๋ฆฌํด๋๋ฉฐ, ํด๋น url์ ๊ณ ๊ฐ์๊ฒ ์๋ด, ๊ฒฐ์ ์ ๋ํ์ฌ ๊ฒฐ์ ๋ฅผ ์งํํ ์ ์์ต๋๋ค.
async function requestPayment() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.requestPayment({
pg: 'kcp',
method: 'card',
orderId: (new Date).getTime(),
price: 1000,
itemName: 'ํ
์คํธ ๋ถํธํ์ด ์ํ',
returnUrl: 'https://dev-api.bootpay.co.kr/callback',
extra: {
expire: 30
}
})
} catch (e) {
return console.log(e)
}
console.log(response)
}
}
๊ฒฐ์ ์น์ธ ๋ฐฉ์์ ํด๋ผ์ด์ธํธ ์น์ธ ๋ฐฉ์๊ณผ, ์๋ฒ ์น์ธ ๋ฐฉ์์ผ๋ก ์ด 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ ์น์ธ ๋ฐฉ์์ javascript๋ native ๋ฑ์์ confirm ํจ์์์ ์งํํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค๋ง, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ฒ ์น์ธ ๋ฐฉ์์ด ํ์ํ ์ ์์ต๋๋ค.
ํ์ํ ์ด์
- 100% ์์ ์ ์ธ ๊ฒฐ์ ํ ๊ณ ๊ฐ ์๋ด๋ฅผ ์ํด - ํด๋ผ์ด์ธํธ์์ PG๊ฒฐ์ ์งํ ํ ์น์ธ ์๋ฃ๋ ๋ onDone์ด ์ํ๋์ง ์์ (์ธํฐ๋ท ํ๊ฒฝ ๋ฑ), ๊ฒฐ์ ์ดํ ๊ณ ๊ฐ์๊ฒ ์๋ดํ์ง ๋ชปํ ์ ์์ต๋๋ค
- ๋จ์ผ ํธ๋์ญ์ ์ ๊ฐ๋ ์ด ํ์ํ ๊ฒฝ์ฐ - ์ฌ๊ณ ํ์ ์ด ์ค์ํ ์ปค๋จธ์ค๋ฅผ ์ด์ํ ๊ฒฝ์ฐ ํธ๋์ญ์ ๊ฐ๋ ์ด ํ์ํ ์ ์๊ฒ ์ผ๋ฉฐ, ์ด๋ฅผ ์ํด์๋ ์๋ฒ ์น์ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
async function submit() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.verify('612df0250d681b001de61de6')
} catch (e) {
return console.log(e)
}
console.log(response)
}
}
๋ค๋ ๋ณธ์ธ์ธ์ฆ ํ ๊ฒฐ๊ณผ๊ฐ์ ์กฐํํฉ๋๋ค. ๋ค๋ ๋ณธ์ธ์ธ์ฆ์์ ํต์ ์ฌ, ์ธ๊ตญ์ธ์ฌ๋ถ, ์ ํ๋ฒํธ ์ด 3๊ฐ์ง ์ ๋ณด๋ ๋ค๋ ์ ์ถ๊ฐ๋ก ์์ฒญํ์ ์ผ ๋ฐ์ผ์ค ์ ์์ต๋๋ค.
async function certificate() {
const Bootpay = require('bootpay-backend-nodejs').Bootpay
Bootpay.setConfig(
'5b8f6a4d396fa665fdc2b5ea',
'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw='
)
let token = await Bootpay.getAccessToken()
if (token.status === 200) {
let response
try {
response = await Bootpay.certificate('612df0250d681b001de61de6')
} catch (e) {
return console.log(e)
}
console.log(response)
}
}
์ ์ฉํ ์ํ ํ๋ก์ ํธ์ ์ฐธ์กฐํด์ฃผ์ธ์
๋ถํธํ์ด ๊ฐ๋ฐ๋งค๋ด์ผ์ ์ฐธ์กฐํด์ฃผ์ธ์
๋ถํธํ์ด ํํ์ด์ง ์ฐ์ธก ํ๋จ ์ฑํ ์ ํตํด ๊ธฐ์ ๋ฌธ์ ์ฃผ์ธ์!