๐ ํด๋น ๊ฒ์๋ฌผ์ ์ ๊ฒ์๋ฌผ๊ณผ ์ด์ด์ง๋ ๋ด์ฉ์ ๋๋ค.
๐ <๊ฒฐ์ ํ๋ฆ ์ญํ ๋ณ ์ ๋ฆฌ>์์ 4~6๋ฒ์ ํด๋นํ๋ ๋ด์ฉ์ ๋๋ค.
๊ฒฐ์ ์ฐฝ์ ์ด์ฉํ์ฌ ์ ์์ ์ผ๋ก ๊ฒฐ์ ๊ฐ ์๋ฃ๋๋ฉด,
์๋์ ๊ฐ์ด ์ง์ ํด๋ ์ฑ๊ณต ์ ์ฝ๋ฐฑ URL๋ก orderId
, paymentKey
, amount
3๊ฐ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ๋์ด์ค๊ฒ ๋๋ค.
paymentKey
โ ํ ์คํ์ด๋จผ์ธ ์์ ์ ํ ๊ฒฐ์ ๊ตฌ๋ถ์ฉ ํค
โ ๊ฒฐ์ ์ทจ์ / ๊ฒฐ์ ์กฐํ์ ์ฌ์ฉ๋จ
โ orderId
โ ์๋น์ค์์ ์ ํ ์ฃผ๋ฌธ ๊ณ ์ ๋ฒํธ
โ ๊ฐ ์ฃผ๋ฌธ ๋ณ uniqueํ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ ๊ฐ์ง๊ณ ์ ์ฅ๋ ๊ฒฐ์ ํธ์ถ ๋ด์ญ์ ์กฐํํ์ฌ (ํ์ฌ amount ๊ฐ <-> ๊ฒฐ์ ์์ฒญ ๋ ์ ์ฅ๋ amount ๊ฐ)์ ๋น๊ตํ๋ฉด ๋์ผํ ๊ฐ๊ฒฉ์ผ๋ก ์ ์์ ์ธ ์ฃผ๋ฌธ์ด ์๋ฃ๋์๋์ง ํ์ธํ ์ ์
โ amount
โ ๊ฐ๊ฒฉ ์ ๋ณด
๊ทธ๋ผ ์ด์ ํ๋ก ํธ์์ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด์ฃผ์๊ณ
ํ๋ก ํธ๊ฐ ๊ทธ ์๋ต๋ฐ์ดํฐ๋ก ๊ฒฐ์ ์์ฒญ์ ํ๊ธฐ ๋๋ฌธ์
ํ ์คํ์ด๋จผ์ธ ๊ฐ ๊ฒฐ์ ๊ฒฐ๊ณผ๋ก ์ฑ๊ณต ์ ๋ฆฌ๋ค์ด๋ ํธ ๋ ์ฃผ์
๋ก ์๋ต์ ๋ณด๋ธ ๊ฒ์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ค.
tossPaymentSuccess
โ ์ฑ๊ณต ์ ์ฝ๋ฐฑ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ณณ
โ
โ ํ ์คํ์ด๋จผ์ธ ๊ฐ ๋ณด๋ธ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๊ณ 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๋ฅผ ์ด์ฉํ์ฌ ์ธ์ฝ๋ฉํ์ฌ ๊ผญ ๋ณด๋ด์ผํจ
( โ ๊ผญ! {์ํฌ๋ฆฟํค + ":"} ์กฐํฉ์ผ๋ก ์ธ์ฝ๋ฉํ๊ธฐ )
๊ฒฐ์ ์ฑ๊ณต ์ ์๋ต ๋ฐ์ดํฐ์ธ 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
๐ฉ ์ด๋ ๊ฒ ํ๊ณ ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด, ์๋์ ๊ฐ์ด ์๋ต์ด ์ฑ๊ณต์ ์ผ๋ก ์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ ์คํธ ์ฌ์ง์ ๋ฃ์ ์์ ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๊ฐ์ ๋ฐฑ์๋์์ ๋ฐ์ ๊ณ ๊ฐ์๊ฒ ๋๊ฒจ์ค ์ ๋ณด๋ง ์ ํฌ์ฅํด์ ํ๋ก ํธ์ ๋๊ฒจ์ฃผ๋ ์๋ต์ ์๋์ ๊ฐ๋ค.
์ด์ , ํ ์คํ์ด๋จผ์ธ ๊ฐ ๊ฒฐ์ ์คํจ ์ ์ฝ๋ฐฑ ์ฃผ์๋ก ๋ฆฌ๋ค์ด๋ ํธ ํ๋ ์์ฒญ์ ๋ํด ์ฒ๋ฆฌ๋ฅผ ํด๋ณผ ๊ฒ์ด๋ค.
tossPaymentFail
โ ์คํจ ์ ์ฝ๋ฐฑ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ณณ
tossPaymentFail
โ ์คํจ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ค์ ๋ก์ง ๋ถ๋ถ
โ ๊ฒฐ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ false๋ก ๋ฐ๊พธ๊ณ ์๋ฌ ๋ฉ์ธ์ง๋ฅผ setํจ
PaymentFailDto
โ ๊ฒฐ์ ๊ฐ ์คํจํ์ ๊ฒฝ์ฐ errorCode / errorMessage / ํด๋น ์ฃผ๋ฌธ ID๋ฅผ ๋ฐํํ๊ธฐ ์ํ ์๋ต์ฉ ๋ฐ์ดํฐ
๐ฉ ์ด๋ ๊ฒ ํด์ ์คํจํ ํ ์คํธ๋ฅผ ์งํํด๋ณด๋ ค๊ณ ํ๋๋ฐ
์ค์ ๋์ด ์์ด๋ ๊ฒฐ์ ๊ฐ ๋๋ ๊ฐ๊ฒฐ์ ์์คํ ์ด์ด์ ๊ทธ๋ฐ์ง ์คํจํ ํ ์คํธ๋ฅผ ๋ง๋ค์ง ๋ชปํด์
์๋์ ๊ฐ์ด postman์ผ๋ก error Code์ message๋ฅผ ์์๋ก ๋ฃ์ด์ฃผ๊ณ ์๋ต๊ฐ์ด ์ ์ ๋ฌ๋๋์ง ํ์ธ๋ง ํ๋ค.
h2 DB์๋ fail reason์ด ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐ ๋ค์ ํฌ์คํ ์ ๊ฒฐ์ ์ทจ์์ ๋ํ ๋ด์ฉ์ ๋๋ค.
โ
๐ ๐ณ ํ ์คํ์ด๋จผ์ธ ์ฐ๋ํ๊ธฐ (4) _๊ฒฐ์ ์ทจ์ / ๊ฒฐ์ ๋ด์ญ ์กฐํ