톱 1923 카카오 페이 Api 업데이트 35 일 전

주제에 대한 기사를 찾고 있습니까 “카카오 페이 api“? 웹사이트에서 이 주제에 대한 전체 정보를 제공합니다 https://c1.castu.org 탐색에서: c1.castu.org/blog. 바로 아래에서 이 주제에 대한 자세한 답변을 찾을 수 있습니다. 찾고 있는 주제를 더 잘 이해하려면 끝까지 읽으십시오. 더 많은 관련 검색어: 카카오 페이 api 카카오페이 api 예제, 카카오페이 api 테스트, 카카오페이 api javascript, 카카오페이 api 수수료, 카카오페이 api 구현, 안드로이드 카카오페이 api, 스프링 카카오페이 api 예제, 스프링 부트 카카오페이 API

카카오 페이( Kakao pay) 기능구현 – 요리 좋아하는 개발자

23 thg 4, 2022 — 카카오 페이 API 에서는 아래 항목의 기능을 제공한다. 이 중에 이번에 필요한 건 단건결제 였다. 단건결제: 일회성으로 결제를 진행합니다.

  • Source: jungkeung.tistory.com
  • Views: 17778
  • Publish date: 18 minute ago
  • Downloads: 65414
  • Likes: 9769
  • Dislikes: 8
  • Title Website: 카카오 페이( Kakao pay) 기능구현 – 요리 좋아하는 개발자
  • Description Website: 23 thg 4, 2022 — 카카오 페이 API 에서는 아래 항목의 기능을 제공한다. 이 중에 이번에 필요한 건 단건결제 였다. 단건결제: 일회성으로 결제를 진행합니다.

세부 정보를 보려면 여기를 클릭하십시오.

  • Source: Youtube
  • Views: 29203
  • Date: 14 minute ago
  • Download: 62884
  • Likes: 6730
  • Dislikes: 4

카카오 페이( Kakao pay) 기능구현

이번에 간편결제 기능인 카카오 페이 구현을 진행했으며 작업이 모두 끝나서 이를 정리해두려 한다.

준비하기

관리자 모드 > 환경설정 > 전자결제 설정 > 국내 전자 결제에서 PG를 신청하면서 동시에 카카오페이를 신청할 수 있다. 이미 PG사에 가입하신 분은 간편결제 항목에서 카카오페이 신청 버튼을 눌러 안내에 따라 진행하면 된다.

카카오 페이 API 에서는 아래 항목의 기능을 제공한다. 이 중에 이번에 필요한 건 단건결제 였다.

단건결제: 일회성으로 결제를 진행합니다.

일회성으로 결제를 진행합니다. 정기결제: 최초 등록 후 주기적으로 결제를 진행합니다.

최초 등록 후 주기적으로 결제를 진행합니다. 정기결제 비활성화: 등록된 정기결제 키(SID)를 비활성화 하여 정기결제를 중지합니다.

등록된 정기결제 키(SID)를 비활성화 하여 정기결제를 중지합니다. 정기결제 상태 조회: 등록된 정기결제 키 (SID)를 조회해 정기결제 상태를 조회합니다.

등록된 정기결제 키 (SID)를 조회해 정기결제 상태를 조회합니다. 주문 조회: 결제 요청한 주문을 조회합니다.

결제 요청한 주문을 조회합니다. 결제 취소: 완료된 결제를 부분 또는 전체 취소합니다.

카카오페이 다이어그램

시작하기

참고: Kakao Developers 참고 : Kakao Developers

앱 이름과 사업자명 작성해주자 사업자명은 자신의 이름을 입력해주면 된다.

이미지는 넣어도 되고 안넣어도 상관없다.

참고 : Kakao Developers

Web에서만 사용할거면 Web에만 등록하시면 됩니다. 모바일에도 사용할 시 모바일 플랫폼 등록 하면 된다.

참고 : Kakao Developers 참고 : kakao Developers

해석해보자면 POST방식으로 https://kapi.kakao.com + /v1/payment/approve란 호스트(url 주소)로 Authorization(권한)과 Content-Type을 보내라는 것이다.

이 부분이 header에 해당되는 내용이고 밑에 있는 키와 설명, 타입으로 되어있는 부분은 body로 보내면 된다.

권한은 어디서 얻을 수 있을까?

먼저, KakaoDevelopers에 로그인을 해야한다.

내 애플리케이션 -> 개요 -> 앱정보 -> 앱 키 표시를 눌렀을 때 나오는 admin 키가 바로 권한 키이다.

request는 카카오페이에서 요구하는 정보이다.

kakaoPay.jsp 생성

kakaoPay.html

​카카오페이 html 부분이다.

post 방식으로 보낼 버튼을 만들어 준다.

Insert title here

kakaoPay api 이용하기

kakaoPay script 작성

Controller 구현

package org.salem.service; import java.net.URI; import java.net.URISyntaxException; import org.salem.domain.KakaoPayApprovalVO; import org.salem.domain.KakaoPayReadyVO; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import lombok.extern.java.Log; @Service @Log public class KakaoPay { private static final String HOST = “https://kapi.kakao.com”; private KakaoPayReadyVO kakaoPayReadyVO; public String kakaoPayReady() { RestTemplate restTemplate = new RestTemplate(); // 서버로 요청할 Header HttpHeaders headers = new HttpHeaders(); headers.add(“Authorization”, “KakaoAK ” + “admin key를 넣어주세요”); headers.add(“Accept”, MediaType.APPLICATION_JSON_UTF8_VALUE); headers.add(“Content-Type”, MediaType.APPLICATION_FORM_URLENCODED_VALUE + “;charset=UTF-8”); // 서버로 요청할 Body MultiValueMap params = new LinkedMultiValueMap(); params.add(“cid”, “TC0ONETIME”); params.add(“partner_order_id”, “1001”); params.add(“partner_user_id”, “gorany”); params.add(“item_name”, “갤럭시S9”); params.add(“quantity”, “1”); params.add(“total_amount”, “2100”); params.add(“tax_free_amount”, “100”); params.add(“approval_url”, “http://localhost:8080/kakaoPaySuccess”); params.add(“cancel_url”, “http://localhost:8080/kakaoPayCancel”); params.add(“fail_url”, “http://localhost:8080/kakaoPaySuccessFail”); HttpEntity> body = new HttpEntity>(params, headers); try { kakaoPayReadyVO = restTemplate.postForObject(new URI(HOST + “/v1/payment/ready”), body, KakaoPayReadyVO.class); log.info(“” + kakaoPayReadyVO); return kakaoPayReadyVO.getNext_redirect_pc_url(); } catch (RestClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return “/pay”; } }

1) cid는 가맹점 코드로 카카오페이에 연락해서 받아야 한다.

Test 코드이므로 TC0ONETIME를 넣었고 실결제를 하려면 카카오페이와 제휴 후 받은 cid 코드를 넣으면 된다.

2) Authorization에 위에서 설명한 admin 키를 넣어야 한다.

3) body 부분에는 내가 결제로 지정할 데이터들을 넣는다.

kakao Developers에 필수라고 써있는 파라미터들은 꼭 넣어줘야한다.

4) HttpEntity> body = new HttpEntity>(params, headers);

hearder와 body를 붙이는 방법이다.

5) kakaoPayReadyVO = restTemplate.postForObject(new URI(HOST + “/v1/payment/ready”), body, KakaoPayReadyVO.class);

RestTemplate을 이용해 카카오페이에 데이터를 보내는 방법이다.

post방식으로 HOST + “/v1/payment/ready”에 body(header+body)정보를 보낸다.

정보를 보내고 요청이 성공적으로 이루어지면 카카오페이에서 응답정보를 보내준다.

KakaoPayReadyVO.class는 응답을 받는 객체를 설정한 것이다.

reponse로 위와 같은 데이터가 들어오므로 이를 객체로 받기 위한 자바 빈을 만들어준다.

kakaoPayReadVo

@Data public class KakaoPayReadyVO { //response private String tid, next_redirect_pc_url; private Date created_at; }

6) return kakaoPayReadyVO.getNext_redirect_pc_url();

마지막 return 값으로 redirect url을 불러와 결제가 완료되면 해당 주소로 가게끔 설정해 놓는다.

카카오페이 Controller 만들자.

SampleController

