โœ๐Ÿป [Code Camp_TIL] 29์ผ์ฐจ: ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค, ํฌํŠธ์›, webhook notification

code_Jยท2023๋…„ 4์›” 23์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
35/41
post-thumbnail

๊ฒฐ์ œ


๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ์ดํ•ด


PG์‚ฌ

๊ธฐ์—…์ด ์นด๋“œ์‚ฌ์—๊ฒŒ ์ง์ ‘ ์Šน์ธ์„ ๋ฐ›์•„ ๊ฒฐ์ œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋น„์šฉ๊ณผ ์‹œ๊ฐ„ ๋ฉด์—์„œ ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์นด๋“œ์‚ฌ์™€ ๊ธฐ์—… ๊ฐ„์— ๊ฒฐ์ œ๋ฅผ ๋Œ€ํ–‰ํ•ด์ฃผ๋Š” ํšŒ์‚ฌ(PG์‚ฌ: payment gateway)๊ฐ€ ์žˆ๊ณ , ๋ณดํ†ต PG์‚ฌ๋ฅผ ํ†ตํ•ด์„œ ๊ฒฐ์ œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

PG์‚ฌ์˜ ๊ฐ€์ด๋“œ์— ๋งž์ถฐ์„œ ๊ฒฐ์ œ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋ฉด ์—ฌ๋Ÿฌ ์นด๋“œ์‚ฌ๋“ค์— ๋งž์ถฐ์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐœ๋ฐœ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

PG์‚ฌ๋Š” ๊ธฐ์—…๋“ค์—๊ฒŒ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์ฃผ๋กœ asp, php, jsp ๋“ฑ์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ€์ด๋“œ๊ฐ€ ์ˆ˜๋ฐฑ ํŽ˜์ด์ง€ ์ •๋„์˜ ๋ถ„๋Ÿ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์— ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.


๊ฒฐ์ œ ์†”๋ฃจ์…˜

์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ๊ฒฐ์ œ ์†”๋ฃจ์…˜ ์—…์ฒด๋„ ๋“ฑ์žฅํ–ˆ๋‹ค. PG์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์„œ ํ•˜๋‚˜์˜ PG์‚ฌ์™€ ๊ณ„์•ฝ์„ ํ•˜๊ณ  ๊ฒฐ์ œ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•œ ํ›„์—๋Š” ๋‹ค๋ฅธ ์—…์ฒด๋กœ ์˜ฎ๊ธฐ๊ธฐ ์–ด๋ ต๋‹ค.

๊ฒฐ์ œ์†”๋ฃจ์…˜(๊ฒฐ์ œ API)์—…์ฒด๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•ด์ค€๋‹ค. ๊ฒฐ์ œ ์†”๋ฃจ์…˜ ์—…์ฒด๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐœ๋ฐœํ™˜๊ฒฝ๊ณผ ์ƒ๊ด€์—†์ด ์›ํ•˜๋Š” PG์‚ฌ์™€์˜ ๊ฒฐ์ œ์‹œ์Šคํ…œ์„ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ค‘๊ฒฌ, ์ค‘์†Œ ๊ทœ๋ชจ ๊ธฐ์—…์˜ ๊ฒฝ์šฐ PG์‚ฌ์™€ ์ง์ ‘ ๊ณ„์•ฝํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฒฐ์ œ ์†”๋ฃจ์…˜ ์—…์ฒด๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.


๊ฒฐ์ œ ์‹ค์Šต์—์„œ๋„ ๊ฒฐ์ œ ์†”๋ฃจ์…˜ ์—…์ฒด ์ค‘ ํ•˜๋‚˜์ธ ํฌํŠธ์›(๊ตฌ ์•„์ž„ํฌํŠธ)์„ ์ด์šฉํ–ˆ๋‹ค. ํฌํŠธ์›์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ์ œ๋ฅผ ํ†ตํ•ด ํฌ์ธํŠธ๋ฅผ ์ถฉ์ „ํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ถฉ์ „ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญ
  2. ์ถฉ์ „ํ•˜๊ธฐ ์ฐฝ์—์„œ ์›ํ•˜๋Š” ๊ธˆ์•ก์„ ์„ ํƒํ•˜๊ณ  ๊ฒฐ์ œ ๋ฒ„ํŠผ ํด๋ฆญ
  3. ํฌํŠธ์›์—์„œ ์ œ๊ณตํ•˜๋Š” Rest-API๋ฅผ ์ด์šฉํ•ด ๊ฒฐ์ œ ์š”์ฒญ
  4. ๊ฒฐ์ œ ์„ฑ๊ณต ์‹œ ํ•ด๋‹น ๊ฒฐ์ œ์— ๋Œ€ํ•œ imp_uid์™€ ๊ฒฐ์ œ ๊ธˆ์•ก ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ๋ ค๋ฐ›์Œ
  5. ์„ฑ๊ณตํ•œ ๊ฒฐ์ œ ์ •๋ณด๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ mutation
  6. db์˜ ์œ ์ € ํฌ์ธํŠธ ์ •๋ณด์— ๊ฒฐ์ œ ๋‚ด์—ญ์„ ์—…๋ฐ์ดํŠธ

