๐Ÿ’ณ ํ† ์ŠคํŽ˜์ด๋จผ์ธ  ์—ฐ๋™ํ•˜๊ธฐ (3) _๊ฒฐ์ œ ์„ฑ๊ณต/์‹คํŒจ

ํ˜„์ฃผยท2023๋…„ 6์›” 1์ผ
0

๐Ÿ“Œ ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์€ ์ „ ๊ฒŒ์‹œ๋ฌผ๊ณผ ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
๐Ÿ“Œ <๊ฒฐ์ œ ํ๋ฆ„ ์—ญํ• ๋ณ„ ์ •๋ฆฌ>์—์„œ 4~6๋ฒˆ์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๊ฒฐ์ œ์ฐฝ์„ ์ด์šฉํ•˜์—ฌ ์ •์ƒ์ ์œผ๋กœ ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด,

์•„๋ž˜์™€ ๊ฐ™์ด ์ง€์ •ํ•ด๋‘” ์„ฑ๊ณต ์‹œ ์ฝœ๋ฐฑ URL๋กœ orderId, paymentKey, amount 3๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด ๋„˜์–ด์˜ค๊ฒŒ ๋œ๋‹ค.

  • paymentKey
    โžœ ํ† ์ŠคํŽ˜์ด๋จผ์ธ ์—์„œ ์ •ํ•œ ๊ฒฐ์ œ ๊ตฌ๋ถ„์šฉ ํ‚ค
    โžœ ๊ฒฐ์ œ ์ทจ์†Œ / ๊ฒฐ์ œ ์กฐํšŒ์— ์‚ฌ์šฉ๋จ
    โ €
  • orderId
    โžœ ์„œ๋น„์Šค์—์„œ ์ •ํ•œ ์ฃผ๋ฌธ ๊ณ ์œ ๋ฒˆํ˜ธ
    โžœ ๊ฐ ์ฃผ๋ฌธ ๋ณ„ uniqueํ•œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ €์žฅ๋œ ๊ฒฐ์ œ ํ˜ธ์ถœ ๋‚ด์—ญ์„ ์กฐํšŒํ•˜์—ฌ (ํ˜„์žฌ amount ๊ฐ’ <-> ๊ฒฐ์ œ ์š”์ฒญ ๋•Œ ์ €์žฅ๋œ amount ๊ฐ’)์„ ๋น„๊ตํ•˜๋ฉด ๋™์ผํ•œ ๊ฐ€๊ฒฉ์œผ๋กœ ์ •์ƒ์ ์ธ ์ฃผ๋ฌธ์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์Œ
    โ €
  • amount
    โžœ ๊ฐ€๊ฒฉ ์ •๋ณด

๊ทธ๋Ÿผ ์ด์ œ ํ”„๋ก ํŠธ์—์„œ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ์—ˆ๊ณ 

ํ”„๋ก ํŠธ๊ฐ€ ๊ทธ ์‘๋‹ต๋ฐ์ดํ„ฐ๋กœ ๊ฒฐ์ œ ์š”์ฒญ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—

ํ† ์ŠคํŽ˜์ด๋จผ์ธ ๊ฐ€ ๊ฒฐ์ œ ๊ฒฐ๊ณผ๋กœ ์„ฑ๊ณต ์‹œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋  ์ฃผ์†Œ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ธ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.

๐ŸŒผ ์„ฑ๊ณต ์‹œ ์ฝœ๋ฐฑ ์‘๋‹ต ์ฒ˜๋ฆฌ + ๊ฒ€์ฆ ๋กœ์ง

โœ”๏ธ ์„ฑ๊ณต Controller

  • tossPaymentSuccess

โžœ ์„ฑ๊ณต ์‹œ ์ฝœ๋ฐฑ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ
โ €
โžœ ํ† ์ŠคํŽ˜์ด๋จผ์ธ ๊ฐ€ ๋ณด๋‚ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  Service ๋กœ์ง์—์„œ ๊ฒ€์ฆ์„ ์™„๋ฃŒํ•œ ํ›„ ๋ฐ˜ํ™˜


โœ”๏ธ ์„ฑ๊ณต Service

  • tossPaymentSuccess()