@Log @Controller public class SampleController { @Setter(onMethod_ = @Autowired) private KakaoPay kakaopay; @GetMapping(“/kakaoPay”) public void kakaoPayGet() { } @PostMapping(“/kakaoPay”) public String kakaoPay() { log.info(“kakaoPay post……………………………………..”); return “redirect:” + kakaopay.kakaoPayReady(); } @GetMapping(“/kakaoPaySuccess”) public void kakaoPaySuccess(@RequestParam(“pg_token”) String pg_token, Model model) { log.info(“kakaoPaySuccess get……………………………………..”); log.info(“kakaoPaySuccess pg_token : ” + pg_token); } }

kakaoPaySuccess.html까지 만들어 놓으면 우선 카카오페이 결제가 정상적으로 작동이 될 것이다.

지금 부터 결제 완료 부분을 만들것이다.

Controller구현

@Service @Log public class KakaoPay { private static final String HOST = “https://kapi.kakao.com”; private KakaoPayReadyVO kakaoPayReadyVO; private KakaoPayApprovalVO kakaoPayApprovalVO; public String kakaoPayReady() { RestTemplate restTemplate = new RestTemplate(); // 서버로 요청할 Header HttpHeaders headers = new HttpHeaders(); headers.add(“Authorization”, “KakaoAK ” + “admin key를 넣어주세요~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!”); headers.add(“Accept”, MediaType.APPLICATION_JSON_UTF8_VALUE); headers.add(“Content-Type”, MediaType.APPLICATION_FORM_URLENCODED_VALUE + “;charset=UTF-8”); // 서버로 요청할 Body MultiValueMap params = new LinkedMultiValueMap(); params.add(“cid”, “TC0ONETIME”); params.add(“partner_order_id”, “1001”); params.add(“partner_user_id”, “gorany”); params.add(“item_name”, “갤럭시S9”); params.add(“quantity”, “1”); params.add(“total_amount”, “2100”); params.add(“tax_free_amount”, “100”); params.add(“approval_url”, “http://localhost:8080/kakaoPaySuccess”); params.add(“cancel_url”, “http://localhost:8080/kakaoPayCancel”); params.add(“fail_url”, “http://localhost:8080/kakaoPaySuccessFail”); HttpEntity> body = new HttpEntity>(params, headers); try { kakaoPayReadyVO = restTemplate.postForObject(new URI(HOST + “/v1/payment/ready”), body, KakaoPayReadyVO.class); log.info(“” + kakaoPayReadyVO); return kakaoPayReadyVO.getNext_redirect_pc_url(); } catch (RestClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return “/pay”; } public KakaoPayApprovalVO kakaoPayInfo(String pg_token) { log.info(“KakaoPayInfoVO……………………………………..”); log.info(“—————————–“); RestTemplate restTemplate = new RestTemplate(); // 서버로 요청할 Header HttpHeaders headers = new HttpHeaders(); headers.add(“Authorization”, “KakaoAK ” + “admin key를 넣어주세요~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!”); headers.add(“Accept”, MediaType.APPLICATION_JSON_UTF8_VALUE); headers.add(“Content-Type”, MediaType.APPLICATION_FORM_URLENCODED_VALUE + “;charset=UTF-8”); // 서버로 요청할 Body MultiValueMap params = new LinkedMultiValueMap(); params.add(“cid”, “TC0ONETIME”); params.add(“tid”, kakaoPayReadyVO.getTid()); params.add(“partner_order_id”, “1001”); params.add(“partner_user_id”, “gorany”); params.add(“pg_token”, pg_token); params.add(“total_amount”, “2100”); HttpEntity> body = new HttpEntity>(params, headers); try { kakaoPayApprovalVO = restTemplate.postForObject(new URI(HOST + “/v1/payment/approve”), body, KakaoPayApprovalVO.class); log.info(“” + kakaoPayApprovalVO); return kakaoPayApprovalVO; } catch (RestClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }

1) kakaoPayApprovalVO = restTemplate.postForObject(new URI(HOST + “/v1/payment/approve”), body, KakaoPayApprovalVO.class);

응답정보를 받기 위해 KakaoPayApprovalVO 클래스를 만든다.

KakaoPayApprovalVO

@Data public class KakaoPayApprovalVO { //response private String aid, tid, cid, sid; private String partner_order_id, partner_user_id, payment_method_type; private AmountVO amount; private CardVO card_info; private String item_name, item_code, payload; private Integer quantity, tax_free_amount, vat_amount; private Date created_at, approved_at; }

여기서 amount 와 card_info는 JSONObject로 전송받기 때문에 따로 AmountVO, CardVO라는 객체를 만들어 준다.

AmountVO, CardVO

@Data public class AmountVO { private Integer total, tax_free, vat, point, discount; } package org.salem.domain; import lombok.Data; @Data public class CardVO { private String purchase_corp, purchase_corp_code; private String issuer_corp, issuer_corp_code; private String bin, card_type, install_month, approved_id, card_mid; private String interest_free_install, card_item_code; }

Controller에서 model.addAttribute를 이용하여 화면 쪽에 정보를 전송한다.

SampleController

@Log @Controller public class SampleController { @Setter(onMethod_ = @Autowired) private KakaoPay kakaopay; @GetMapping(“/kakaoPay”) public void kakaoPayGet() { } @PostMapping(“/kakaoPay”) public String kakaoPay() { log.info(“kakaoPay post……………………………………..”); return “redirect:” + kakaopay.kakaoPayReady(); } @GetMapping(“/kakaoPaySuccess”) public void kakaoPaySuccess(@RequestParam(“pg_token”) String pg_token, Model model) { log.info(“kakaoPaySuccess get……………………………………..”); log.info(“kakaoPaySuccess pg_token : ” + pg_token); model.addAttribute(“info”, kakaopay.kakaoPayInfo(pg_token)); } }

이제 kakaoPaySuccess.html에 결제승인된 정보를 나타내보자.

kakaoPaySuccess.html

Insert title here 카카오페이 결제가 정상적으로 완료되었습니다. 결제일시: [[${info.approved_at}]] 주문번호: [[${info.partner_order_id}]] 상품명: [[${info.item_name}]] 상품수량: [[${info.quantity}]] 결제금액: [[${info.amount.total}]] 결제방법: [[${info.payment_method_type}]]

[[${info}]]

여기 까지가 카카오페이 만드는 과정이다.

참고 자료

https://developers.kakao.com/

https://www.kakaocert.com/docs/tutorial?lang=java&service=verifyAuth&type=spring

https://velog.io/@ohjs813/Spring-%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%8E%98%EC%9D%B4-API

인증하기 – 카카오페이 | 개발자센터

이 문서는 카카오페이 API 호출 시 필요한 인증 및 호출 방법에 대해 소개합니다. 현재는 얼굴인식 API 호출시에만 필요한 부분입니다.

  • Source: developers.kakaopay.com
  • Views: 72571
  • Publish date: 23 hours ago
  • Downloads: 36958
  • Likes: 6253
  • Dislikes: 2
  • Title Website: 인증하기 – 카카오페이 | 개발자센터
  • Description Website: 이 문서는 카카오페이 API 호출 시 필요한 인증 및 호출 방법에 대해 소개합니다. 현재는 얼굴인식 API 호출시에만 필요한 부분입니다.

세부 정보를 보려면 여기를 클릭하십시오.

Spring 카카오페이 api 적용

  • Source: Youtube
  • Views: 29856
  • Date: 16 minute ago
  • Download: 86575
  • Likes: 4479
  • Dislikes: 3

스프링부트에서 카카오 페이 API 연동하기 – velog

27 thg 2, 2022 — 카카오페이 API 사전설명. 먼저 카카오페이 연동은 request를 2번 보내서 결제요청과 결제승인후 결재내역정보를 받아와야합니다. 그리고 카카오페이 …

