real 2transaction - nicepayments/nicepay-manual GitHub Wiki

์šด์˜ ์ธ์ฆ & ์Šน์ธ ์„œ๋น„์Šค ์—ฐ๋™ํ•˜๊ธฐ

2 Transaction ์—ฐ๋™ํ•˜๊ธฐ

๊ฐ€๋งน์  ์ž…์žฅ์—์„œ๋Š” ๊ณ ๊ฐ์˜ ๊ฒฐ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๋‹จ๊ณ„์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ, ๊ณ ๊ฐ์˜ ๊ฒฐ์ œ ์ˆ˜๋‹จ์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๋Š” '์ธ์ฆ' ๋‹จ๊ณ„, ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ, ์‹ค์ œ ๊ธˆ์•ก์„ ์ด์ฒดํ•˜๋Š” '์Šน์ธ' ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๋‹จ๊ณ„๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฑฐ์น˜๋ฉด ๊ณ ๊ฐ์˜ ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉฐ, ๊ฐ€๋งน์ ์€ ํŒ๋งค๋œ ์ƒํ’ˆ์— ๋Œ€ํ•œ ๊ธˆ์•ก์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ 2 Transaction ๊ฒฐ์ œ ๋ฐฉ์‹์ด๋ผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

API ํ‚ค ์ค€๋น„

๊ฐ€๋งน์  ํ…Œ์ŠคํŠธ ์ƒ์ ์˜ Server ์Šน์ธ & basic ์ธ์ฆ์œผ๋กœ ๋ฐœ๊ธ‰ ๋ฐ›์€ clientId ๋ฐ secretKey๋กœ ์•„๋ž˜ ์—ฐ๋™์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ(๊ฒฐ์ œ์ฐฝ) ์š”์ฒญ

๊ฒฐ์ œ์ฐฝ JS SDK ์‚ฝ์ž…

<script src="https://pay.nicepay.co.kr/v1/js/"></script> // (1)
  • (1): https://pay.nicepay.co.kr/v1/js/
    • ๊ฐ€๋งน์ ์ด ๊ฒฐ์ œ์ฐฝ์„ ์ผ๊ด€๋˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜ํ•œ JS SDK

๊ฒฐ์ œ์ฐฝ JS ํ˜ธ์ถœ ์ฝ”๋“œ

<script src="https://pay.nicepay.co.kr/v1/js/"></script>
<script>
    function serverAuth() {
        AUTHNICE.requestPay({                               // (1) ๋‚˜์ด์ŠคํŽ˜์ด๋จผ์ธ  ๊ฒฐ์ œ์ฐฝ ํ˜ธ์ถœ ํ•จ์ˆ˜
            clientId: 'R2_xxx',                             // (2) ๊ฐ€๋งน์  ์šด์˜ ํ™˜๊ฒฝ 2Transaction(Server ์Šน์ธ & basic ์ธ์ฆ)
            method: 'card',                                 // (3) ๊ณ ๊ฐ ๊ฒฐ์ œ ์ˆ˜๋‹จ
            orderId: 'your-unique-orderid',                 // (4) ๊ฐ€๋งน์  ๊ณ ์œ  ์ฃผ๋ฌธ์ •๋ณด
            amount: 1004,                                   // (5) ๊ฐ€๋งน์  ์ƒํ’ˆ ๊ธˆ์•ก
            goodsName: '๋‚˜์ด์ŠคํŽ˜์ด-์ƒํ’ˆ',                   // (6) ๊ฐ€๋งน์  ์ƒํ’ˆ ๋ช…
            returnUrl: 'http://localhost:4567/serverAuth'   // (7) ๊ฐ€๋งน์  ์ธ์ฆ ๊ฒฐ๊ณผ ์‘๋‹ต๋ฐ›์„ URL
        });
    }
</script>
  • (1): AUTHNICE.requestPay
    • ๋‚˜์ด์ŠคํŽ˜์ด๋จผ์ธ  ๊ฒฐ์ œ์ฐฝ ํ˜ธ์ถœ ํ•จ์ˆ˜
  • (2): clientId: 'R2_xxx'
    • ๊ฐ€๋งน์  ํ…Œ์ŠคํŠธ ์ƒ์ ์˜ key ์ •๋ณด์—์„œ ๋ฐœ๊ธ‰ ๋ฐ›์€ clientId
  • (3): method: 'card'
  • (4): orderId: 'your-unique-orderid'
    • ๊ฐ€๋งน์  ๊ณ ์œ  ์ฃผ๋ฌธ์ •๋ณด
    • ๋‚˜์ด์ŠคํŽ˜์ด๋จผ์ธ ์—์„œ ๊ฐ€๋งน์ ์ด ์š”์ฒญํ•œ ๊ฒฐ์ œ ์š”์ฒญ์ด ์ค‘๋ณต์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ๊ฒ€์ฆ
  • (5): amount: 1004
    • ๊ฒฐ์ œ ๊ธˆ์•ก
    • ๊ฐ€๋งน์ ์—์„œ ํŒ๋งคํ•˜๋Š” ์ƒํ’ˆ ๊ธˆ์•ก
  • (6): returnUrl: 'http://localhost:4567/serverAuth'