โžœ Controller์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’๋“ค์„ ์ด์šฉํ•˜์—ฌ ๊ฒ€์ฆ ๋กœ์ง๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
โ €
โžœ ์ •์ƒ ๊ฒฐ์ œ ํ›„ ํ•ด๋‹น ๋ฉค๋ฒ„์˜ ๊ฒฐ์ œ ์„ฑ๊ณต ์—ฌ๋ถ€, ํฌ์ธํŠธ ๋“ฑ์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด๊ธฐ๋„ ํ•จ
โ €
โžœ ์ •์ƒ ๊ฒฐ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ์ถ”ํ›„ ๊ฒฐ์ œ ์ทจ์†Œ / ๊ฒฐ์ œ ์กฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก paymentKey๋„ ๋„ฃ์–ด์คŒ
โ €

  • verifyPayment()

โžœ ๊ฒฐ์ œ ์š”์ฒญ๋œ ๊ธˆ์•ก๊ณผ ์‹ค์ œ ๊ฒฐ์ œ๋œ ๊ธˆ์•ก์ด ๊ฐ™์€์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„
โ €

  • requestPaymentAccept()

โžœ ํ† ์ŠคํŽ˜์ด๋จผ์ธ ์— ์ตœ์ข… ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ๋‹ด์•„ POST๋กœ ๋ณด๋‚ด๋Š” ๋ถ€๋ถ„

โžœ net.minidev.json.JSONObject๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค/๊ฐ’ ์Œ์„ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ์˜ค๋ธŒ์ ํŠธ๋กœ ์ˆซ์ž ๊ทธ๋Œ€๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ

โžœ postForObject() ์•ˆ์— ํ•„์š”ํ•œ ์ •๋ณด์ธ < ์š”์ฒญ URL + ์š”์ฒญ ๊ฐ์ฒด + ์‘๋‹ต Dto >๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋จ

โœ” ์š”์ฒญ URL
โžœ "https://api.tosspayments.com/v1/payments/" + paymentKey

  • restTemplate.postForObject()
    โžœ POST ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๊ฐ์ฒด๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์Œ
  • restTemplate.postForEntity()
    โžœ POST ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋กœ ResponseEntity๋กœ ๋ฐ˜ํ™˜๋ฐ›์Œ
  • getHeaders()

โžœ ํ—ค๋”์—๋Š” ํ† ์Šค์—์„œ ์ œ๊ณตํ•ด์ค€ ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ Basic Authorization ๋ฐฉ์‹์œผ๋กœ base64๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๊ผญ ๋ณด๋‚ด์•ผํ•จ
( โ— ๊ผญ! {์‹œํฌ๋ฆฟํ‚ค + ":"} ์กฐํ•ฉ์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ )


โœ”๏ธ ์„ฑ๊ณต Dto

  • ๊ฒฐ์ œ ์„ฑ๊ณต ์‹œ ์‘๋‹ต ๋ฐ์ดํ„ฐ์ธ PaymentSuccessDto

    @Data
    public class PaymentSuccessDto {
       String mid; // ๊ฐ€๋งน์  Id -> tosspayments
       String version; // Payment ๊ฐ์ฒด ์‘๋‹ต ๋ฒ„์ „
       String paymentKey;
       String orderId;
       String orderName;
       String currency; // "KRW"
       String method; // ๊ฒฐ์ œ ์ˆ˜๋‹จ
       String totalAmount;
       String balanceAmount;
       String suppliedAmount;
       String vat; // ๋ถ€๊ฐ€๊ฐ€์น˜์„ธ
       String status; // ๊ฒฐ์ œ ์ฒ˜๋ฆฌ ์ƒํƒœ
       String requestedAt;
       String approvedAt;
       String useEscrow; // false
       String cultureExpense; // false
       PaymentSuccessCardDto card; // ๊ฒฐ์ œ ์นด๋“œ ์ •๋ณด (์•„๋ž˜ ์ž์„ธํ•œ ์ •๋ณด ์žˆ์Œ)
       String type; // ๊ฒฐ์ œ ํƒ€์ž… ์ •๋ณด (NOMAL / BILLING / CONNECTPAY)
    }
  • ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ํ•จ๊ป˜ ๋ณด๋‚ด์ค„ ๊ฒฐ์ œ ์นด๋“œ ์ •๋ณด์ธ paymentSuccessCardDto