์œ„์™€ ๊ฐ™์€ ๊ฒฐ์ œ ๊ณผ์ • ์ค‘ ํฌํŠธ์›์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.


์ผ์ •์˜ ์ค‘์š”์„ฑ!

์ฐฝ์—…ํ•  ๋•Œ ๊ฒฐ์ œ ์Šน์ธ ๊ธฐ๊ฐ„์€ ์–ด๋Š ์ •๋„๋กœ ์žก๋Š”๊ฒŒ ์ข‹์„๊นŒ?

์ตœ์†Œ 1๋‹ฌ์€ ์žก์•„์•ผ ํ•œ๋‹ค. ํฌํŠธ์›์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋„ ๊ฐ๊ฐ์˜ PG์‚ฌ์™€ ์นด๋“œ์‚ฌ์—๊ฒŒ ์Šน์ธ ๋ฐ ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

์Šน์ธ ์ผ์ •: PG์‚ฌ ๊ณ„์•ฝ์Šน์ธ(1์ฃผ) + ์นด๋“œ์‚ฌ ์‹ฌ์‚ฌ(2์ฃผ) => ์ตœ์†Œ 3์ฃผ ์ด์ƒ


์™ธ๋ถ€ API(ํฌํŠธ์›) ์‚ฌ์šฉํ•˜๊ธฐ

ํฌํŠธ์› ์ดˆ๊ธฐ ์„ค์ •

  1. ํฌํŠธ์› ๊ณ„์ • ๋งŒ๋“ค๊ธฐ
  2. ํ…Œ์ŠคํŠธ ๋ชจ๋“œ๋กœ ์„ค์ •
  3. ์‚ฌ์šฉํ•  PG์‚ฌ ์„ ํƒ

์›นํ›…๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜

ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํƒ€ ์„œ๋น„์Šค๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์•Œ๋ฆผ(notification)์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ


ํ”ํžˆ ์•„๋Š” ๋ฌดํ†ต์žฅ ์ž…๊ธˆ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ํฌํŠธ์›์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌดํ†ต์žฅ ์ž…๊ธˆ์ด ์ง„ํ–‰๋œ๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌดํ†ต์žฅ ์ž…๊ธˆ์„ ์„ ํƒ
  2. ์•„์ž„ํฌํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์ด์šฉํ•ด ๊ฐ€์ƒ ๊ณ„์ขŒ ์ƒ์„ฑ
  3. ๊ฒฐ์ œ ์ค‘์ด๋˜ ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹คํ–‰ ์ข…๋ฃŒํ•˜๊ณ , ๊ฐ€์ƒ ๊ณ„์ขŒ๋ฅผ ๋ฐœ๊ธ‰ํ•œ ์€ํ–‰ ์„œ๋น„์Šค์— ์ ‘์†
  4. ๊ฐ€์ƒ ๊ณ„์ขŒ ์œ ํšจ๊ธฐ๊ฐ„ ๋‚ด์— ์ž…๊ธˆ ์™„๋ฃŒ

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒฐ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ์ œ ์™„๋ฃŒ ์‹œ์ ์— ๊ฒฐ์ œ ๊ธˆ์•ก๊ณผ imp_uid๋ฅผ ๋ฐ›์•„์„œ ๋ฐฑ์—”๋“œ๋กœ ๋ณด๋‚ด์ค„ ์ˆ˜ ์—†๋‹ค. ์ด ์ž‘์—…์„ ์œ„ํ•ด ํฌํŠธ์›์€ ์›นํ›…๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜(Webhook notification)์„ ์ œ๊ณตํ•œ๋‹ค.


์›นํ›…๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์„ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค!

1. ๊ฐ€์ƒ๊ณ„์ขŒ๋ฅผ ์ด์šฉํ•œ ๋ฌดํ†ต์žฅ ์ž…๊ธˆ
2. ๊ฒฐ์ œ ์ทจ์†Œ
3. ์˜ˆ์•ฝ ๊ฒฐ์ œ
4. ํ™˜๋ถˆ

์ด ์™ธ์—๋„ ํฌํŠธ์›์—์„œ๋Š” ์˜์ˆ˜์ฆ, ์ •๊ธฐ ์˜ˆ์•ฝ ๊ฒฐ์ œ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Rest-API๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Rest-API ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹๋‹ค!


ํฌํŠธ์› ์ ์šฉ

ํฌํŠธ์› DOCS ํŽ˜์ด์ง€์™€ ๊นƒํ—ˆ๋ธŒ์—๋„ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

