kok202
카카오 페이 결제 흐름

2020. 2. 22. 02:28[개발] 기록

참고 링크

전제 1) localhost:3000 은 web 서버다.

전제 2) localhost:8080 은 api 서버다.

전제 3) web 서버와 api 서버는 rest api 로 통신하고 있다.

정보 1) KakaoAK xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 에서 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx는 admin 키다.

 

 

 

1. web 에서 api 서버에 결제 준비 api 호출

https://localhost:8080/payment/ready

 

 

2. api 서버가 kakao pay 의 ready api 를 호출한다.

curl -v -X POST 'https://kapi.kakao.com/v1/payment/ready' \
-H 'Authorization: KakaoAK xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data-urlencode 'cid=TC0ONETIME' \
--data-urlencode 'partner_order_id=partner_order_id' \
--data-urlencode 'partner_user_id=partner_user_id' \
--data-urlencode 'item_name=초코파이' \
--data-urlencode 'quantity=1' \
--data-urlencode 'total_amount=2200' \
--data-urlencode 'vat_amount=200' \
--data-urlencode 'tax_free_amount=0' \
--data-urlencode 'approval_url=https://localhost:3000/payment/approve' \
--data-urlencode 'fail_url=https://localhost:3000/payment/fail' \
--data-urlencode 'cancel_url=https://localhost:3000/payment/cancel'

다음과 같은 응답이 온다. 이를 web 서버에 응답한다.

{
 "tid": "T1234567890123456789",
 "next_redirect_app_url": "https://mockup-pg-web.kakao.com/v1/xxxxxxxxxx/aInfo",
 "next_redirect_mobile_url": "https://mockup-pg-web.kakao.com/v1/xxxxxxxxxx/mInfo",
 "next_redirect_pc_url": "https://mockup-pg-web.kakao.com/v1/xxxxxxxxxx/info",
 "android_app_scheme": "kakaotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/xxxxxxxxxx/order",
 "ios_app_scheme": "kakaotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/xxxxxxxxxx/order",
 "created_at": "2016-11-15T21:18:22"
}

 

 

 

3. web 에서 tid 를 기억하고, redirect 주소를 보고 팝업을 띄운다.
redirect 하는 페이지는 사용자가 결제하는 결제 페이지이다.
위의 예시의 경우 https://mockup-pg-web.kakao.com/v1/xxxxxxxxxx/info 를 팝업으로 띄운다.

 

 

 

4. 사용자가 redirect 된 페이지에서 결제한다.

QR 코드를 찍고 들어가면



 

 

5. 사용자가 결제를 마무리 하면 2번에서 api 서버가 전달한 approve 주소에 pg_token 이 붙은 상태로 이동하게 된다.

ex) https://localhost:3000/payment/approve?pg_token=aaaaaaaaaaaaaaaaaaaa 로 페이지 이동된다.

카카오 페이 서버에서는 아직 결제가 된 상태는 아니다.

결제 요청이 들어간 상태고 3번 과정을 통해서 사용자가 결제를 하겠다고 사인을 한 상태다.

결제를 승인 해줘야한다.

 

 

 

6. 사용자는 approve 페이지에서 결제 승인 버튼을 누른다. (혹은 바로 결제)

결제 승인 버튼의 결과 api 서버에 결제 승인 api 가 호출된다.

이때 3번에서 기억하고 있던 tid 와 5번에서 받은 pg_token 을 같이 전달해준다.

https://localhost:8080/payment/done?pg_token=aaaaaaaaaaaaaaaaaaaa&tid=T123456789

 

 

 

7. api 서버는 kakao pay 의 approve api 를 호출한다.

curl -v -X POST 'https://kapi.kakao.com/v1/payment/approve' \
-H 'Authorization: KakaoAK xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data-urlencode 'cid=TC0ONETIME' \
--data-urlencode 'tid=T1234567890123456789' \
--data-urlencode 'partner_order_id=partner_order_id' \
--data-urlencode 'partner_user_id=partner_user_id' \
--data-urlencode 'pg_token=aaaaaaaaaaaaaaaaaaaa'

다음과 같은 응답이온다. (카드 결제의 경우 다른 포맷이지만 생략)

{
 "aid": "A5678901234567890123",
 "tid": "T1234567890123456789",
 "cid": "TC0ONETIME",
 "partner_order_id": "partner_order_id",
 "partner_user_id": "partner_user_id",
 "payment_method_type": "MONEY",
 "item_name": "초코파이",
 "quantity": 1,
 "amount": {
  "total": 2200,
  "tax_free": 0,
  "vat": 200,
  "point": 0
 },
 "created_at": "2016-11-15T21:18:22",
 "approved_at": "2016-11-15T21:20:47"
}

api 서버는 kakao pay 의 approve api 가 무사히 완료된 것을 확인하면 데이터 작업을 한다.

 

 

 

*) approve 페이지가 웹서버로 붙는게 아니라 api 서버로 바로 붙게하면 사용자가 결제 승인 버튼을 누를 필요 없게 할 수도 있다.

 

 

 

 

'[개발] 기록' 카테고리의 다른 글

Parallel stream 과 Map  (0) 2020.01.07
JsonTypeInfo, JsonSubTypes : 필드 값에 따라 파싱 타입 결정하기  (0) 2019.10.23
Already had POJO for id 에러  (0) 2019.08.05
mvn vs mvnw  (0) 2019.06.26
자바 8 Stream  (0) 2019.06.06