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 |