์ธ์ฆ ์š”์ฒญ์— ๋Œ€ํ•œ F&Q

Q1. [P006]. clientId๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.(GID ํš๋“ ์‹คํŒจ)
A. ์šด์˜ ์„œ๋น„์Šค์— ์ƒŒ๋“œ๋ฐ•์Šค ClientId๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์šด์˜ clientId๋Š” R1_ or R2_ ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ ์‘๋‹ต

์ธ์ฆ ์š”์ฒญ์ด ์ •์ƒ์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ์ธ์ฆ ์š”์ฒญ์‹œ returnUrl ํ•„๋“œ์— ๊ธฐ์ž…ํ•œ URL๋กœ ์ธ์ฆ์— ๋Œ€ํ•œ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MIME ์œ ํ˜•: application/x-www-form-urlencoded
authResultCode: 0000                                                    // (1)
authResultMsg: ์ธ์ฆ ์„ฑ๊ณต
tid: {{์ธ์ฆ ์„ฑ๊ณต์— ๋Œ€ํ•œ TID 30์ž}}                                      // (2)
clientId: {{R2_xxx server ์Šน์ธ & basic ์ธ์ฆ}}
orderId: {{๊ฐ€๋งน์  ๊ณ ์œ  ์ฃผ๋ฌธ๋ฒˆํ˜ธ}}
amount: 1004
authToken: {{NICEUNTxxx 40์ž}}
signature: {{hex(sha256(authToken + clientId + amount + secretKey}}     // (3)
  • (1): authResultCode: 0000
    • ์ธ์ฆ ๊ฒฐ๊ณผ ์ฝ”๋“œ
    • ์„ฑ๊ณต ์‹œ "0000"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • (2): tid: {{์ธ์ฆ ์„ฑ๊ณต์— ๋Œ€ํ•œ TID 30์ž}}
    • ์ธ์ฆ ์„ฑ๊ณต ์‹œ ์Šน์ธ ์š”์ฒญ์„ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ID
    • ๊ฑฐ๋ž˜ ์š”์ฒญ ๋ฐ ์ทจ์†Œ, ๊ฑฐ๋ž˜์กฐํšŒ ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ID ์ž…๋‹ˆ๋‹ค.
  • (3): signature: {{hex(sha256(authToken + clientId + amount + secretKey}}
    • ์‘๋‹ต์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ช… ๊ฐ’
    • ์ธ์ฆ ์‘๋‹ต์— ๋Œ€ํ•ด ๊ฐ€๋งน์ ์€ ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๊ฐ€๋Šฅ

์ธ์ฆ ์‘๋‹ต ์‹œ์ ์—์„œ ๊ฒฐ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐœ๊ธ‰๋œ TID๋กœ ์Šน์ธ ์š”์ฒญ ์‹œ, ์Šน์ธ์‘๋‹ต ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์šด์˜ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐœ๊ธ‰๋œ TID๋กœ ์Šน์ธ ์š”์ฒญ ์‹œ, ์นด๋“œ์‚ฌ์— ์ธ์ฆ๋œ ๊ฒฐ์ œ๋ฅผ ๊ณ ๊ฐ์—๊ฒŒ ๊ฒฐ์ œ๊ธˆ์•ก์„ ์ฒญ๊ตฌํ•˜๋„๋ก ์š”์ฒญํ•˜์—ฌ ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.


์Šน์ธ ์š”์ฒญ

์Šน์ธ ์š”์ฒญ curl

curl -request POST 
--url 'https://api.nicepay.co.kr/v1/payments/{tid}' \                  # (1)
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Basic {base64(clientId:secretKey)}' \         # (2)
--data '{
  "amount": 1004                                                       # (3)
}'
  • (1): --url 'https://api.nicepay.co.kr/v1/payments/{tid}'
    • ์Šน์ธ์š”์ฒญ API ํ˜ธ์ถœ
    • ์ธ์ฆ ์‘๋‹ต ๊ฒฐ๊ณผ๋กœ ๋ฐ›์€ TID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ œ ์š”์ฒญ
  • (2): --header 'Authorization: Basic {base64(clientId:secretKey)}'
    • ์Šน์ธ ์š”์ฒญ ์‹œ ํŠน์ • ๊ฐ€๋งน์ ์˜ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ
    • Server ์Šน์ธ & basic ์ธ์ฆ์œผ๋กœ ๋ฐœ๊ธ‰ ๋ฐ›์€ ํ‚ค ์ •๋ณด๋กœ base64 ์ธ์ฝ”๋”ฉ
  • (3): "amount": 1004
    • ๊ฒฐ์ œ ๊ธˆ์•ก
    • ์Šน์ธ ์š”์ฒญ์„ ์œ„ํ•œ ํ•„์ˆ˜ ๊ฐ’

Token ๋งŒ๋“ค๊ธฐ

Terminal์—์„œ base64 ์ธ์ฝ”๋”ฉํ•˜๊ธฐ

echo -n 'clientId:secretKey' | base64

Windows PowerShell์„ ์ด์šฉํ•œ ์ธ์ฝ”๋”ฉ

powershell "[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('clientId:secretKey'))"

์Šน์ธ ์‘๋‹ต

์Šน์ธ ์‘๋‹ต์— ๋Œ€ํ•œ ์„ค๋ช…

์Šน์ธ ์‘๋‹ต์€ ๊ฒฐ์ œ ๊ณผ์ • ์ค‘์—์„œ ๊ณ ๊ฐ์˜ ์นด๋“œ์‚ฌ์— ์˜ํ•ด ํŠน์ • ๊ธˆ์•ก์˜ ๊ฒฐ์ œ๊ฐ€ ํ—ˆ๊ฐ€๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

๊ฐ€๋งน์ ์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‘๋‹ต ๋ฐ›์•„๋ณผ ์ˆ˜๋„ ์žˆ๊ณ , ๋™์‹œ์— ๊ฒฐ์ œ์ˆ˜๋‹จ์— ๋Œ€ํ•œ ์›นํ›… URL์„ ๋“ฑ๋กํ•˜์˜€์„ ๊ฒฝ์šฐ, ์›นํ›…์„ ํ†ตํ•ด ๊ฒฐ์ œํ†ต๋ณด๋ฅผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›นํ›…์„ ํ†ตํ•ด ๊ฒฐ์ œํ†ต๋ณด๋ฅผ ๋ฐ›๋Š” ๊ฒฝ์šฐ, ๋ณ„๋„์˜ ์‘๋‹ต์ด ํ•ด๋‹น URL๋กœ ์ „์†ก๋˜์–ด, ๊ฐ€๋งน์ ์€ ๊ฒฐ์ œ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šด์˜ํ™˜๊ฒฝ ์Šน์ธ ์‘๋‹ต ๋ฐ์ดํ„ฐ

{
  "resultCode": "0000",
  "resultMsg": "์ •์ƒ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
  "tid": "{{tid}}",
  "cancelledTid": null,
  "orderId": "{{unique_orderId}",
  "ediDate": "2023-08-14T17:07:28.021+0900",
  "signature": "{{hex(sha256(tid + amount + ediDate+ SecretKey))}}",
  "status": "paid",
  "paidAt": "2023-08-14T17:07:27.000+0900",
  "failedAt": "0",
  "cancelledAt": "0",
  "payMethod": "card",
  "amount": 1004,
  "balanceAmt": 1004,
  "goodsName": "์ƒํ’ˆ๋ช…",
  "mallReserved": null,
  "useEscrow": false,
  "currency": "KRW",
  "channel": "pc",
  "approveNo": "000000",
  "buyerName": null,
  "buyerTel": null,
  "buyerEmail": null,
  "receiptUrl": "https://npg.nicepay.co.kr/issue/IssueLoader.do?type=0&innerWin=Y&TID={{tid}}",
  "mallUserId": null,
  "issuedCashReceipt": false,
  "coupon": null,
  "card": {
    "cardCode": "{{์นด๋“œ์‚ฌ์ฝ”๋“œ}}",
    "cardName": "{{์นด๋“œ์‚ฌ}}",
    "cardNum": "{{์‹ ์šฉ์นด๋“œ ๋ฒˆํ˜ธ}}", // PCI-DSS ์•ž 6์ž๋ฆฌ, ๋’ค 4์ž๋ฆฌ ์™ธ ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ
    "cardQuota": 0,
    "isInterestFree": false,
    "cardType": "credit",
    "canPartCancel": true,
    "acquCardCode": "{{๋งค์ž…์‚ฌ ์ฝ”๋“œ}}",
    "acquCardName": "{{๋งค์ž…์‚ฌ ๋ช…}}"
  },
  "vbank": null,
  "bank": null,
  "cellphone": null,
  "cancels": null,
  "cashReceipts": null,
  "messageSource": "nicepay"
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