ํฌํŠธ์›์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํฌํŠธ์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ head ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค. Next.js์—์„œ๋Š” HTML์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— Next.js์—์„œ ์ œ๊ณตํ•˜๋Š” Head ํƒœ๊ทธ๋ฅผ importํ•ด์•ผ ํ•œ๋‹ค.

๋˜ํ•œ, ํฌํŠธ์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด Head ํƒœ๊ทธ๋กœ script ํƒœ๊ทธ๋ฅผ ๊ฐ์‹ธ์„œ ๊ฒฐ์ œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ํŽ˜์ด์ง€์˜ return ์•ˆ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

import Head from 'next/head';
// ์ตœ์ƒ๋‹จ์— next/head ์˜ Head ํƒœ๊ทธ ํ˜ธ์ถœ

<Head>
	<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js" ></script>
	<script type="text/javascript" src="https://cdn.iamport.kr/js/iamport.payment-1.1.5.js"></script>
</Head>

๊ทธ ํ›„์—๋Š” ์‚ฌ์šฉํ•˜๋ ค๋Š” ํฌํŠธ์›์˜ ๊ฐ€๋งน์  ์‹๋ณ„์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  window.IMP๋กœ ํฌํŠธ์›์„ ๋ถˆ๋Ÿฌ์™€์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

const IMP = window.IMP;
IMP.init("๊ฐ€๋งน์  ์‹๋ณ„์ฝ”๋“œ");

<br/><br/>

๊ฐ€๋งน์  ์‹๋ณ„์ฝ”๋“œ๋Š” ํฌํŠธ์› ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์˜ ์‹œ์Šคํ…œ ์„ค์ • -> ๋‚ด ์ •๋ณด -> ๊ฐ€๋งน์  ์‹๋ณ„์ฝ”๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ์‹๋ณ„์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋˜ ํŽ˜์ด์ง€ ์•ˆ์— ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.


  IMP.request_pay({
    pg: "html5_inicis",
    pay_method: "card",
    //merchant_uid: "๊ฒฐ์ œ ๋ฒˆํ˜ธ",
    name: "์•„์ด๋ฆฌ๋ฒ„ ๋ฌด์„  ๋งˆ์šฐ์Šค ์™ธ 1๊ฐœ",
    amount: 10000,
    buyer_email: "์ด๋ฉ”์ผ@gmail.com",
    buyer_name: "ํ™๊ธธ๋™",
    buyer_tel: "010-4242-4242",
    buyer_addr: "์„œ์šธํŠน๋ณ„์‹œ ๊ฐ•๋‚จ๊ตฌ ์‹ ์‚ฌ๋™",
    buyer_postcode: "01181",
		m_redirect_url : "/"
		
  }, function (rsp) { // callback
				if (rsp.success) {
           alert('๊ฒฐ์ œ๊ฐ€ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.');
            // ๊ฒฐ์ œ ์„ฑ๊ณต ๋กœ์ง

        } else {
            alert('๊ฒฐ์ œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.');
            // ๊ฒฐ์ œ ์‹คํŒจ ๋กœ์ง
        }
   });

์ด์ œ ํฌํŠธ์› ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ์„ค์ •ํ•ด๋†“์€ PG์‚ฌ์˜ ๊ฒฐ์ œ ํŽ˜์ด์ง€๋ฅผ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค!


๊ฒฐ์ œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด, ํฌํŠธ์›์œผ๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฒฐ์ œ์— ๋Œ€ํ•œ rsp(response)๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค. rsp์—๋Š” ํ•ด๋‹น ๊ฒฐ์ œ์— ๋Œ€ํ•œ imp_uid์™€ ๊ฒฐ์ œ ๊ธˆ์•ก ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋‹ค. ์ด rsp๋ฅผ ์ด์šฉํ•˜์—ฌ ํฌ์ธํŠธ ์ถฉ์ „ API์— ๊ฒฐ์ œ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.


ํฌํŠธ์› ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์˜ ๊ฒฐ์ œ์Šน์ธ๋‚ด์—ญ ํŽ˜์ด์ง€์—์„œ๋Š” ๊ฒฐ์ œ ๋‚ด์—ญ(์‹คํŒจ ๋ฐ ์„ฑ๊ณต)์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ! ๋ฐ˜์‘ํ˜• ์›น ํŽ˜์ด์ง€ ์ž‘์—… ์‹œ์—๋Š” m_redirect_url์„ ์„ค์ •ํ•ด์„œ ๋ชจ๋ฐ”์ผ์—์„œ ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๋Œ์•„์˜ฌ url๊นŒ์ง€ ์—ฐ๊ฒฐํ•ด์ค˜์•ผ ํ•จ!


profile
Web FE ๊ฐœ๋ฐœ์ž ์ทจ์ค€์ƒ

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