๐Ÿšฉ ์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์‘๋‹ต์ด ์„ฑ๊ณต์ ์œผ๋กœ ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์‚ฌ์ง„์„ ๋„ฃ์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๊ฐ’์„ ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ›์•„ ๊ณ ๊ฐ์—๊ฒŒ ๋„˜๊ฒจ์ค„ ์ •๋ณด๋งŒ ์ž˜ ํฌ์žฅํ•ด์„œ ํ”„๋ก ํŠธ์— ๋„˜๊ฒจ์ฃผ๋Š” ์‘๋‹ต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.


์ด์ œ, ํ† ์ŠคํŽ˜์ด๋จผ์ธ ๊ฐ€ ๊ฒฐ์ œ ์‹คํŒจ ์‹œ ์ฝœ๋ฐฑ ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

๐ŸŒผ ์‹คํŒจ ์‹œ ์ฝœ๋ฐฑ ์‘๋‹ต ์ฒ˜๋ฆฌ + ๊ฒ€์ฆ ๋กœ์ง

โœ”๏ธ ์‹คํŒจ Controller

  • tossPaymentFail

โžœ ์‹คํŒจ ์‹œ ์ฝœ๋ฐฑ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ


โœ”๏ธ ์‹คํŒจ Service

  • tossPaymentFail

โžœ ์‹คํŒจ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ค์ œ ๋กœ์ง ๋ถ€๋ถ„

โžœ ๊ฒฐ์ œ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ false๋กœ ๋ฐ”๊พธ๊ณ  ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ setํ•จ


โœ”๏ธ ์‹คํŒจ Dto

  • ๊ฒฐ์ œ ์‹คํŒจ ์‹œ ์‘๋‹ต ๋ฐ์ดํ„ฐ์ธ PaymentFailDto

โžœ ๊ฒฐ์ œ๊ฐ€ ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ errorCode / errorMessage / ํ•ด๋‹น ์ฃผ๋ฌธ ID๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์‘๋‹ต์šฉ ๋ฐ์ดํ„ฐ


๐Ÿšฉ ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ

์‹ค์ œ ๋ˆ์ด ์—†์–ด๋„ ๊ฒฐ์ œ๊ฐ€ ๋˜๋Š” ๊ฐ€๊ฒฐ์ œ ์‹œ์Šคํ…œ์ด์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์‹คํŒจํ•  ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•ด์„œ

์•„๋ž˜์™€ ๊ฐ™์ด postman์œผ๋กœ error Code์™€ message๋ฅผ ์ž„์˜๋กœ ๋„ฃ์–ด์ฃผ๊ณ  ์‘๋‹ต๊ฐ’์ด ์ž˜ ์ „๋‹ฌ๋˜๋Š”์ง€ ํ™•์ธ๋งŒ ํ–ˆ๋‹ค.

h2 DB์—๋„ fail reason์ด ์ž˜ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๐ŸŽ€ ์ง€๊ธˆ๊นŒ์ง€ ์™„์„ฑ๋œ ๋ถ€๋ถ„

  1. ํ”„๋ก ํŠธ์—์„œ ๊ฒฐ์ œ ์š”์ฒญ
  2. ๋ฐฑ์—”๋“œ์—์„œ ์š”์ฒญ ๊ฒ€์ฆ ํ›„ ํ•„์š”ํ•œ ์ •๋ณด์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜
  3. ํ”„๋ก ํŠธ์—์„œ ํ† ์ŠคํŽ˜์ด๋จผ์ธ  ํ˜ธ์ถœ
  4. ํ† ์ŠคํŽ˜์ด๋จผ์ธ ์—์„œ ๊ฒฐ์ œ ๊ฒฐ๊ณผ๋ฅผ ์„ฑ๊ณต/์‹คํŒจ ์‹œ ์ฝœ๋ฐฑ ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

๐Ÿ“Œ ๋‹ค์Œ ํฌ์ŠคํŒ…์€ ๊ฒฐ์ œ ์ทจ์†Œ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
โ €
๐Ÿ‘‰ ๐Ÿ’ณ ํ† ์ŠคํŽ˜์ด๋จผ์ธ  ์—ฐ๋™ํ•˜๊ธฐ (4) _๊ฒฐ์ œ ์ทจ์†Œ / ๊ฒฐ์ œ ๋‚ด์—ญ ์กฐํšŒ

0๊ฐœ์˜ ๋Œ“๊ธ€