  • Source: velog.io
  • Views: 72020
  • Publish date: 20 hours ago
  • Downloads: 98062
  • Likes: 9172
  • Dislikes: 8
  • Title Website: 스프링부트에서 카카오 페이 API 연동하기 – velog
  • Description Website: 27 thg 2, 2022 — 카카오페이 API 사전설명. 먼저 카카오페이 연동은 request를 2번 보내서 결제요청과 결제승인후 결재내역정보를 받아와야합니다. 그리고 카카오페이 …

세부 정보를 보려면 여기를 클릭하십시오.

[JavaScript 기초와 활용 #2] API의 개념과 활용! 카카오 책 검색 기능 구현하기

  • Source: Youtube
  • Views: 98954
  • Date: 6 hours ago
  • Download: 25344
  • Likes: 5815
  • Dislikes: 8

스프링부트에서 카카오 페이 API 연동하기

자꾸 미루고 있었는데 면접준비도 할겸 오늘은 포스팅을 하기로 마음먹었습니다…ㅎㅎ

왜, 어떻게 구현하는지 상세하게 적었으니 빠르게 구현하실분은 그냥 코드부분만 보시면 됩니다.

1. 카카오페이 API 사전설명.

먼저 카카오페이 연동은 request를 2번 보내서 결제요청과 결제승인후 결재내역정보를 받아와야합니다.

그리고 카카오페이와 카카오로그인은 연동하는 방법이 좀 다른데요.

카카오로그인은 ajax로 그냥 클라이언트 js에서 연동시키면 됐는데,

카카오페이는 controller로 값을 보내 클라이언트가 아닌 서버단에서 통신을 해야합니다.

그 이유는 바로 cors정책때문인데요.

cors(Cross-Origin Resource Sharing)

외부서버에 ajax요청을 했을 때 cors라는 Cross-Origin Resource Sharing 정책 위반 이슈가 발생한다.

웹페이지에서 ajax를 동일서버에 요청하는 건 괜찮지만 외부서버에 요청하는 순간

동일 origin이 아니기때문에 이 요청을 거부하는 보안관련 이슈가 생깁니다.

⇒ Q. 카카오로그인은 웹페이지(jsp)에서 외부서버로 ajax요청을 해도 왜 cors 이슈(ajax요청거부)가 나지 않는 걸까요?

cors는 열어놓을 수도 있어서 카카오로그인 api는 웹페이지에서 바로 요청해도 오류가 발생하지 않습니다.

다만, 돈과 관련된 api는 보안이슈로 인해 cors를 닫아놓기때문에 우회해서 요청해야합니다.

cors관련 포스팅

https://evan-moon.github.io/2020/05/21/about-cors/

그럼 cors를 어떻게 우회할까?

웹페이지에서 ajax요청을 우리 서버(동일서버)에 보내고 그 안에있는 contrller 혹은 service에서 외부서버에 요청을 보내서 우회하면 cors에 걸리지 않습니다. 이럴 때 사용하는 것이 HttpUrlConnection객체 / spring을 사용한다면 RestTemplate 객체입니다.

둘 중에 RestTemplate이 좀더 구현하기 편한데 응답으로 받은 json데이터를 바로 자바객체로 변환해주기때문입니다. (응답을 바로 object로 맵핑 시켜줌 ⇒ postForObject)

restTemplate 관련포스팅 https://hyeonyeee.tistory.com/34

2. 카카오 페이 결제 구현과정

자, 카카오페이연동을 어떤 식으로 접근해야할지 알아봤으니 구현해보도록 하겠습니다.

결제과정 3가지

결제요청준비, 결제 요청 결제 승인

아래는 클라이언트-서버-카카오(외부서버) 이 3개가 값을 주고 받는 과정입니다.

1. 클라이언트에서 서버로 주문관련정보를 Post로 던진다.

2. 서버는 controller에서 그 값을 받아 카카오 승인요청url로 던져준다.

3. 카카오는 승인과 동시에 다음 결제과정의 url과 tid(결제코드)을 서버로 던져주고 서버는 클라이언트에 url을 던진다.

4. 클라언트는 그 url로 qr코드 결제 화면에 접근한다.

5. 결제처리가 되면 카카오에서 우리 서버 controller의 결제 url로 token값을 보내준다.

6. 서버는 그 토큰과 처음에 받았던 tid로 결제승인을 요청하고 결재승인 정보를 받아온다.

7. 주문성공페이지 url을 클라이언트에 보내고 클라이언트는 그 페이지를 서버에 요청한다.

8. 서버가 주문완료 페이지를 클라이언트에 보내준다.

자세하게 보면 총 이렇게 8개의 step으로 카카오페이를 구현할 수 있습니다.

주문완료페이지가 없다면 바로 ajax에서 결재내역페이지로 보내셔도 됩니다.

처음엔 이 모든 과정을 controller에서 구현했는데 controller가 너무 복잡해져서 service로 빼내어 리팩토링을 했습니다.

3. ajax, vo, service, controller코드

ajax

$ ( function ( ) { $ ( “#btn-kakao-pay” ) . click ( function ( ) { var name = $ ( “#form-payment input[name=’pay-name’]” ) . val ( ) ; var tel = $ ( “#form-payment input[name=’pay-tel’]” ) . val ( ) ; var email = $ ( “#form-payment input[name=’pay-email’]” ) . val ( ) ; if ( name == “” ) { $ ( “#form-payment input[name=’pay-name’]” ) . focus ( ) } if ( tel == “” ) { $ ( “#form-payment input[name=’pay-tel’]” ) . focus ( ) } if ( email == “” ) { $ ( “#form-payment input[name=’pay-email’]” ) . focus ( ) } let totalPayPrice = parseInt ( $ ( “#total-pay-price” ) . text ( ) . replace ( / , / g , ” ) ) let totalPrice = parseInt ( $ ( “#total-price” ) . text ( ) . replace ( / , / g , ” ) ) let discountPrice = totalPrice – totalPayPrice let usePoint = $ ( “#point-use” ) . val ( ) let useUserCouponNo = $ ( “:radio[name=’userCoupon’]:checked” ) . val ( ) $ . ajax ( { type : ‘get’ , url : ‘/order/pay’ , data : { total_amount : totalPayPrice , payUserName : name , sumPrice : totalPrice , discountPrice : discountPrice , totalPrice : totalPayPrice , tel : tel , email : email , usePoint : usePoint , useCouponNo : useUserCouponNo } , success : function ( response ) { location . href = response . next_redirect_pc_url } } ) } ) } )

VO

vo는 총 3개를 준비해야합니다.

1. 결재요청 vo -> 결재요청할때 사용

package com . hta . lecture . kakaopay ; import lombok . Getter ; import lombok . Setter ; import lombok . ToString ; @Getter @Setter @ToString public class ReadyResponse { private String tid ; private String next_redirect_pc_url ; private String partner_order_id ; }

2. 결재승인요청vo -> 결재승인요청할 때 담아서 보냄.

package com . hta . lecture . kakaopay ; import lombok . Getter ; import lombok . Setter ; import lombok . ToString ; @Getter @Setter @ToString public class ApproveResponse { private String aid ; private String tid ; private String cid ; private String sid ; private String partner_order_id ; private String partner_user_id ; private String payment_method_type ; private String item_name ; private String item_code ; private int quantity ; private String created_at ; private String approved_at ; private String payload ; private Amount amount ; }

3. 결재내역 vo -> 결재내역을 가져올 때 사용.

package com . hta . lecture . kakaopay ; import lombok . Getter ; import lombok . Setter ; import lombok . ToString ; @Getter @Setter @ToString public class Amount { private int total ; private int tax_free ; private int vat ; private int point ; private int discount ; }

Service

@Slf4j @Service public class KakaoPayService { @Autowired private CartMapper cartMapper ; public ReadyResponse payReady ( int totalAmount ) { User user = ( User ) SessionUtils . getAttribute ( “LOGIN_USER” ) ; List < CartDto > carts = cartMapper . getCartByUserNo ( user . getNo ( ) ) ; String [ ] cartNames = new String [ carts . size ( ) ] ; for ( CartDto cart : carts ) { for ( int i = 0 ; i < carts . size ( ) ; i ++ ) { cartNames [ i ] = cart . getClassTitle ( ) ; } } String itemName = cartNames [ 0 ] + " 그외" + ( carts . size ( ) - 1 ) ; log . info ( "강좌이름들:" + itemName ) ; String order_id = user . getNo ( ) + itemName ; MultiValueMap < String , String > parameters = new LinkedMultiValueMap < String , String > ( ) ; parameters . add ( “cid” , “TC0ONETIME” ) ; parameters . add ( “partner_order_id” , order_id ) ; parameters . add ( “partner_user_id” , “inflearn” ) ; parameters . add ( “item_name” , itemName ) ; parameters . add ( “quantity” , String . valueOf ( carts . size ( ) ) ) ; parameters . add ( “total_amount” , String . valueOf ( totalAmount ) ) ; parameters . add ( “tax_free_amount” , “0” ) ; parameters . add ( “approval_url” , “http://localhost/order/pay/completed” ) ; parameters . add ( “cancel_url” , “http://localhost/order/pay/cancel” ) ; parameters . add ( “fail_url” , “http://localhost/order/pay/fail” ) ; log . info ( “파트너주문아이디:” + parameters . get ( “partner_order_id” ) ) ; HttpEntity < MultiValueMap < String , String > > requestEntity = new HttpEntity < > ( parameters , this . getHeaders ( ) ) ; RestTemplate template = new RestTemplate ( ) ; String url = “https://kapi.kakao.com/v1/payment/ready” ; ReadyResponse readyResponse = template . postForObject ( url , requestEntity , ReadyResponse . class ) ; log . info ( “결재준비 응답객체: ” + readyResponse ) ; return readyResponse ; } public ApproveResponse payApprove ( String tid , String pgToken ) { User user = ( User ) SessionUtils . getAttribute ( “LOGIN_USER” ) ; List < CartDto > carts = cartMapper . getCartByUserNo ( user . getNo ( ) ) ; String [ ] cartNames = new String [ carts . size ( ) ] ; for ( CartDto cart : carts ) { for ( int i = 0 ; i < carts . size ( ) ; i ++ ) { cartNames [ i ] = cart . getClassTitle ( ) ; } } String itemName = cartNames [ 0 ] + " 그외" + ( carts . size ( ) - 1 ) ; String order_id = user . getNo ( ) + itemName ; MultiValueMap < String , String > parameters = new LinkedMultiValueMap < String , String > ( ) ; parameters . add ( “cid” , “TC0ONETIME” ) ; parameters . add ( “tid” , tid ) ; parameters . add ( “partner_order_id” , order_id ) ; parameters . add ( “partner_user_id” , “회사명” ) ; parameters . add ( “pg_token” , pgToken ) ; HttpEntity < MultiValueMap < String , String > > requestEntity = new HttpEntity < > ( parameters , this . getHeaders ( ) ) ; RestTemplate template = new RestTemplate ( ) ; String url = “https://kapi.kakao.com/v1/payment/approve” ; ApproveResponse approveResponse = template . postForObject ( url , requestEntity , ApproveResponse . class ) ; log . info ( “결재승인 응답객체: ” + approveResponse ) ; return approveResponse ; } private HttpHeaders getHeaders ( ) { HttpHeaders headers = new HttpHeaders ( ) ; headers . set ( “Authorization” , “KakaoAK 어드민키” ) ; headers . set ( “Content-type” , “application/x-www-form-urlencoded;charset=utf-8” ) ; return headers ; } }

controller

@Autowired는 많아서 생략함.

@Slf4j @Controller @SessionAttributes ( { “tid” , “order” } ) public class OrderController { @GetMapping ( “/order/pay” ) public @ResponseBody ReadyResponse payReady ( @RequestParam ( name = “total_amount” ) int totalAmount , Order order , Model model ) { log . info ( “주문정보:” + order ) ; log . info ( “주문가격:” + totalAmount ) ; ReadyResponse readyResponse = kakaopayService . payReady ( totalAmount ) ; model . addAttribute ( “tid” , readyResponse . getTid ( ) ) ; log . info ( “결재고유 번호: ” + readyResponse . getTid ( ) ) ; model . addAttribute ( “order” , order ) ; return readyResponse ; } @GetMapping ( “/order/pay/completed” ) public String payCompleted ( @RequestParam ( “pg_token” ) String pgToken , @ModelAttribute ( “tid” ) String tid , @ModelAttribute ( “order” ) Order order , Model model ) { log . info ( “결제승인 요청을 인증하는 토큰: ” + pgToken ) ; log . info ( “주문정보: ” + order ) ; log . info ( “결재고유 번호: ” + tid ) ; ApproveResponse approveResponse = kakaopayService . payApprove ( tid , pgToken ) ; Payment payment = Payment . builder ( ) . paymentClassName ( approveResponse . getItem_name ( ) ) . payMathod ( approveResponse . getPayment_method_type ( ) ) . payCode ( tid ) . build ( ) ; orderService . saveOrder ( order , payment ) ; return “redirect:/orders” ; } @GetMapping ( “/order/pay/cancel” ) public String payCancel ( ) { return “redirect:/carts” ; } @GetMapping ( “/order/pay/fail” ) public String payFail ( ) { return “redirect:/carts” ; } }

번외_

한번에 여러개를 결제하는 경우.

카카오페이에서 요청하는 데이터를 보면 item_name은 하나밖에 적을 수가 없어서 상품이 3개일 경우 상품명 그외 2 이런식으로 보내야합니다.

그러면 결제상품 데이터들을 조회하거나 부분 결제취소를 하려면 어떡해해야할까요?

그땐 item_code에 상품코드들을 담아서 보내면 됩니다.

(배열을 string.join()으로 문자열 처리해서 보내고 나중에 값을 받아 다시 배열화 시켜 사용하면 됨)

[배열 → 문자열 /문자열→ 배열 처리 포스팅 | https://tosuccess.tistory.com/198] )

필수요청값은 아니지만 여기에 상품코드들을 담아서 보낸다면, 상품코드들을 받아서 주문상세아이템 테이블에

차곡차곡 저장해주면 됩니다.

저는 장바구니에 저장된 것을 전부 결제하는 방식이라 카트에서 값을 빼왔지만 만일 부분적으로 결제를 하시는 분이라면 저런식으로 값을 보내고 결재정보를 전달받을때 같이 받아서 따로 저장하시면 될 것같습니다.

[Spring Boot] 카카오페이 API – 꿩이야기 – 티스토리

2 thg 12, 2018 — 먼저 Kakao Developers를 참고해야한다. https://developers.kakao.com/docs/restapi/kakaopay-api. 카카오페이 API가 어떤 데이터를 요청받고 주는지에 …

  • Source: scorpio-mercury.tistory.com
  • Views: 98444
  • Publish date: 11 minute ago
  • Downloads: 85093
  • Likes: 4399
  • Dislikes: 6
  • Title Website: [Spring Boot] 카카오페이 API – 꿩이야기 – 티스토리
  • Description Website: 2 thg 12, 2018 — 먼저 Kakao Developers를 참고해야한다. https://developers.kakao.com/docs/restapi/kakaopay-api. 카카오페이 API가 어떤 데이터를 요청받고 주는지에 …

세부 정보를 보려면 여기를 클릭하십시오.

카카오계정으로 로그인하기 (카카오톡 로그인 API 사용하기)

  • Source: Youtube
  • Views: 103741
  • Date: 17 minute ago
  • Download: 55303
  • Likes: 2849
  • Dislikes: 9

[Spring Boot] 카카오페이 API

#[Spring Boot] 카카오페이 API

생각보다 카카오페이 API에 대한 글이 적어서 포스팅을 해보려한다.

스프링 부트에서 카카오페이를 붙이는 데 도움이 되었으면 한다.

본 글은 단건결제 프로세스만 설명할 것이다.

먼저 Kakao Developers를 참고해야한다.

https://developers.kakao.com/docs/restapi/kakaopay-api

카카오페이 API가 어떤 데이터를 요청받고 주는지에 대해 쓰여있다.

—————————————————————————————————————-

먼저 결제준비 단계이다.

request는 카카오페이에서 요구하는 정보이다.

해석해보자면

POST방식으로 https://kapi.kakao.com + /v1/payment/approve란 호스트(url 주소)로

Authorization(권한)과 Content-Type을 보내라는 것이다.

이 부분이 header에 해당되는 내용이고

밑에 있는 키와 설명, 타입으로 되어있는 부분은 body로 보내면 된다.

권한은 어디서 얻을 수 있을까?

먼저, KakaoDevelopers에 로그인을 해야한다.

내 애플리케이션 -> 개요 -> 앱정보 -> 앱 키 표시를 눌렀을 때 나오는

admin 키가 바로 권한 키이다.

주의할 것은 바로 밑 플랫폼에서

다음과 같이 설정해야한다.

—————————————————————————————————————-

kakaoPay.html파일을 만들고 post방식으로 보내는 버튼을 만든다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Insert title here

kakaoPay api 이용하기

Colored by Color Scripter cs

—————————————————————————————————————-

이제 KakaoPay 클래스를 만들어본다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 package org.salem.service; import java.net.URI; import java.net.URISyntaxException; import org.salem.domain.KakaoPayApprovalVO; import org.salem.domain.KakaoPayReadyVO; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import lombok.extern.java.Log; @Service @Log public class KakaoPay { private static final String HOST = “https://kapi.kakao.com” ; private KakaoPayReadyVO kakaoPayReadyVO; public String kakaoPayReady() { RestTemplate restTemplate = new RestTemplate(); // 서버로 요청할 Header HttpHeaders headers = new HttpHeaders(); headers. add ( “Authorization” , “KakaoAK ” + “admin key를 넣어주세요~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !” ); headers. add ( “Accept” , MediaType.APPLICATION_JSON_UTF8_VALUE); headers. add ( “Content-Type” , MediaType.APPLICATION_FORM_URLENCODED_VALUE + “;charset=UTF-8” ); // 서버로 요청할 Body MultiValueMap < String , String > params = new LinkedMultiValueMap < String , String > (); params. add ( “cid” , “TC0ONETIME” ); params. add ( “partner_order_id” , “1001” ); params. add ( “partner_user_id” , “gorany” ); params. add ( “item_name” , “갤럭시S9” ); params. add ( “quantity” , “1” ); params. add ( “total_amount” , “2100” ); params. add ( “tax_free_amount” , “100” ); params. add ( “approval_url” , “http://localhost:8080/kakaoPaySuccess” ); params. add ( “cancel_url” , “http://localhost:8080/kakaoPayCancel” ); params. add ( “fail_url” , “http://localhost:8080/kakaoPaySuccessFail” ); HttpEntity < MultiValueMap < String , String > > body = new HttpEntity < MultiValueMap < String , String > > (params, headers); try { kakaoPayReadyVO = restTemplate.postForObject( new URI(HOST + “/v1/payment/ready” ), body, KakaoPayReadyVO. class ); log.info( “” + kakaoPayReadyVO); return kakaoPayReadyVO.getNext_redirect_pc_url(); } catch (RestClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return “/pay” ; } } Colored by Color Scripter cs

1) cid는 가맹점 코드로 카카오페이에 연락해서 받아야 한다.

Test 코드이므로 TC0ONETIME를 넣었고

실결제를 하려면 카카오페이와 제휴 후 받은 cid 코드를 넣으면 된다.

2) Authorization에 위에서 설명한 admin 키를 넣어야 한다.

3) body 부분에는 내가 결제로 지정할 데이터들을 넣는다.

kakao Developers에 필수라고 써있는 파라미터들은 꼭 넣어줘야한다.

4) HttpEntity> body = new HttpEntity>(params, headers);

hearder와 body를 붙이는 방법이다.

5) kakaoPayReadyVO = restTemplate.postForObject(new URI(HOST + “/v1/payment/ready”), body, KakaoPayReadyVO.class);

RestTemplate을 이용해 카카오페이에 데이터를 보내는 방법이다.

post방식으로 HOST + “/v1/payment/ready”에 body(header+body)정보를 보낸다.

정보를 보내고 요청이 성공적으로 이루어지면 카카오페이에서 응답정보를 보내준다.

KakaoPayReadyVO.class는 응답을 받는 객체를 설정한 것이다.

response로 위와 같은 데이터가 들어오므로 이를 객체로 받기 위한 자바 빈을 만들었다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package org.salem.domain; import java.util.Date; import lombok.Data; @Data public class KakaoPayReadyVO { //response private String tid, next_redirect_pc_url; private Date created_at; } Colored by Color Scripter cs

안드로이드나 ios는 사용하지 않으므로 빼도 상관없다.

6) return kakaoPayReadyVO.getNext_redirect_pc_url();

마지막 return 값으로 redirect url을 불러와 결제가 완료되면 해당 주소로 가게끔 설정해 놓는다.

—————————————————————————————————————-

지금까지 만든 클래스가 잘 작동하도록 controller를 만든다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 package org.salem.controller; import org.salem.service.KakaoPay; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import lombok.Setter; import lombok.extern.java.Log; @Log @Controller public class SampleController { @Setter(onMethod_ = @Autowired) private KakaoPay kakaopay; @GetMapping( “/kakaoPay” ) public void kakaoPayGet() { } @PostMapping( “/kakaoPay” ) public String kakaoPay() { log.info( “kakaoPay post……………………………………..” ); return “redirect:” + kakaopay.kakaoPayReady(); } @GetMapping( “/kakaoPaySuccess” ) public void kakaoPaySuccess(@RequestParam( “pg_token” ) String pg_token, Model model) { log.info( “kakaoPaySuccess get……………………………………..” ); log.info( “kakaoPaySuccess pg_token : ” + pg_token); } } Colored by Color Scripter cs

kakaoPaySuccess.html까지 만들어 놓으면

우선 카카오페이 결제가 정상적으로 작동이 될 것이다.

지금까지는 카카오페이에 “갤럭시S9 제품 2100원 결제해주세요~”라고 요청했을때

카카오페이에서 알아서 결제하도록 만든 것이다.

결제가 완료되면 결제완료 창에

결제가 어떤 방식으로 이루어졌는지?

어떤 카드를 써서 결제를 했는지?

등등 결제정보를 카카오페이에서 받아와야하지 않겠는가?

—————————————————————————————————————-

이제 결제승인 단계로 가본다.

매커니즘은 결제준비 단계와 크게 다르지 않지만

결제완료 후 받아오는 pg_token과 tid가 필수적으로 있어야 한다.

동일하게 KakaoPay 클래스에 kakaoPayInfo메소드를 추가했다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 package org.salem.service; import java.net.URI; import java.net.URISyntaxException; import org.salem.domain.KakaoPayApprovalVO; import org.salem.domain.KakaoPayReadyVO; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import lombok.extern.java.Log; @Service @Log public class KakaoPay { private static final String HOST = “https://kapi.kakao.com” ; private KakaoPayReadyVO kakaoPayReadyVO; private KakaoPayApprovalVO kakaoPayApprovalVO; public String kakaoPayReady() { RestTemplate restTemplate = new RestTemplate(); // 서버로 요청할 Header HttpHeaders headers = new HttpHeaders(); headers. add ( “Authorization” , “KakaoAK ” + ” admin key를 넣어주세요~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ” ); headers. add ( “Accept” , MediaType.APPLICATION_JSON_UTF8_VALUE); headers. add ( “Content-Type” , MediaType.APPLICATION_FORM_URLENCODED_VALUE + “;charset=UTF-8” ); // 서버로 요청할 Body MultiValueMap < String , String > params = new LinkedMultiValueMap < String , String > (); params. add ( “cid” , “TC0ONETIME” ); params. add ( “partner_order_id” , “1001” ); params. add ( “partner_user_id” , “gorany” ); params. add ( “item_name” , “갤럭시S9” ); params. add ( “quantity” , “1” ); params. add ( “total_amount” , “2100” ); params. add ( “tax_free_amount” , “100” ); params. add ( “approval_url” , “http://localhost:8080/kakaoPaySuccess” ); params. add ( “cancel_url” , “http://localhost:8080/kakaoPayCancel” ); params. add ( “fail_url” , “http://localhost:8080/kakaoPaySuccessFail” ); HttpEntity < MultiValueMap < String , String > > body = new HttpEntity < MultiValueMap < String , String > > (params, headers); try { kakaoPayReadyVO = restTemplate.postForObject( new URI(HOST + “/v1/payment/ready” ), body, KakaoPayReadyVO. class ); log.info( “” + kakaoPayReadyVO); return kakaoPayReadyVO.getNext_redirect_pc_url(); } catch (RestClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return “/pay” ; } public KakaoPayApprovalVO kakaoPayInfo( String pg_token) { log.info( “KakaoPayInfoVO……………………………………..” ); log.info( “—————————–” ); RestTemplate restTemplate = new RestTemplate(); // 서버로 요청할 Header HttpHeaders headers = new HttpHeaders(); headers. add ( “Authorization” , “KakaoAK ” + ” admin key를 넣어주세요~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ” ); headers. add ( “Accept” , MediaType.APPLICATION_JSON_UTF8_VALUE); headers. add ( “Content-Type” , MediaType.APPLICATION_FORM_URLENCODED_VALUE + “;charset=UTF-8” ); // 서버로 요청할 Body MultiValueMap < String , String > params = new LinkedMultiValueMap < String , String > (); params. add ( “cid” , “TC0ONETIME” ); params. add ( “tid” , kakaoPayReadyVO.getTid()); params. add ( “partner_order_id” , “1001” ); params. add ( “partner_user_id” , “gorany” ); params. add ( “pg_token” , pg_token); params. add ( “total_amount” , “2100” ); HttpEntity < MultiValueMap < String , String > > body = new HttpEntity < MultiValueMap < String , String > > (params, headers); try { kakaoPayApprovalVO = restTemplate.postForObject( new URI(HOST + “/v1/payment/approve” ), body, KakaoPayApprovalVO. class ); log.info( “” + kakaoPayApprovalVO); return kakaoPayApprovalVO; } catch (RestClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null ; } } Colored by Color Scripter cs

1) kakaoPayApprovalVO = restTemplate.postForObject(new URI(HOST + “/v1/payment/approve”), body, KakaoPayApprovalVO.class);

응답정보를 받기 위해 KakaoPayApprovalVO 클래스를 만든다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package org.salem.domain; import java.util.Date; import lombok.Data; @Data public class KakaoPayApprovalVO { //response private String aid, tid, cid, sid; private String partner_order_id, partner_user_id, payment_method_type; private AmountVO amount; private CardVO card_info; private String item_name, item_code, payload; private Integer quantity, tax_free_amount, vat_amount; private Date created_at, approved_at; } Colored by Color Scripter cs

여기서 amount 와 card_info는 JSONObject로 전송받기 때문에

따로 AmountVO, CardVO라는 객체를 만들어 준다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package org.salem.domain; import lombok.Data; @Data public class AmountVO { private Integer total, tax_free, vat, point, discount; } package org.salem.domain; import lombok.Data; @Data public class CardVO { private String purchase_corp, purchase_corp_code; private String issuer_corp, issuer_corp_code; private String bin, card_type, install_month, approved_id, card_mid; private String interest_free_install, card_item_code; } Colored by Color Scripter cs

—————————————————————————————————————-

Controller에서 model.addAttribute를 이용하여

화면 쪽에 정보를 전송한다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 package org.salem.controller; import org.salem.service.KakaoPay; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import lombok.Setter; import lombok.extern.java.Log; @Log @Controller public class SampleController { @Setter(onMethod_ = @Autowired) private KakaoPay kakaopay; @GetMapping( “/kakaoPay” ) public void kakaoPayGet() { } @PostMapping( “/kakaoPay” ) public String kakaoPay() { log.info( “kakaoPay post……………………………………..” ); return “redirect:” + kakaopay.kakaoPayReady(); } @GetMapping( “/kakaoPaySuccess” ) public void kakaoPaySuccess(@RequestParam( “pg_token” ) String pg_token, Model model) { log.info( “kakaoPaySuccess get……………………………………..” ); log.info( “kakaoPaySuccess pg_token : ” + pg_token); model.addAttribute( “info” , kakaopay.kakaoPayInfo(pg_token)); } } Colored by Color Scripter cs

—————————————————————————————————————-

이제 kakaoPaySuccess.html에 결제승인된 정보를 나타내보자.

Controller에서 보내온 데이터를 Thymeleaf를 이용해 표현했다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 < ! DOCTYPE html > < html xmlns:th = "http://www.thymeleaf.org" > < head > < meta charset = "UTF-8" > < title > Insert title here < / title > < / head > < body > 카카오페이 결제가 정상적으로 완료되었습니다. 결제일시: [[${info.approved_at}]] < br / > 주문번호: [[${info.partner_order_id}]] < br / > 상품명: [[${info.item_name}]] < br / > 상품수량: [[${info.quantity}]] < br / > 결제금액: [[${info.amount.total}]] < br / > 결제방법: [[${info.payment_method_type}]] < br / > < h2 > [[${info}]] < / h2 > < / body > < / html > Colored by Color Scripter cs

결제가 완료되면 화면은 다음과 같이 나올 것이다.

To be continued………

Made by 꿩

카카오페이 결제 API 서비스 적용 – 네이버블로그

15 thg 8, 2021 — 1. 앱키 복사 · ​. 2. 카카오페이 단건 결제 참고 · ​. ​. 3. 연결 · ​. ​. 4. 적용 값들 · 대충 어떤 역할인지 확인하고 필수 항목들 o 되어있는건 다 넣어 …

  • Source: blog.naver.com
  • Views: 82101
  • Publish date: 14 hours ago
  • Downloads: 66779
  • Likes: 4433
  • Dislikes: 6
  • Title Website: 카카오페이 결제 API 서비스 적용 – 네이버블로그
  • Description Website: 15 thg 8, 2021 — 1. 앱키 복사 · ​. 2. 카카오페이 단건 결제 참고 · ​. ​. 3. 연결 · ​. ​. 4. 적용 값들 · 대충 어떤 역할인지 확인하고 필수 항목들 o 되어있는건 다 넣어 …

세부 정보를 보려면 여기를 클릭하십시오.

아임포트로 신용카드 인증결제 연동하기

  • Source: Youtube
  • Views: 32041
  • Date: 18 hours ago
  • Download: 77886
  • Likes: 9637
  • Dislikes: 4

환영합니다! 블로그 아이디가 만들어졌어요.

SpringBoot 카카오페이 결제 API 서비스 적용 YH ・ URL 복사 본문 기타 기능 공유하기 신고하기 1. 앱키 복사 ​ 2. 카카오페이 단건 결제 참고 ​ ​ 3. 연결 URL address = new URL(“https://kapi.kakao.com/v1/payment/ready”); HttpURLConnection connection = (HttpURLConnection) address.openConnection(); // 서버연결 connection.setRequestMethod(“POST”); connection.setRequestProperty(“Authorization”, “KakaoAK 63bd19fc59dc0fc8b0e8cd0d4b0ab64e”); // 어드민 키 connection.setRequestProperty(“Content-type”, “application/x-www-form-urlencoded;charset=utf-8”); connection.setDoOutput(true); // 서버한테 전달할게 있는지 없는지 ​ ​ 4. 적용 값들 대충 어떤 역할인지 확인하고 필수 항목들 o 되어있는건 다 넣어주자 물론 카카오에서 샘플 자료를 올려 놓았다 복사해서 넣기만하자 String parameter = “cid=TC0ONETIME” // 가맹점 코드 + “&partner_order_id=partner_order_id” // 가맹점 주문번호 + “&partner_user_id=partner_user_id” // 가맹점 회원 id + “&item_name=초코파이” // 상품명 + “&quantity=1” // 상품 수량 + “&total_amount=5000” // 총 금액 + “&vat_amount=200” // 부가세 + “&tax_free_amount=0” // 상품 비과세 금액 + “&approval_url=http://localhost:8000/” // 결제 성공 시 + “&fail_url=http://localhost:8000/” // 결제 실패 시 + “&cancel_url=http://localhost:8000/”; // 결제 취소 시 OutputStream send = connection.getOutputStream(); // 이제 뭔가를 를 줄 수 있다. DataOutputStream dataSend = new DataOutputStream(send); // 이제 데이터를 줄 수 있다. dataSend.writeBytes(parameter); // OutputStream은 데이터를 바이트 형식으로 주고 받기로 약속되어 있다. (형변환) dataSend.close(); // flush가 자동으로 호출이 되고 닫는다. (보내고 비우고 닫다) 여기 까지 카카오 개발자 센터의 내용 나머지 로직은 전송 됐는지 안됐는지 결과를 받으면 끝 !! ​ ​ 5. 전체 코드 ​ 5-1. controller ​ @GetMapping(“kakaopay”) @ResponseBody public String kakaopay() { try { // 보내는 부분 URL address = new URL(“https://kapi.kakao.com/v1/payment/ready”); HttpURLConnection connection = (HttpURLConnection) address.openConnection(); // 서버연결 connection.setRequestMethod(“POST”); connection.setRequestProperty(“Authorization”, “KakaoAK 63bd19fc59dc0fc8b0e8cd0d4b0ab64e”); // 어드민 키 connection.setRequestProperty(“Content-type”, “application/x-www-form-urlencoded;charset=utf-8”); connection.setDoOutput(true); // 서버한테 전달할게 있는지 없는지 String parameter = “cid=TC0ONETIME” // 가맹점 코드 + “&partner_order_id=partner_order_id” // 가맹점 주문번호 + “&partner_user_id=partner_user_id” // 가맹점 회원 id + “&item_name=초코파이” // 상품명 + “&quantity=1” // 상품 수량 + “&total_amount=5000” // 총 금액 + “&vat_amount=200” // 부가세 + “&tax_free_amount=0” // 상품 비과세 금액 + “&approval_url=http://localhost:8000/” // 결제 성공 시 + “&fail_url=http://localhost:8000/” // 결제 실패 시 + “&cancel_url=http://localhost:8000/”; // 결제 취소 시 OutputStream send = connection.getOutputStream(); // 이제 뭔가를 를 줄 수 있다. DataOutputStream dataSend = new DataOutputStream(send); // 이제 데이터를 줄 수 있다. dataSend.writeBytes(parameter); // OutputStream은 데이터를 바이트 형식으로 주고 받기로 약속되어 있다. (형변환) dataSend.close(); // flush가 자동으로 호출이 되고 닫는다. (보내고 비우고 닫다) int result = connection.getResponseCode(); // 전송 잘 됐나 안됐나 번호를 받는다. InputStream receive; // 받다 if(result == 200) { receive = connection.getInputStream(); }else { receive = connection.getErrorStream(); } // 읽는 부분 InputStreamReader read = new InputStreamReader(receive); // 받은걸 읽는다. BufferedReader change = new BufferedReader(read); // 바이트를 읽기 위해 형변환 버퍼리더는 실제로 형변환을 위해 존제하는 클레스는 아니다. // 받는 부분 return change.readLine(); // 문자열로 형변환을 알아서 해주고 찍어낸다 그리고 본인은 비워진다. } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return “”; } ​ 5-2. js $(function(){ $(‘#apibtn’).click(function(){ $.ajax({ url:’kakaopay’, dataType:’json’, success:function(data){ // alert(resp.tid); //결제 고유 번호 var box = resp.next_redirect_pc_url; //window.open(box); // 새창 열기 location.href = box; }, error:function(error){ alert(error); } }); }); }); (유지보수를 위해 필자가 사용한 js) 위에랑 다를건 없음 ajax로 통신하는건 똑같으니 아무거나 선택해서 작성 let index = { init:function(){ $(“#btn-kakaopay”).on(“click”, ()=>{ // function(){}를 사용안하고 , ()=>{}를 사용하는 이유는 this를 바인딩하기 위해서 this.kakaopay(); }); }, // 카카오페이 결제 kakaopay:function(){ $.ajax({ url:”kakaopay”, dataType:”json” }).done(function(resp){ if(resp.status === 500){ alert(“카카오페이결제를 실패하였습니다.”) } else{ // alert(resp.tid); //결제 고유 번호 var box = resp.next_redirect_pc_url; //window.open(box); // 새창 열기 location.href = box; } }).fail(function(error){ alert(JSON.stringify(error)); }); }, } index.init(); ​ 5-3 jsp 버튼 만들고 바로 테스트 해보자!! ​ 인쇄

2022.05.29 「결제 API」 – JAVA하는 고구마 개발자

public String kakaoPayReady(OrderReadyDTO orderReadyDTO, UserDTO user) { /* 서버로 요청할 헤더*/ HttpHeaders headers = new HttpHeaders(); setHeaders(headers); order_id = user.getUserId() + orderReadyDTO.getItem_name(); userId = user.getUserId(); itemName = orderReadyDTO.getItem_name(); totalAmount = orderReadyDTO.getTotal_Amount(); /* 서버로 요청할 body */ MultiValueMap params = new LinkedMultiValueMap<>(); setParams(params); params.add(“partner_order_id”, order_id); params.add(“partner_user_id”, userId); params.add(“item_name”, itemName); params.add(“quantity”, String.valueOf(orderReadyDTO.getQuantity())); params.add(“total_amount”, String.valueOf(totalAmount)); params.add(“tax_free_amount”, String.valueOf(TAX_FREE_AMOUNT)); return getUrl(headers, params); }

private String getUrl(HttpHeaders headers, MultiValueMap params) { HttpEntity> body = new HttpEntity<>(params, headers); try { /* 서버 요청 후 응답 객체 받기 */ kakaoPayReadyVO = restTemplate.postForObject(new URI(HOST + KAKAO_PAY_READY), body, KakaoPayReadyVO.class); return kakaoPayReadyVO != null ? kakaoPayReadyVO.getNext_redirect_pc_url() : null; } catch (RestClientException e) { log.error(e.getMessage()); } catch (URISyntaxException e) { log.error(e.getMessage()); } return null; }

public class KakaoPayReadyVO { private String tid, next_redirect_pc_url; private Date created_at; @ConstructorProperties({“tid”,”next_redirect_pc_url”,”created_at”}) public KakaoPayReadyVO(String tid, String next_redirect_pc_url, Date created_at) { this.tid = tid; this.next_redirect_pc_url = next_redirect_pc_url; this.created_at = created_at; }

29 thg 5, 2022 — 장바구니 crud 작업한 것을 수정 및 테스트를 이번 주에 끝내고 나서, 뒤늦게 결제 API를 설계하기 시작했다. 카카오 페이 API를 사용해서 해보려고 …

  • Source: sweeeetgoguma.tistory.com
  • Views: 87914
  • Publish date: 13 hours ago
  • Downloads: 58632
  • Likes: 9984
  • Dislikes: 10
  • Title Website: 2022.05.29 「결제 API」 – JAVA하는 고구마 개발자
  • Description Website: 29 thg 5, 2022 — 장바구니 crud 작업한 것을 수정 및 테스트를 이번 주에 끝내고 나서, 뒤늦게 결제 API를 설계하기 시작했다. 카카오 페이 API를 사용해서 해보려고 …

세부 정보를 보려면 여기를 클릭하십시오.

[카카오페이 사례] EKS + NLB + Istio 을 통한 고가용성 API Gateway 구축하기 – 조지훈, 카카오페이 | AWS Innovate – 현대적 앱 특집

  • Source: Youtube
  • Views: 10076
  • Date: 35 minute ago
  • Download: 48063
  • Likes: 1705
  • Dislikes: 3

2022.05.29 「결제 API」

장바구니 crud 작업한 것을 수정 및 테스트를 이번 주에 끝내고 나서, 뒤늦게 결제 API를 설계하기 시작했다. 카카오 페이 API를 사용해서 해보려고 하는데, 생각만큼 쉽지 않았다. 어디서 본 건데 만들어진 API를 가져와서 쓰는 것도 능력이라고..ㅋㅋ

그래도 해야지 어쩌겠나.

카카오 페이 API 문서를 보니 되게 다양한 API를 소개해 놓았다. 결제 요청도 보안상 서버를 통해 요청을 해야 된다고 한다. 그리고 넘겨 주고 받는 파라미터도 굉장히 많다. 실거래를 위해 만들어진 API라 확실히 다르긴 하다.

개인적인 프로젝트 수준에서 테스트 결제를 위해 필요한 데이터를 추리는 작업은 참 골치 아픈 일인 것 같다.

일단 결제 요청 부터 시작하기로 결정했다. 내가 설계한 프로젝트에서는 크게 보면 두 가지 종류의 결제가 있는데 첫 째는 단건 결제이고, 두 번째는 장바구니 상품 결제이다.

그렇게 kakao api를 이용해서 결제 요청을 구현한 과정을 나열해보겠다.

카카오 페이 API 공식 문서

https://developers.kakao.com/docs/latest/ko/kakaopay/common

보다 보면 다양한 기능들이 있다. 필요한 걸 골라 쓰면 될 것 같다.

분석하면서 이 API를 만든 사람들이 정말 대단하다고 느꼈다.

DB 설계 여부

기존에는 DB 설계를 하려고 했었다.

주문, 결제 데이터를 보관하여 이용하려 했으나, 카카오 페이에서 결제 건에 대한 정보를 조회할 수 있게 해 준다.

그래서 DB 설계를 따로 하지 않았다.

(근데 문제가 생겼다. 즉각적인 결제 건에 대한 정보만 일회성으로 제공되는 것이다.. 알바 다녀와서 주문 조회까지 만들어야겠다..!)

단건 결제

제목과 그대로 단일 상품 주문 및 결제 요청 API를 설계한다.

카카오 페이 rest Api를 통해 결제를 하기 때문에 자체적으로 넘겨줄 데이터를 받는 api를 설계해야 한다.

단건 결제 건인데도 넘겨줄 데이터가 참 많다.

프로젝트를 보니 대부분 사람들은 프런트를 같이 하며 ajax나 프론트 엔진을 이용해 쉽게 넘겨주는데 나는 rest api만 설계하다 보니 postman으로 직접 json을 만들어서 넘겨주는 게 참 골치 아픈 일이었다.

결제 로직 (내가 생각한 rest api 설계 시 흐름도)

클라이언트를 제외한 흐름도를 생각했다.

1. 결제 준비

클라이언트 (postman으로 json 요청) => local host server(header, body) => kakao pay server

2. 카카오 페이 서버의 응답

kakao pay server (응답 객체) => localhost server (결제 요청 url) => 클라이언트에게 url 데이터로 응답 (postman)

3. 클라이언트(postman or chrome 브라우저)가 결제 요청

클라이언트 url 요청 => kakao pay server 응답(qr 코드 or 전화번호)

4. 결제 처리

qr 코드로 핸드론으로 테스트 결제 처리

5. 결제 데이터를 응답

kakao pay server (결제 정보를 가진 url로 리다이렉트 응답) : 자동 요청 이므로 이 주소를 가져다가 postman에서 다시 요청해야 한다.

6. url을 postman으로 요청

클라이언트 (postman) => localhost => kakao pay server

7. 결제 정보를 응답

kakao pay server (응답 객체) => localhost => 클라이언트 데이터 응답

카카오 페이 서버에 Request 요청

넘겨줄 데이터는 친절히 명시해 놓았다. 그거에 맞춰서 헤더와 바디를 적절히 넣어 post 방식으로 서버에 요청하면 될 것 같다.

public String kakaoPayReady(OrderReadyDTO orderReadyDTO, UserDTO user) { /* 서버로 요청할 헤더*/ HttpHeaders headers = new HttpHeaders(); setHeaders(headers); order_id = user.getUserId() + orderReadyDTO.getItem_name(); userId = user.getUserId(); itemName = orderReadyDTO.getItem_name(); totalAmount = orderReadyDTO.getTotal_Amount(); /* 서버로 요청할 body */ MultiValueMap params = new LinkedMultiValueMap<>(); setParams(params); params.add(“partner_order_id”, order_id); params.add(“partner_user_id”, userId); params.add(“item_name”, itemName); params.add(“quantity”, String.valueOf(orderReadyDTO.getQuantity())); params.add(“total_amount”, String.valueOf(totalAmount)); params.add(“tax_free_amount”, String.valueOf(TAX_FREE_AMOUNT)); return getUrl(headers, params); }

private String getUrl(HttpHeaders headers, MultiValueMap params) { HttpEntity> body = new HttpEntity<>(params, headers); try { /* 서버 요청 후 응답 객체 받기 */ kakaoPayReadyVO = restTemplate.postForObject(new URI(HOST + KAKAO_PAY_READY), body, KakaoPayReadyVO.class); return kakaoPayReadyVO != null ? kakaoPayReadyVO.getNext_redirect_pc_url() : null; } catch (RestClientException e) { log.error(e.getMessage()); } catch (URISyntaxException e) { log.error(e.getMessage()); } return null; }

메서드가 중복이 많이 되어서 축약을 했는데 이런 식으로 헤더와 바디 객체를 담아 uri를 생성 후 restTemplate의 postForObject 메서드를 통해 카카오 페이 서버로 요청을 하면

=> (밑에까지 엄청 많다..) 이런 식으로 값을 객체로 넘겨준다.

public class KakaoPayReadyVO { private String tid, next_redirect_pc_url; private Date created_at; @ConstructorProperties({“tid”,”next_redirect_pc_url”,”created_at”}) public KakaoPayReadyVO(String tid, String next_redirect_pc_url, Date created_at) { this.tid = tid; this.next_redirect_pc_url = next_redirect_pc_url; this.created_at = created_at; }

=> 결제 준비 넘겨받을 객체

이하 알바 다녀와서 쓰자

리팩토링!

https://sweeeetgoguma.tistory.com/entry/%EA%B2%B0%EC%A0%9C-API-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81-1-feat-%EC%A0%84%EB%9E%B5-%ED%8C%A8%ED%84%B4

3-1 카카오 결제 API (iamport를 활용한 결제API)

kakopay 결제API 구매부분은 다른 팀원의 부분이고 신용카드결제를 구현하셨다 나는 간단하게 결제되는 카카오페이를 구현하고싶어서 따로 해보았다 QR코드와 전화번호로 결제 둘 다 가능하다

iamport script를 꼭 삽입하고 데이터를 불러와 아래 script에 가맹점 식별코드, 정보등을 넣어준다

31 thg 1, 2021 — kakopay 결제API. 구매부분은 다른 팀원의 부분이고 신용카드결제를 구현하셨다; 나는 간단하게 결제되는 카카오페이를 구현하고싶어서 따로 해보았다.

  • Source: wogus789789.tistory.com
  • Views: 12812
  • Publish date: 28 minute ago
  • Downloads: 44948
  • Likes: 3640
  • Dislikes: 4
  • Title Website: 3-1 카카오 결제 API (iamport를 활용한 결제API)
  • Description Website: 31 thg 1, 2021 — kakopay 결제API. 구매부분은 다른 팀원의 부분이고 신용카드결제를 구현하셨다; 나는 간단하게 결제되는 카카오페이를 구현하고싶어서 따로 해보았다.

세부 정보를 보려면 여기를 클릭하십시오.

(38) flutter tutorial KakaO Pay : 카카오 페이 직접 연결 REST API

  • Source: Youtube
  • Views: 88260
  • Date: 30 minute ago
  • Download: 35232
  • Likes: 7536
  • Dislikes: 7

3-1 카카오 결제 API (iamport를 활용한 결제API)

kakopay 결제API 구매부분은 다른 팀원의 부분이고 신용카드결제를 구현하셨다 나는 간단하게 결제되는 카카오페이를 구현하고싶어서 따로 해보았다 QR코드와 전화번호로 결제 둘 다 가능하다

먼저 결제 API를 이용하기위해서는 등록을 해야한다

admin.iamport.kr/

여기서 가입> 로그인을 먼저하고

가맹점 식별코드 확인

이부분을 몰라서 좀 헤맸다

사진처럼 해주면 된다

iamport script를 꼭 삽입하고 데이터를 불러와 아래 script에 가맹점 식별코드, 정보등을 넣어준다

PG사가 다양하게 많으니 비슷한 방법으로 API를 적용시킬 수 있다

이 API는 개발테스트를 위한 것이고 실제 카카오페이를 사용하려면 이용료를 내야한다.

테스트를 위하여 결제를 완료해도 돈은 나가지않으니 안심해도 된다

카카오페이 인증 API – kakaoCert

별도 프로그램 설치없이 카카오톡 인증서만으로 다양한 인증서비스를 기업들의 시스템에 연동하여 사용하실 수 있도록 API를 제공합니다.

API 연동 이용자 서비스 이용 이용기관 1카카오페이 인증 요청 4인증 결과값 전달 2카카오톡 발송 3인증 완료

* 전자등기 서비스는 인증 후 문서 유통정보가 한국인터넷진흥원(KISA) 유통체계 시스템에 등록됩니다.

카카오페이 인증 API 연동서비스 ,

kakaoCert는 별도 프로그램 설치없이 카카오톡 인증서만으로 다양한 카카오페이 인증서비스를 기업들의 시스템에 연동하여 사용할 수 있도록 API를 제공합니다.

  • Source: www.kakaocert.com
  • Views: 73724
  • Publish date: 2 hours ago
  • Downloads: 32752
  • Likes: 487
  • Dislikes: 10
  • Title Website: 카카오페이 인증 API – kakaoCert
  • Description Website: kakaoCert는 별도 프로그램 설치없이 카카오톡 인증서만으로 다양한 카카오페이 인증서비스를 기업들의 시스템에 연동하여 사용할 수 있도록 API를 제공합니다.

세부 정보를 보려면 여기를 클릭하십시오.

Kakao API Javascript SDK #1편 | Daily Log – 개발노트 일상 \u0026 프로그래밍 편 | 카카오 API 로그인 구현 | REST API = 2편

  • Source: Youtube
  • Views: 101196
  • Date: 52 minute ago
  • Download: 56511
  • Likes: 6155
  • Dislikes: 2

카카오페이 인증 API

카카오페이 인증 API 연동서비스 ,

별도 프로그램 설치없이 카카오톡 인증서만으로 다양한 인증서비스를 기업들의 시스템에 연동하여 사용하실 수 있도록 API를 제공합니다.

API 연동 이용자 서비스 이용 이용기관 1카카오페이 인증 요청 4인증 결과값 전달 2카카오톡 발송 3인증 완료

* 전자등기 서비스는 인증 후 문서 유통정보가 한국인터넷진흥원(KISA) 유통체계 시스템에 등록됩니다.

주제에 대한 관련 정보 카카오 페이 api

Bing에서 카카오 페이 api 주제에 대한 최신 정보를 볼 수 있습니다.


주제에 대한 기사 보기를 마쳤습니다 카카오 페이 api. 이 기사가 유용했다면 공유하십시오. 매우 감사합니다. 사람들이 이 주제와 관련하여 자주 검색하는 키워드: 카카오 페이 api 카카오페이 api 예제, 카카오페이 api 테스트, 카카오페이 api javascript, 카카오페이 api 수수료, 카카오페이 api 구현, 안드로이드 카카오페이 api, 스프링 카카오페이 api 예제, 스프링 부트 카카오페이 API

Leave a Comment